Есть ли способ узнать, была ли программа Java запущена из командной строки или из файла jar?
Я хочу либо отобразить сообщение в консоли, либо всплывающее окно, поэтому, если параметр не указан, я хочу знать, к которому я должен отображать
что-то типа:
if( !file.exists() ) {
if( fromCommandLine()){
System.out.println("File doesn't exists");
}else if ( fromDoubleClickOnJar() ) {
JOptionPane.showMessage(null, "File doesn't exists");
}
}
7 ответов
прямой ответ заключается в том, что вы не можете сказать, как была запущена JVM.
но для примера использования в вашем вопросе вам действительно не нужно знать, как была запущена JVM. Что ты!--5-->действительно нужно знать, будет ли пользователь видеть сообщение, написанное на консоль. А сделать это можно было бы примерно так:--3-->
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 для консоль, пока не вода плотная, сильно намекает что консоль объект (если он существует) записывается в консоль и не может быть перенаправлен.
спасибо @Stephen Denne за !GraphicsEnvironment.isHeadless()
совет.
Я не совсем понимаю вопрос, но я собираюсь интерпретировать его так, как вы хотите различать следующие 2
java-jar fred.Джар
и
пакета java.Главная
вот линия контура программы
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
для компиляции и запуска.
на System.console()
трюк, кажется, делает работу.
вот альтернатива: есть метод в классе Class
getProtectionDomain() который может быть использован, чтобы знать источник кода местоположение оттуда.
самое смешное, что этот метод доступен с 1.2
Я знал, что использовал это раньше, вот оригинальный ответ by Эриксон
вот доказательство концепция:
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 ");
}
}
}
вот короткое ( 1M aprox ) видео, чтобы увидеть этот код работает (и пишется с кошки : - o)
Youtube видео http://img237.imageshack.us/img237/4301/capturadepantalla201005j.png
вы можете попробовать с:
if (System.console() != null) {
// Console attached to the JVM: command prompt output
System.out.println("...");
} else {
// No console: use Swing
}
от http://java.itags.org/java-essentials/15972/
try {
GraphicsEnvironment.getLocalGraphicsEnvironment();
} catch(Throwable ex) {
System.out.println("No graphical environment is available.");
}
Это правда, что невозможно сказать, как был вызван JVM. но... есть способ обойти это. вы предположили, что когда пользователь дважды щелкнул по банку, тогда работает GUI... ладно. поэтому давайте расширим это предположение. проверять.. откуда был вызван класс, из каталога. проверь этот каталог.. предполагая, что это обычное использование, когда есть *.jar-файл, затем пользователь должен был запустить приложение из jar.. но один недостаток заключается в том, что пользователь может нажать на основной класс файл. хахахаха
вы можете получить все входные аргументы с помощью RuntimeMBean.getInputArguments (), это можно использовать для определения, когда отладка включена.
EDIT: однако аргумент-jar не является одним из них. :(