Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Программа не видит properties-файл при её запуске двойным кликом / 10 сообщений из 10, страница 1 из 1
12.10.2017, 14:37
    #39535409
MaxLich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не видит properties-файл при её запуске двойным кликом
Здравствуйте. Написал гуишное приложение (на свинге). Приложение работает с базой данных. Настройки для подключения к базе данных храню в проперти-файле. Кладу его в корень проекта (в IDEA). Путь прописываю так:
Код: java
1.
    private static final String PATH_TO_FILE_PROPERTIES = "settings_db_mysql.properties";



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

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

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

Хотелось бы, чтобы программа брала файлом, лежащий рядом с ней (в той же папке). Вообще, можно как-то получить каталог, в котором лежит программа?
...
Рейтинг: 0 / 0
12.10.2017, 14:51
    #39535425
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не видит properties-файл при её запуске двойным кликом
MaxLichХотелось бы, чтобы программа брала файлом, лежащий рядом с ней (в той же папке). Вообще, можно как-то получить каталог, в котором лежит программа?
Всё верно. java.io.File резолвит относительные пути относительно user.dir. А user.dir может быть абсолютно любым в зависимости от способа запуска. Поэтому вариантов решения есть несколько:
1.
Код: java
1.
Class.getClassLoader().getProtectionDomain().getCodeSource().getLocation().


2. batch/schell скрипты, которые переходят в каталог где находится скрипт и запускают jar оттуда, таким образом user.dir всегда нужный.
3. Launch4j
...
Рейтинг: 0 / 0
12.10.2017, 15:55
    #39535479
MaxLich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не видит properties-файл при её запуске двойным кликом
Blazkowicz,
1-ое решение мне уже подсказали. 2-ое - не очень красивое.
По 3-ему: эта программа же только для винды, икзешники делать из джар? (Если что мне нужно, чтобы работало на любых системах, потому что я не знаю, где это будет запускать пользователь (это может быть винда, убунту, или серверная версия винды или линукса/юникса))
...
Рейтинг: 0 / 0
12.10.2017, 16:03
    #39535483
MaxLich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не видит properties-файл при её запуске двойным кликом
Blazkowicz, Ещё один вопрос. На другом форуме предложили решение, похожее на первое, но не могу понять, зачем туда вставили ещё одну строчку. Можете сказать? Решение такое:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        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()); // (1)
            } catch (UnsupportedEncodingException ex) {
                Logger.getLogger(MyClass.class.getName()).log(Level.SEVERE, null, ex);
            }
            return classLocation;
        }



Вопрос касается строчки, помеченной (1). Убрал её, и всё работает без неё. По-быстрому глянул, ничего такого не нашёл, вроде как и нужна. Так что она делает? Зачем она нужна? Может её, правда, нафиг убрать?
...
Рейтинг: 0 / 0
12.10.2017, 16:05
    #39535484
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не видит properties-файл при её запуске двойным кликом
MaxLich1-ое решение мне уже подсказали.

И? Это значит нужно было догадаться и не писать о нём?

MaxLich2-ое - не очень красивое.

Нормальное. Многие пользуются.

MaxLichПо 3-ему: эта программа же только для винды, икзешники делать из джар? (Если что мне нужно, чтобы работало на любых системах, потому что я не знаю, где это будет запускать пользователь (это может быть винда, убунту, или серверная версия винды или линукса/юникса))
http://launch4j.sourceforge.net/ The wrapped program works on all Windows platforms, Launch4j works on Windows, Linux and Mac OS X.
...
Рейтинг: 0 / 0
12.10.2017, 16:11
    #39535488
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не видит properties-файл при её запуске двойным кликом
MaxLichВопрос касается строчки, помеченной (1). Убрал её, и всё работает без неё. По-быстрому глянул, ничего такого не нашёл, вроде как и нужна. Так что она делает? Зачем она нужна? Может её, правда, нафиг убрать?
Ну, задумка в том что в URL всегда однозначный символ-разделитель, а в файловой системе может быть прямой слэш, обратный и даже символ йены и перечеркнутое W. Но на самом деле оно бестолковое по двум причинам.
1. https://docs.oracle.com/javase/7/docs/api/java/io/File.html#File(java.net.URI)
2. Операционные системы, обычно, понимают слэш и конвертируют в текущий разделитель прозрачно без особых усилий со стороны разработчика.
...
Рейтинг: 0 / 0
12.10.2017, 16:26
    #39535503
MaxLich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не видит properties-файл при её запуске двойным кликом
Blazkowicz,
Про launch4j: авторLaunch4j wraps jars in Windows native executables and allows to run them like a regular Windows program То есть, как я понял, она делает икзешники для винды из джаров, но сама работает не только на винде, но также и на линуксе и маке.

А вообще, пока остановился на первом решении. Его ещё хорошенько протестирую, и скорее всего оставлю. Кстати, а знаете, как сделать, чтобы с этим решением работало и в IntelliJ IDEA? Там он берёт папку в которой лежит class-файл. Наверно, нет такого универсального решения, чтобы ещё и в ИДЕИ работало!?
...
Рейтинг: 0 / 0
12.10.2017, 16:58
    #39535529
MaxLich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не видит properties-файл при её запуске двойным кликом
Ладно, сделал пока такое решение (метод):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    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 "";
        }
    }


На вход кидаю класс, где лежит этот метод. В итоге получаю папку, где лежит джар-ник программы. Тестировал на винде (семёрке) и на линуксе (убунту) - всё работает. Такое решение и оставлю. (правда, в ИДЕИ это решение не работает, поэтому пока пользую комментированием-раскомментированием строк)
...
Рейтинг: 0 / 0
12.10.2017, 17:20
    #39535554
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не видит properties-файл при её запуске двойным кликом
MaxLich(правда, в ИДЕИ это решение не работает, поэтому пока пользую комментированием-раскомментированием строк)
Ну, есть всегда вариант проверять наличие файла и читать относительно user.dir. У меня, правда, с таким подходом комедный случай был, когда QA себе скопировал на рабочий стол конфиги зачем-то и они оттуда подчитываться начали.
...
Рейтинг: 0 / 0
12.10.2017, 17:42
    #39535576
MaxLich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не видит properties-файл при её запуске двойным кликом
Blazkowicz, Да, вроде бы неплохое решение. Надо будет попробовать. (Хотя менять код из-за одной ИДЕИ, это мне кажется, не очень разумно; но в данном случае, мне всё равно будет так удобнее.)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Программа не видит properties-файл при её запуске двойным кликом / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]