Существует ли способ знать, была ли программа Java запущена из командной строки или из файла банки?

Я хочу или отобразить сообщение в консоли или всплывающее окно, поэтому в случае, если параметр не указан, я хочу знать, к которому должен я отображаться

Что-то как:

if( !file.exists() ) {
    if( fromCommandLine()){
        System.out.println("File doesn't exists");
    }else if ( fromDoubleClickOnJar() ) {
        JOptionPane.showMessage(null, "File doesn't exists");
    }
 }
33
задан Peter Lang 20 May 2010 в 06:52
поделиться

7 ответов

Прямой ответ заключается в том, что вы не можете сказать, как была запущена JVM.

Но для примера использования в вашем вопросе вам действительно не нужно знать, как была запущена JVM. На самом деле вам нужно знать, увидит ли пользователь сообщение, написанное на консоли. И способ сделать это будет примерно так:

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
    }
 }

Документ javadoc для Console хоть и не герметичен, но сильно намекает на то, что объект Console (если он существует) записывает в консоль и не может быть перенаправлен .

Спасибо @Stephen Denne за совет ! GraphicsEnvironment.isHeadless () .

18
ответ дан 27 November 2019 в 19:32
поделиться

Уловка System.console () , похоже, работает.

Вот альтернатива: в классе Class getProtectionDomain () есть метод, который можно использовать для определения источника кода и его местоположения.

Забавно то, что этот метод доступен с версии 1.2

Я знал, что использовал его раньше, вот исходный ответ Эриксон

Вот доказательство концепции:

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

Вот короткое (около 1 м) видео, чтобы увидеть, как этот код работает (и записывается с помощью cat : -o)

Youtube video

3
ответ дан 27 November 2019 в 19:32
поделиться

Я не совсем понимаю этот вопрос, но я собираюсь интерпретировать его так, как вы хотите различать следующие 2

java -jar fred.jar

и

java package.Main

Вот схема программы

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

Вызов MonitoredVmUtil.mainClass (vm, false) либо вернет ' jar ', либо имя вашего основного класса, например Main .

Для компиляции и запуска необходимо использовать $ JAVA_HOME / lib / tools.jar .

4
ответ дан 27 November 2019 в 19:32
поделиться

Вы можете попробовать:

if (System.console() != null) {
    // Console attached to the JVM: command prompt output
    System.out.println("...");
} else {
    // No console: use Swing
}
1
ответ дан 27 November 2019 в 19:32
поделиться

Из http://java.itags.org/java-essentials/15972/

try {
    GraphicsEnvironment.getLocalGraphicsEnvironment();
} catch(Throwable ex) {
    System.out.println("No graphical environment is available.");
}
0
ответ дан 27 November 2019 в 19:32
поделиться

Верно, что невозможно сказать, как была вызвана JVM. но ... есть способ обойти это стороной. вы предположили, что когда пользователь дважды щелкает JAR, запускается графический интерфейс ... Ok. так что давайте расширим это предположение. проверьте .. откуда был вызван класс, каталог. проверьте этот каталог .. предполагая, что это нормальное использование, когда есть файл * .jar, тогда пользователь должен запустить приложение из jar .. но один недостаток заключается в том, что пользователь также может щелкнуть по основному файлу класса. хахахаха

0
ответ дан 27 November 2019 в 19:32
поделиться

Вы можете получить все входные аргументы с помощью RuntimeMBean.getInputArguments(), это можно использовать для определения, когда включена отладка.

EDIT: Однако аргумент -jar не является одним из них. :(

0
ответ дан 27 November 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: