2016-05-17 5 views
2

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

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!/

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

WordNetDatabase database = WordNetDatabase.getFileInstance(); 

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

How to get the path of a running JAR file? How to get a path to a resource in a Java JAR file Loading a file relative to the executing jar file

+0

Привет, Мы также сталкиваемся с той же проблемой, можете ли вы помочь нам, разместив решение или разработав решение. Заранее спасибо. – Ajaykumar

ответ

2

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

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

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

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

+0

Благодарим вас за подробный ответ! – n01dea

+0

Hi Jayson, \t Привет, Мы также сталкиваемся с той же проблемой, мы не можем исправить проблему. вы можете помочь нам, объяснив решение в деталях. Заранее спасибо. – Ajaykumar