33 votes

Existe-t-il un moyen de savoir si un programme Java a été démarré à partir de la ligne de commande ou d'un fichier jar?

Je souhaite afficher un message dans la console ou une fenêtre contextuelle, donc si un paramètre n'est pas spécifié, je veux savoir à qui dois-je afficher

Quelque chose comme:

 if( !file.exists() ) {
    if( fromCommandLine()){
        System.out.println("File doesn't exists");
    }else if ( fromDoubleClickOnJar() ) {
        JOptionPane.showMessage(null, "File doesn't exists");
    }
 }
 

18voto

Stephen C Points 255558

Le direct réponse est que vous ne pouvez pas dire comment la JVM a été lancé.

Mais pour l'exemple de cas d'utilisation dans votre question, vous n'avez pas vraiment besoin de savoir comment la JVM a été lancé. Ce que vous avez vraiment besoin de savoir, c'est si l'utilisateur voit un message écrit à la console. Et la façon de le faire serait quelque chose comme ceci:

if (!file.exists()) {
    Console console = System.console();
    if (console != null) {
        console.format("File doesn't exists%n");
    } else if (!GraphicsEnvironment.isHeadless()) {
        JOptionPane.showMessage(null, "File doesn't exists");
    } else {
        // Put it in the log
    }
 }

La javadoc de la Console, tout n'est pas étanche à l'eau, fortement allusions objet de Console (si elle existe) écrit dans une console et ne peut pas être redirigé.

Merci @Stephen Denne pour l' !GraphicsEnvironment.isHeadless() astuce.

4voto

Chuk Lee Points 2438

Je ne suis pas clair sur la question mais je vais l'interpréter comme vous voulez différencier les 2 suivants

java -jar fred.jar

et

package java.

Voici un aperçu du programme

 import sun.jvmstat.monitor.*;
...
HostIdentifier hostId = new HostIdentifier("localhost");
MonitoredHost monitoredHost = MonitoredHost.getMonitoredHost(hostId);
Set jvms = monitoredHost.activeVms();
for (Object i: jvms) {
   VmIdentifier id = new VmIdentifier("//" + i + "?mode=r");
   MonitoredVm vm = monitoredHost.getMonitoredVm(id, 0);   
   System.out.println(i);
   System.out.println("\t main class: " + MonitoredVmUtil.mainClass(vm, false));
   System.out.println("\t main args: " + MonitoredVmUtil.mainArgs(vm));
   System.out.println("\t jvmArgs: " + MonitoredVmUtil.jvmArgs(vm));
   monitoredHost.detach(vm);
}
 

L'appel MonitoredVmUtil.mainClass(vm, false) renverra ' jar ' ou le nom de votre classe principale, par exemple Main .

Vous devez utiliser $JAVA_HOME/lib/tools.jar pour compiler et exécuter.

3voto

OscarRyz Points 82553

L' System.getConsole() astuce semble faire le travail.

Voici une autre: il y a une méthode dans la classe Class getProtectionDomain() qui peut être utilisé pour connaître la source du code le l'emplacement à partir de là.

Le plus drôle est, cette méthode est disponible depuis la version 1.2

Je savais que j'ai utilisé avant, voici la réponse originale à cette question par erickson

Voici la preuve de concept:

public class FromJar {
    public static void main( String [] args ) {
        if ( FromJar.class
                 .getProtectionDomain()
                 .getCodeSource()
                 .getLocation()
                 .getFile()
                 .endsWith(".jar") ) {

            javax.swing.JOptionPane.showMessageDialog( null, "Launched from Jar" );

       } else {
            System.out.println("Launched NOT from Jar :P ");
       }
    }
}

Voici un court ( 1m environ ) vidéo à voir ce code en cours d'exécution ( et écrit avec chat, :-o )

Youtube video

2voto

schastar Points 161

Vous pouvez essayer avec:

 if (System.console() != null) {
    // Console attached to the JVM: command prompt output
    System.out.println("...");
} else {
    // No console: use Swing
}
 

0voto

Sijin Points 3682

Depuis http://java.itags.org/java-essentials/15972/

 try {
    GraphicsEnvironment.getLocalGraphicsEnvironment();
} catch(Throwable ex) {
    System.out.println("No graphical environment is available.");
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X