Обучение и трудоустройство Java-программистов от Junior до Senior

Программа не видит properties-файл при её запуске двойным кликом

 
 
 
Сообщения:28
Здравствуйте. Написал гуишное приложение (на свинге). Приложение работает с базой данных. Настройки для подключения к базе данных хранию в проперти-файле. Кладу его в корень проекта (в IDEA). Путь прописываю так:
 private static final String PATH_TO_FILE_PROPERTIES = "settings_db_mysql.properties";



В ИДЕИ всё работает, файл подцепляется, с базой устанавливается соединение, и в общем всё нормально. Как создают джар-ник в ИДЕИ и кладу его в любую папку, а рядом кладу этот пропертис-файл, то при запуске программы двойным кликом, она не находит этот файл. Пробую это в линуксе убунту. Кстати, если запускать программу из командной строки, то она находит этот файл.

Также ставил на виртуальную машину виндоуз 7, и там пробовал запустить программу двойным кликом. Всё работает, программа находит файл. Из командной строки тоже всё работает.

Пробовал разные варианты: дописывал в начале пути к файлу new File("") + File.separator, дописывал System.getProperty("user.dir"). Ничего не помогает. Свойство user.dir при запуске программы двойным кликом возвращает домашний каталог пользователя.

Хотелось бы, чтобы программа брала файлом, лежащий рядом с ней (в той же папке). Вообще, можно как-то получить каталог, в котором лежит программа?
 
 
Сообщения:775
Приветствую!
Вот функция которая вернёт абсолютный путь к вашему jar:
    public static String getClassLocation(Class<?> c) {
        String classLocation = "";
        URL pathURL = c.getProtectionDomain().getCodeSource().getLocation();
        try {
            classLocation = URLDecoder.decode(pathURL.getFile().substring(1).replace('/', File.separatorChar), Charset.defaultCharset().name());
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(MyClass.class.getName()).log(Level.SEVERE, null, ex);
        }
        return classLocation;
    }
 
 
Сообщения:28
gidravlic:
Приветствую!
Вот функция которая вернёт абсолютный путь к вашему jar:
    public static String getClassLocation(Class<?> c) {
        ...
        return classLocation;
    }

А на вход что надо подать?

UPD: Ещё вопрос: а зачем строчка "URLDecoder.decode(pathURL.getFile().substring(1).replace('/', File.separatorChar), Charset.defaultCharset().name());"?
Изменен:12 окт 2017 12:51
 
 
Сообщения:775
На вход падаёте любой класс находящийся в вашем jar файле
 
 
Сообщения:28
Изменил метод, предложенный gidravlic. Получился такой:
    private static String getClassLocation(Class<?> c) {
        URL pathURL = c.getProtectionDomain().getCodeSource().getLocation();
        try {
            Path path = Paths.get(pathURL.toURI());
            String rootStr = path.getRoot().toString();
            return rootStr + path.subpath(0, path.getNameCount()-1).toString() + File.separator;
        } catch (URISyntaxException e) {
            e.printStackTrace();
            return "";
        }
    }

На вход кидаю класс, в котором лежит этот метод. Протестировал на линуксу(убунту), и на виндоуз (виндоуз 7) - всё работает. Так что оставлю это решение.
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет