Доступ к ресурсу внутри jar (работает в Netbeans, но не в командной строке) - PullRequest
1 голос
/ 30 января 2010

У меня есть JAR-файл со связанными ресурсами (бинарные файлы языковой модели), которые необходимо загрузить во время выполнения. Структура каталогов внутри банки:

Таггер / app.class
Таггер / модель / остановка / SentDetect.bin.gz

где SentDetect.bin.gz - это двоичный файл, путь которого загружается в класс третьей стороны (SentDetector) в качестве параметра String, т.е.

URL url = this.getClass().getResource("models/stop/SentDetect.bin.gz");
SentenceDetector sdetector = new SentenceDetector(url.getPath());

Хотя в Netbeans все работает нормально, когда я пытаюсь запустить его как jar из командной строки, я получаю исключение FileNotFound в конструкторе. Я дважды проверил, что бинарный файл включен в скомпилированный файл Jar.

Я полагаю, что решением обычно будет загрузка данных в виде входного потока с использованием getResourceAsStream (), но здесь это не вариант, поскольку URL-адрес передается в качестве параметра String стороннему конструктору, который мне верить, что проблема в том, как URL анализируется на строку?

Я пытался:

url.getPath();
url.getFile();
url.toURI().getPath();
url.toString();

и все дают разные пути к файлу.

Ответы [ 2 ]

1 голос
/ 30 января 2010

Похоже, что все должно быть хорошо, если двоичный файл определенно находится в нужном месте, а файл jar определенно находится в пути к классам. (Я предполагаю, что он может найти сам класс? Я ожидал бы так, учитывая, что вы используете this.getClass()).

Единственное, что может вызывать проблемы - это регистр имен файлов - при загрузке файла из файловой системы, если вы используете Windows, это будет без учета регистра; в фляге это будет чувствительно к регистру. Проверьте, что регистр в коде совпадает с регистром в файле jar.

0 голосов
/ 07 июня 2012

Вы не можете получить доступ к ресурсу в файле Jar через java.io.File. Вы должны предоставить альтернативный конструктор для SentenceDetector, который либо принимает InputStream вместо String, либо принимает URL и использует URL.openStream() для получения InputStream.

...