Относительный путь к каталогу базы данных WordNet в.jar

Для использования JAWS необходима спецификация каталога базы данных WordNet в приложении, как указано здесь: http://lyle.smu.edu/~tspell/jaws/.

System.setProperty("wordnet.database.dir", "resources/WordNet-3.0/dict/");

Это хорошо работает в IDE. Но не скомпилировано в файл.jar. Следовательно, необходим относительный путь к каталогу WordNet в файле.jar. Пробовал уже разные подходы. Последнее:

String url = this.getClass().getClassLoader()
            .getResource("resources/WordNet-3.0/dict/index.sense").toExternalForm();
url = url.substring(0, url.length() - 12);

Который в результате протестирован из файла.jar:

баночка: Файл:/C:/file/path/jar.jar /resources/WordNet-3.0/dict/

Подумал, что это будет решением, но при запуске.jar каталог или вернее index.sense не может быть найден. Index.sense должен загружаться через:

WordNetDatabase database = WordNetDatabase.getFileInstance();

Который использует указанный каталог. Нашел пару тем, но никаких предложений тех не получилось. Например:

Как получить путь к работающему файлу JAR? Как получить путь к ресурсу в файле JAR Java Загрузка файла относительно исполняемого файла JAR

1 ответ

Решение

Вы не можете найти путь к файлу JAR, виртуальная файловая система не используется WordNet API. Поэтому он не может вглядываться в URL ресурса, который вы пытаетесь сгенерировать. WordNet API использует File а также FileReader завернут в BufferedReader ни один из которых не может открыть имя файла, такое как file:///some/dir/to/file.jar!something/in/a/jar,

Вместо этого вы можете сделать так, чтобы ваша программа сначала нашла правильный JAR-файл, используя метод, подобный описанному выше, для поиска ресурсов в некотором jar-файле XYZ, затем разархивируйте соответствующее содержимое файла JY-файла XYZ во временную директорию кеша и затем укажите WordNet wordnet.database.dir Системное свойство в этом каталоге кеша.

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

Альтернативный метод - изменить код, который вы используете (библиотека JAWS) для загрузки ресурсов из потоков вместо файлов, если вы предоставляете что-то вроде classpath:relative/path/in/jars формат wordnet.database.dir имущество. В противном случае вы бы рассматривали это как файл. Просто найдите все случаи чтения файлов в этой библиотеке и замените создание потока общей утилитой, которая возвращает BufferedReader упаковка правильного типа входного потока.

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