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

Java .jar中的WordNet数据库目录相对路径,java,jar,path,jaws-wordnet,Java,Jar,Path,Jaws Wordnet,要使用JAWS,需要在应用程序中指定WordNet数据库目录,如下所述: 这在IDE中运行良好。但没有编译成.jar文件。因此,需要.jar文件中WordNet目录的相对路径。已经尝试过各种方法。最后是: String url = this.getClass().getClassLoader() .getResource("resources/WordNet-3.0/dict/index.sense").toExternalForm(); url = url.substr

要使用JAWS,需要在应用程序中指定WordNet数据库目录,如下所述:

这在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/参考资料/WordNet-3.0/dict/

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

WordNetDatabase database = WordNetDatabase.getFileInstance();
它使用指定的目录。找到了几个线程,但没有这些线程的建议。例如:


您无法进入JAR文件,WordNet API没有使用虚拟文件系统。因此,它无法在您试图生成的资源URL内部进行对等。WordNet API使用
文件
文件读取器
包装在
BufferedReader
中,它们都不能打开
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
格式的
wordnet.database.dir
属性,则修改正在使用的代码(JAWS库)以从流而不是文件加载资源。否则,您会将其视为文件。只需在该库中查找所有文件读取事件,并用一个公共实用程序函数替换流的创建,该函数返回一个
BufferedReader
包装正确类型的输入流。

谢谢您的全面回答!嗨,杰森,嗨,我们也面临同样的问题,我们无法解决这个问题。你能详细解释一下解决方案吗。提前谢谢。嗨,我们也面临同样的问题,你能帮我们发布解决方案或详细说明解决方案吗。提前谢谢。
WordNetDatabase database = WordNetDatabase.getFileInstance();