2010-03-18 21 views
8

Questo è correlato a una domanda precedente di un utente diverso, chiedendo How to detect that code is running inside eclipse IDE.Posso scoprire se il programma java è stato avviato utilizzando java o javaw

Ho notato che Eclipse avvia sempre programmi con javaw anziché java. (Ciò non implica che un programma lanciato con javaw sia stato lanciato da Eclipse).

posso trovare gli argomenti passati usando

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

Ma questo non mi dice se è stato lanciato utilizzando java o javaw.

  1. Esiste un modo per scoprirlo se è stato lanciato utilizzando java o javaw?
  2. Perché Eclipse utilizza javaw per avviare programmi?

risposta

6

System.console() tornerà null, dal momento che l'unica differenza tra l'utilizzo java e javaw è che per javaw, non v'è alcuna finestra di console associata.

Ecco un piccolo programma di test è possibile utilizzare per dimostrare che:

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"); 
     } 
    } 
} 

Tuttavia, durante l'esecuzione all'interno di Eclipse, System.console() sarà ancora tornare null, anche quando è iniziato con java.

In configurazione di lancio di Eclipse, scheda JRE, se si modifica il Runtime JRE per JRE alternativo, è possibile quindi modificare l'eseguibile Java javaw-java.

+0

? È ancora possibile scrivere sui flussi di output standard, sarà semplicemente silenziato dal sistema operativo su/dev/null o su qualsiasi altro stream a cui è stato collegato utilizzando il comando di avvio. Stessa cosa con i flussi di input, è possibile avviare qualcosa con input javaw e pipe, ad esempio un file o un altro stream. – jwenting

+0

@jwenting, sì, è ancora possibile scrivere su System.out anche se System.console() restituisce null. –

+0

Apparentemente (almeno in java 7), se si esegue in riga di comando reindirizzando l'output su un file, anche 'System.console()' è nullo. –

1

C'è un modo per scoprire se è stato avviato utilizzando java o javaw?

Secondo lo documentation: Il comando javaw è identico a java, tranne che con javaw non è presente una finestra della console associata. Usa javaw quando non vuoi che appaia una finestra del prompt dei comandi. Tuttavia, il programma di avvio di javaw visualizzerà una finestra di dialogo con informazioni di errore se un lancio non riesce per qualche motivo.

Perché eclipse utilizza javaw per avviare i programmi?

  1. Per passare da javaw a java:

    1. Aprire la configurazione di lancio, scegliendo 'Run' -> 'Esegui ...' dal menu bar.
    2. Seleziona la configurazione di avvio dell'applicazione.
    3. Passare alla pagina 'JRE'.
    4. Deseleziona 'Usa eseguibile Java predefinito'
    5. Digitare 'java' al posto di 'javaw'.
  2. Penso che gli sviluppatori di Eclipse sviluppano applicazioni GUI e non hanno bisogno della finestra della console.

4

Controllo per System.console() non ha funzionato per me, a causa di:

  1. Si richiede JDK 6 o successivo
  2. oggetto Console manca anche, se l'applicazione è stata eseguita con il metodo Runtime.exec(String). Questo è stato fondamentale per me, perché usiamo un sacco di script automatici.

Così sto usando seguente soluzione:

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

funziona bene con JDK 5, 6 e 7.

Sarà
Problemi correlati