Невозможно получить доступ к папке ресурсов при компиляции из .jar в .exe с помощью Launch4j

Я сделал небольшую программу на Java для академических целей, ее основное внимание уделяется чтению некоторых файлов .txt и представлению информации пользователю. Эти файлы находятся в папке ресурсов в папке src. Программа работает по назначению при запуске из Eclipse. Используя приложение Launch4j, я смог успешно создать exe, который отлично работает и выполняет то, что задумано, до тех пор, пока я не попытаюсь прочитать файлы .txt, которые у меня есть в папке ресурсов, которые, похоже, не могут быть достигнуты.

Я предполагаю, что когда я запускаю exe, путь времени выполнения изменится на то, где был создан exe, поэтому я создал программу в папке рабочего стола и указал этот путь в программе, но это, похоже, не решает ситуацию .

В качестве альтернативы я переместил файлы .txt из программы и еще раз создал exe в папке на рабочем столе с указанными файлами .txt, связал программу с этим путем, и снова она не сработала.

Для получения файлов .txt используется следующая команда:

Files.readAllLines(Paths.get(doc)).get(line)

А doc - это просто путь к предполагаемому файлу .txt.

Стоит отметить, что у меня нет предыдущего опыта работы с Java, и на протяжении всей разработки программы я изо всех сил старался использовать команды, которые я полностью понимаю, и старался сделать ее как можно более простой. Я надеюсь, что решение может быть таким! Я очень уверен, что это, должно быть, ошибка новичка, но я не могу нигде найти решение этой конкретной проблемы.

Ресурсы приложения станут встроенными ресурсами к моменту развертывания, поэтому разумно начать доступ к ним, как если бы они были, прямо сейчас. Доступ к встроенный ресурс должен осуществляться по URL-адресу, а не по файлу. См. Информация. страница для встроенного ресурса, чтобы узнать, как сформировать URL.

Andrew Thompson 11.10.2018 02:15

Большое спасибо!! Работает как надо !! Если бы я мог проголосовать за вас, я бы сделал это, но, поскольку я новичок, я не могу этого сделать :(

JNogueira 11.10.2018 03:52

а) Рад, что вы разобрались. б) Голосование за комментарии (в основном) неуместно. Голосование за ответы помогает отсортировать их до самого верха, но Лучший, что вы можете сделать, - это принять ответ, и я отмечаю, что вы уже это сделали, так что все хорошо. :)

Andrew Thompson 11.10.2018 04:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
3
542
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пути к файлам в Eclipse отличаются от путей к файлам в .exe или JAR-файле.

Я позволю этому другому пользователю объяснить это, потому что я ленив: p

Rather than trying to address the resource as a File just ask the ClassLoader to return an InputStream for the resource instead via getResourceAsStream:

InputStream in = getClass().getResourceAsStream("/file.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); As long as the file.txt resource is available on the classpath then this approach will work the same way regardless of whether the file.txt resource is in a classes/ directory or inside a jar.

The URI is not hierarchical occurs because the URI for a resource within a jar file is going to look something like this: file:/example.jar!/file.txt. You cannot read the entries within a jar (a zip file) like it was a plain old File.

This is explained well by the answers to:

How do I read a resource file from a Java jar file?

Java Jar file: use resource errors: URI is not hierarchical

Исходное сообщение - здесь, все кредиты его автору.

Исправление URL-адреса должно позволить вам читать из этого файла, когда вы используете .exe.

ИЗМЕНЕНО ДЛЯ ИСПРАВЛЕНИЯ. Спасибо @VGR (см. Комментарии) за исправление моей ошибки.

Вторая часть не имеет особого смысла. Копировать ресурс в отдельный файл необходимо только в том случае, если его нужно изменить во время выполнения. Во время компиляции просто измените файл с помощью IDE или любого инструмента и выполните сборку заново. Если вы только читаете файл (как следует из вопроса), нет никакой причины его копировать.

VGR 11.10.2018 02:51

Спасибо всем за то, что сэкономили мне $ !!! Программа запущена и работает как надо !! [один бокал пива для всех !!!]

JNogueira 11.10.2018 03:53

Другие вопросы по теме