【问题标题】:WordNet Database Directory Relative Path in .jar.jar 中的 WordNet 数据库目录相对路径
【发布时间】:2016-09-14 02:28:57
【问题描述】:

要使用 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

【问题讨论】:

  • 您好,我们也面临同样的问题,您能否通过发布解决方案或详细说明解决方案来帮助我们。提前致谢。

标签: java jar path jaws-wordnet


【解决方案1】:

您无法进入 JAR 文件,WordNet API 没有使用虚拟文件系统。因此它无法在您尝试生成的资源 URL 内部进行对等。 WordNet API 使用 File 和 FileReader 包裹在 BufferedReader 中,它们都不能打开像 file:///some/dir/to/file.jar!something/in/a/jar 这样的文件名。

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

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

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

【讨论】:

  • 感谢您的全面回答!
  • 嗨杰森,嗨,我们也面临同样的问题,我们无法解决这个问题。你能通过详细解释解决方案来帮助我们吗?提前致谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 2014-08-18
  • 2017-12-09
  • 1970-01-01
  • 2017-09-07
  • 2012-01-31
相关资源
最近更新 更多