Текущий рабочий каталог при запуске Jar - PullRequest
8 голосов
/ 22 июня 2011

Я создал приложение, которое представляет собой исполняемый файл jar (с использованием плагина maven-assembly) с парой настраиваемых пользователем ресурсов, расположенных рядом с ним в одном каталоге (изображения, свойства и т. Д.)

При запуске jar из командной строки с java -jar ... текущий каталог такой, какой вы ожидаете.Проблема заключается в том, что в некоторых операционных системах (Ubuntu 11.04), если приложение запускается простым двойным щелчком по jar, текущий рабочий каталог является домашним каталогом.

Есть ли предпочтительный способ получения текущего каталога?что находится в банке, или вообще какой-то другой способ доступа к внешним ресурсам, которые находятся рядом с банкой?

Ответы [ 2 ]

11 голосов
/ 22 июня 2011

Вы можете использовать MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath(), чтобы узнать местоположение файла jar.

Другой альтернативой может быть упаковка других ресурсов только для чтения в вашем jarfile вместе со связанными классами, чтобы вы могли использовать Class.getResource (String) или Class.getResourceAsStream (String) получить ресурсы относительно данного класса.

Например, у вас может быть класс com.example.icons.Icons , а значки будут упакованы вместе с Icons.class в com / example / myapp / icons / путь. Предположим, что ваша кнопка «открыть» использует значок с именем open.png :

ImageIcon icon = new ImageIcon(Icons.getResource("open.png"));
1 голос
/ 22 июня 2011

Вот моя попытка найти каталог, из которого работает jar.

public class JarLocation {
    public static void main(String[] args) {
        new JarLocation().say();
    }

    public void say() {
        String className = this.getClass().getName().replace('.', '/');
        String classJar =  
            this.getClass().getResource("/" + className + ".class").toString();
        if (classJar.startsWith("jar:")) {
            System.out.println("*** running from jar!");
        }
        javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
                null, classJar, "jar location",
                javax.swing.JOptionPane.DEFAULT_OPTION);
    }
}

Сначала я строю «путь» текущего класса, заменяя «.» по "/", тогда я получаю .class в качестве ресурса. Метод toString () возвращает что-то вроде:

jar:file:/C:/temp/testing.jar!/my/package/JarLocation.class

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...