Относительный путь к каталогу базы данных 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
упаковка правильного типа входного потока.