2

要使用 JAWS,需要在应用程序中指定 WordNet 数据库目录,如下所述:http: //lyle.smu.edu/~tspell/jaws/

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

这在 IDE 中运行良好。但未编译为 .jar 文件。因此,需要 .jar 文件中 WordNet 目录的相对路径。已经尝试了各种方法。最后一个是:

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

从 .jar 文件中测试的结果是:

jar:file:/C:/file/path/jar.jar!/resources/WordNet-3.0/dict/

认为这将是解决方案,但是在运行 .jar 时仍然找不到目录,或者更确切地说是 index.sense 。index.sense 应该通过以下方式加载:

WordNetDatabase database = WordNetDatabase.getFileInstance();

它使用指定的目录。找到了几个线程,但没有任何建议有效。例如:

如何获取正在运行的 JAR 文件的路径? 如何在 Java JAR 文件中获取资源的路径 加载相对于正在执行的 jar 文件的文件

4

1 回答 1

2

您无法进入 JAR 文件,WordNet API 没有使用虚拟文件系统。因此它无法在您尝试生成的资源 URL 内部进行对等。WordNet API 使用 aFile并且FileReader包裹在BufferedReader其中任何一个都不能打开文件名,例如file:///some/dir/to/file.jar!something/in/a/jar.

您可以做的是,让您的程序首先使用上述方法找到正确的 JAR,以在某些 jar XYZ 中定位资源,然后将 XYZ JAR 文件的相关内容解压缩到临时缓存目录中,然后指向该缓存目录中的WordNetwordnet.database.dir系统属性。

根据您使用的 JDK 版本,取决于从 Java 中解压缩 JAR 的最佳方法,但有很多示例可以这样做。

另一种方法是修改您正在使用的代码(JAWS 库)以从流而不是文件中加载资源,如果您提供类似属性classpath:relative/path/in/jars格式的内容wordnet.database.dir。否则,您会将其视为文件。只需在该库中找到所有出现的文件读取,并用一个通用实用函数替换流的创建,该实用函数返回一个BufferedReader包装正确类型的输入流。

于 2016-05-17T21:53:14.737 回答