2010-03-18 17 views
8

Esto está relacionado con una pregunta anterior de un usuario diferente, que pregunta How to detect that code is running inside eclipse IDE.¿Puedo averiguar si el programa java se inició utilizando java o javaw

Me di cuenta de que Eclipse siempre inicia programas con javaw en lugar de java. (Esto no implica que un programa lanzado con javaw se lanzó desde Eclipse).

puedo encontrar los argumentos que se pasan usando

RuntimeMXBean RuntimemxBean = ManagementFactory.getRuntimeMXBean(); 
List<String> lst = RuntimemxBean.getInputArguments(); 
for (int i = 0; i < lst.size(); i++) 
    System.out.println(lst.get(i)); 

Pero esto no me dice si fue lanzado usando java o javaw.

  1. ¿Hay alguna manera de averiguarlo si se puso en marcha utilizando java o javaw?
  2. ¿Por qué Eclipse usa javaw para iniciar programas?

Respuesta

6

System.console() volverá null, ya que la única diferencia entre el uso java y javaw es que para javaw, no hay ninguna ventana de la consola asociada.

Aquí es un pequeño programa de prueba se puede utilizar para demostrar 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"); 
     } 
    } 
} 

Sin embargo, cuando se ejecuta desde dentro de Eclipse, System.console() se sigue volver null, incluso cuando comenzó con java.

En configuración de lanzamiento de Eclipse, ficha JRE, si cambia el tiempo de ejecución de JRE a JRE alternativo, a continuación, puede cambiar el ejecutable de Java javaw-java.

+0

? Aún puede escribir en las secuencias de salida estándar, el sistema operativo lo dirigirá silenciosamente a/dev/null o a cualquier otra secuencia que haya conectado mediante el comando de ejecución. Lo mismo con los flujos de entrada, puede ejecutar algo con javaw y entrada de canal desde un archivo u otro flujo. – jwenting

+0

@jwenting, sí, aún puede escribir en System.out aunque System.console() devuelva null. –

+0

Aparentemente (al menos en java 7), si ejecuta en la línea de comando redirigiendo la salida a un archivo, 'System.console()' también es nulo. –

1

¿Hay alguna forma de averiguar si se inició con java o javaw?

Según la documentation: El comando javaw es idéntica a la de Java, con la excepción de que javaw no hay ninguna ventana de la consola asociada. Use javaw cuando no quiera que aparezca una ventana del símbolo del sistema. Sin embargo, javaw launcher mostrará un cuadro de diálogo con información de error si un lanzamiento falla por alguna razón.

¿Por qué eclipse utiliza javaw para iniciar programas?

  1. para cambiar de javaw a java:

    1. Abra su configuración de lanzamiento con la opción 'Ejecutar' -> 'Ejecutar ...' en el barra de menú.
    2. Seleccione la configuración de inicio de su aplicación.
    3. Cambie a la página 'JRE'.
    4. Deseleccione 'Usar el ejecutable predeterminado de Java'
    5. Escriba 'java' en lugar de 'javaw'.
  2. Creo que porque los desarrolladores de eclipse desarrollan aplicaciones de GUI y no necesitan ventana de consola.

4

Comprobación de System.console() no funcionó para mí, debido a:

  1. Se requiere JDK 6 o posterior
  2. objeto Console también falta, si la aplicación se llevó a cabo a través del método Runtime.exec(String). Esto fue crítico para mí, porque utilizamos una gran cantidad de secuencias de comandos automatizadas.

Así que estoy usando siguiente solución:

private static boolean isJavaw() { 
    try { 
    System.in.available(); 
    return false; 
    } catch (IOException e) { 
    // invalid handle in case of javaw 
    return true; 
    } 
} 

funciona bien con JDK 5, 6 y 7.

va a
Cuestiones relacionadas