2013-07-11 3 views
5

У меня есть .jar-файл, и когда я запускаю его из командной строки через java -jar MyJar.jar, он отлично работает. Однако двойного щелчка по нему нет. Двойной щелчок запускает программу правильно, но что-то внутри не работает.Двойной щелчок vs java -jar MyJar.jar

Для того, чтобы выяснить, что не так, самостоятельно: в чем разница между двойным щелчком на runnable .jar и запуском его из командной строки?

+0

Двойной щелчок запускает javaw не Java, см: http://stackoverflow.com/questions/1997718/difference-between-java-exe-and-javaw-exe – morpheus05

+0

Что значит «что-то внутри не работает»? –

+1

Основное различие между ними - это контекст места выполнения. При запуске из командной строки контекст выполнения будет каталогом, из которого вы выполнили команду java. При двойном нажатии на Jar контекст будет зависящим от системы. Вы можете использовать System.out.println (новый файл ("."). GetCanonicalPath()); для вывода местоположения, в котором программа была выполнена в – MadProgrammer

ответ

2

Если программа выполняется важна и может меняться в зависимости от того, как он был выполнен.

Вы можете проверить это, используя что-то вроде ...

import java.awt.EventQueue; 
import java.awt.HeadlessException; 
import java.io.File; 
import java.io.IOException; 
import javax.swing.JOptionPane; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class WhereAmI { 

    public static void main(String[] args) { 
     new WhereAmI(); 
    } 

    public WhereAmI() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       try { 
        String path = new File(".").getCanonicalPath(); 
        JOptionPane.showMessageDialog(null, "I was started in " + path); 
       } catch (IOException exp) { 
        exp.printStackTrace(); 
       } 

      } 
     }); 
    } 

} 

Например. При компиляции, Jar находится в /Volumes/Disk02/DevWork/personal/java/projects/wip/StackOverflow/WhereAmI/dist

Если изменить каталоги в это место и запустить java -jar WhereAmI.jar выводит

enter image description here

Если изменить каталоги /Volumes/Disk02/DevWork/personal/java/projects/wip/StackOverflow/WhereAmI и запустить java -jar dist/WhereAmI.jar выводит

enter image description here

Изменен контекст выполнения. То же самое произойдет, когда вы дважды щелкните Jar, и это зависит от системы. Это также имеет значение, если это короткий отрезок или фактический Jar.

Это будет означать, что если вы полагаетесь на любые относительные ресурсы, вы должны убедиться, что Jar выполняется в правильном месте относительно ваших ресурсов.

Как достичь этого, зависит от ОС

0

Двойной щелчок запускает его как «javaw -jar myJar.jar»

+0

Не всегда верно, например, в MacOS нет команды javaw. И вы даже не упомянули, как это может повлиять на контекст выполнения приложения, в лучшем случае это сделало бы разумный комментарий. – MadProgrammer

+0

@MadProgrammer True. Но я думаю, что догадывался о некоторых неписаных частях вопроса, если предположить, что это относится только к Windows. –

Смежные вопросы