Posso descobrir se o programa Java foi lançado usando Java ou Javaw
Pergunta
Isso está relacionado a uma pergunta anterior de um usuário diferente, perguntando Como detectar esse código está em execução dentro do eclipse ide.
Percebi que o Eclipse sempre lança programas com javaw
ao invés de java
. (Isso não implica um programa lançado com javaw
foi lançado a partir do eclipse).
Eu posso encontrar os argumentos aprovados usando
RuntimeMXBean RuntimemxBean = ManagementFactory.getRuntimeMXBean();
List<String> lst = RuntimemxBean.getInputArguments();
for (int i = 0; i < lst.size(); i++)
System.out.println(lst.get(i));
Mas isso não me diz se foi lançado usando java
ou javaw
.
- Existe alguma maneira de descobrir se foi lançado usando
java
oujavaw
? - Por que o eclipse usa
javaw
Para lançar programas?
Solução
System.Console () retornará null
, já que a única diferença entre usar java
e javaw
é isso para javaw
, não há janela de console associada.
Aqui está um pequeno programa de teste que você pode usar para demonstrar que:
import javax.swing.JOptionPane;
public class ConsoleTest {
public static void main(String[] args) {
if (System.console() == null) {
JOptionPane.showMessageDialog(null, "System.console() is null");
} else {
JOptionPane.showMessageDialog(null, "System.console() is not null");
}
}
}
No entanto, ao fugir de dentro do eclipse, System.console()
ainda voltará null
, mesmo quando começou com java
.
Na configuração de lançamento do Eclipse, Jre Tab, se você alterar o tempo de execução JRE para JRE alternativo, você pode alterar o executável Java de javaw
para java
.
Outras dicas
Procurando por System.Console () não funcionou para mim, por causa de:
- Requer JDK 6 ou mais tarde
- Objeto de console também está faltando, se a aplicação foi executada através do RUNTIME.EXEC (String) método. Isso foi fundamental para mim, porque usamos muito script automatizado.
Então, estou usando a solução seguinte:
private static boolean isJavaw() {
try {
System.in.available();
return false;
} catch (IOException e) {
// invalid handle in case of javaw
return true;
}
}
Funciona bem com os JDKs 5, 6 e 7.
Existe alguma maneira de descobrir se foi lançado usando Java ou Javaw?
De acordo com documentação: O comando Javaw é idêntico ao Java, exceto que, com Javaw, não há janela de console associada. Use Javaw quando não quiser que uma janela de prompt de comando apareça. O Javaw Launcher, no entanto, exibirá uma caixa de diálogo com informações de erro se um lançamento falhar por algum motivo.
Por que o Eclipse usa o Javaw para lançar programas?
Mudar de Javaw para Java:
- Abra sua configuração de lançamento escolhendo 'Run'-> 'Run ...' na barra de menus.
- Selecione a configuração de lançamento do seu aplicativo.
- Mude para a página 'Jre'.
- Desmarcar 'Use o executável Java padrão'
- Digite 'Java' no lugar de 'Javaw'.
Eu acho que porque os desenvolvedores do Eclipse desenvolvem aplicativos de GUI e eles não precisam de janela do console.