gpt4 book ai didi

java - 使用 Maven 的可执行 jar 中资源文件的相对路径问题

转载 作者:行者123 更新时间:2023-11-30 07:30:46 24 4
gpt4 key购买 nike

我想制作一个 jar 文件来查找任务标签之间的相似之处。为此,我使用了 WordNet 词典的 2 个 java 库:JWNL-1.4-rc3JWI-2.3.3。我还在 myProjectresources 文件夹中放置了 JWNL 库初始化所需的 properties.xml 文件,以及 WordNet 词典:

src/main/resources/
properties.xml
WordNet-3.0/dict (dict has 24 files inside)

properties.xml 文件的字典路径值为:

<param name="dictionary_path" value="WordNet-3.0\dict"/>

在我的代码中,我有下面所示的两个代码片段。

此代码初始化 JWNL 库:

try {
JWNL.initialize(similarities.class.getClassLoader().getResourceAsStream("/properties.xml"));
}
catch (JWNLException e) {
e.printStackTrace();
}

similarities 是我的主类。

这是JWI字典的构造函数:

try {
//String path = similarities.class.getProtectionDomain().getCodeSource().getLocation().getPath();
dict=new Dictionary(this.getClass().getClassLoader().getResource("WordNet-3.0\\dict"));
dict.open();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

但是当我导出可执行 jar 并在控制台中运行它时,出现以下错误:

net.didion.jwnl.JWNLException: Properties file invalid or not found
at net.didion.jwnl.JWNL.initialize(JWNL.java:103)
at com.iteforth.annotationToBPM.similarities.main(similarities.java:576)
Exception in thread "main" java.lang.NullPointerException
at edu.mit.jwi.data.FileProvider.<init>(FileProvider.java:191)
at edu.mit.jwi.data.FileProvider.<init>(FileProvider.java:166)
at edu.mit.jwi.data.FileProvider.<init>(FileProvider.java:148)
at edu.mit.jwi.Dictionary.<init>(Dictionary.java:41)
at com.iteforth.annotationToBPM.similarities.<init>(similarities.java:92)
at com.iteforth.annotationToBPM.similarities.main(similarities.java:627)

我已经打开了 jar 文件,并且检查了里面有一个 resources 文件夹,其中包含 properties.xml 和 WordNet 字典。我还打开了 MANIFEST,我看到类路径是:.(句号)

三天来我阅读了许多有关此问题的帖子,但没有任何内容可以解决我的问题。我将不胜感激任何帮助。

告诉我是否必须发送其他内容,例如 POM.xmlproperties.xml 文件。

最佳答案

您遇到的错误与属性文件的加载有关,但我认为您会在字典加载时遇到另一个错误。

  1. 对于属性文件:

    JWNL.initialize(ClassLoader.getSystemResourceAsStream("properties.xml"));

确保您的文件位于 jar 的根目录下。如果您的源文件位于 src/main/resources 中,则应该是这种情况,因为它是默认的 Maven 配置。如果您的属性文件位于 jar 中的“资源”文件夹中,如您所说,这将变为:

JWNL.initialize(ClassLoader.getSystemResourceAsStream("resources/properties.xml"));
  • 对于字典:该 API 并非旨在读取 jar 内的字典文件。在 edu.mit.jwi.data.FileProvider 的第 363 行,您将看到:

    File directory = toFile(url);
    if (!directory.exists())
    throw new IOException("Dictionary directory does not exist: " + directory);

    所以你必须将它们保存在 jar 之外的文件系统中:

    dict = new Dictionary(new File("WordNet-3.0\\dict"));
    dict.open();
  • 注意:当然,在代码中放置硬编码的绝对路径并不是一个好主意。

    如果您的 jar 始终从该目录运行,您可以将字典目录放在与您的 jar 相同的目录中,并使用上面代码中的相对文件路径访问它(请参阅 How does Java resolve a relative path in new File()? )

    或者您可以让用户使用命令行参数 ( https://docs.oracle.com/javase/tutorial/essential/environment/cmdLineArgs.html ) 或环境变量 ( https://docs.oracle.com/javase/tutorial/essential/environment/env.html ) 配置目录路径

    环境变量示例:

    • 用户定义一个环境变量,例如:

      set WORD_NET_DICTIONARY = "C:\WordNet-3.0\Dict"
    • 您可以在代码中获取此环境变量并配置您的库:

      String wordNetDicDir = System.getenv("WORD_NET_DICTIONARY");
      if (wordNetDicDir != null) {
      dict = new Dictionary(new File(wordNetDicDir));
      dict.open();
      } else {
      // throw exception or log error
      ...
      }

    关于java - 使用 Maven 的可执行 jar 中资源文件的相对路径问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36174897/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com