Двойной щелчок vs java -jar MyJar.jar

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

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


person Collin    schedule 11.07.2013    source источник
comment
Двойной щелчок запускает javaw, а не java, см .: stackoverflow.com/questions/1997718/   -  person morpheus05    schedule 12.07.2013
comment
Что вы имеете в виду под тем, что внутри что-то не работает?   -  person XiaoChuan Yu    schedule 12.07.2013
comment
Основное различие между ними - контекст места выполнения. При запуске из командной строки контекстом выполнения будет каталог, из которого вы выполнили java-команду. При двойном щелчке по Jar контекст будет зависеть от системы. Вы можете использовать System.out.println (новый файл (.). GetCanonicalPath ()); для вывода места, в котором выполнялась программа   -  person MadProgrammer    schedule 12.07.2013
comment
Запускается корректно, но сама программа работает некорректно. Итак, графический интерфейс появляется, но программа не работает.   -  person Collin    schedule 12.07.2013
comment
Me-sa like-a dis вопрос. Me-sa upvote'in это.   -  person John    schedule 12.07.2013
comment
@ morpheus05 Не всегда верно, Java работает не только в Windows!   -  person MadProgrammer    schedule 12.07.2013
comment
Хорошо, я исправил это, и, насколько я могу судить, это проблема / ошибка с eclipse. Я экспортировал свой проект как работающий jar и дважды щелкнул по нему внутри проводника пакетов eclipse: это не сработало. Я дважды щелкаю по нему в обычном файловом браузере, и он отлично работает. Проблема исправлена, но может ли кто-нибудь объяснить, почему это происходит? РЕДАКТИРОВАТЬ: Он сломался точно так же на чужой машине, поэтому я не думаю, что это что-то странное с машиной, которую я использую.   -  person Collin    schedule 12.07.2013
comment
Сколько JDK, JRE установлено на вашем компьютере? Я буду тем, который связан с файлами JAR в проводнике Windows, это не то же самое, что находится в вашем пути к Windows.   -  person Amir Pashazadeh    schedule 12.07.2013
comment
Двойной щелчок по банке внутри Eclipse по умолчанию открывает, что заставляет систему делать все, что она думает, чтобы запустить банку. (На моей машине он запускает WinZip.) Действие по умолчанию для запуска jar-файла в Windows - выполнить его с javaw -jar. Это то же самое, что и двойной щелчок по значку в проводнике Windows. Он использует тот же JDK, поскольку Eclipse подчиняется Windows. Но если вы выберете банку, щелкните правой кнопкой мыши и выберете другое открытое действие, Eclipse начнет делать это вместо того, чтобы позволить системе запустить его.   -  person Lee Meador    schedule 12.07.2013


Ответы (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, он выведет

введите описание изображения здесь

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

введите описание изображения здесь

Контекст выполнения изменился. То же самое произойдет, когда вы дважды щелкните Jar, и это зависит от системы. Также будет иметь значение, короткий ли это путь или настоящий Jar.

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

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

person MadProgrammer    schedule 11.07.2013
comment
Мне любопытно, по какой причине проголосовали против? Каким образом это не отвечает на заданный вопрос? Как это можно улучшить? - person MadProgrammer; 26.01.2020

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

person Lee Meador    schedule 11.07.2013
comment
Не всегда верно, например, на MacOS нет команды javaw. И вы даже не упомянули, как это может повлиять на контекст выполнения приложения, в лучшем случае это будет разумным комментарием. - person MadProgrammer; 12.07.2013
comment
@MadProgrammer Верно. Но я думаю, что угадала некоторые неписаные части вопроса, когда предположила, что речь идет только о Windows. - person Lee Meador; 12.07.2013