java - .jar 中的 WordNet 数据库目录相对路径

标签 java jar path jaws-wordnet

要使用 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();

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

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

最佳答案

您无法路径到 JAR 文件,WordNet API 没有使用虚拟文件系统。因此它无法查看您尝试生成的资源 URL 的内部。 WordNet API 使用封装在 BufferedReader 中的 FileFileReader,它们都无法打开诸如 file:///some 之类的文件名/dir/to/file.jar!something/in/a/jar.

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

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

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

关于java - .jar 中的 WordNet 数据库目录相对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37285437/

相关文章:

java - Android - 在 JSON 中存储有关用户登录的信息

java - 如何在一对多 hibernate 中向现有数据插入或添加新行

java - 当返回 404 的 HttpStatus 代码时,如何区分托管资源(在 url 上)的服务器是否已关闭或资源是否不存在

java - 处理重复的完全限定名称

c# - 在配置中为 Tracesource TextWriterTraceListener 输出添加自定义路径

java - LibGdx 了解视口(viewport)并将其与 Scene2D 关联

java - 编译基本的java项目

java - 将资源添加到 JAR

javascript - Angular ,Javascript : remove part of file path

python - 如何在Python中获取geckodriver的绝对路径