【问题标题】:Issue with relative paths of resources files in an executable jar using Maven使用 Maven 的可执行 jar 中资源文件的相对路径问题
【发布时间】:2016-07-10 13:13:03
【问题描述】:

我想制作一个 jar 文件来查找任务标签之间的相似之处。出于这个原因,我使用了 2 个 WordNet 字典的 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"/>

在我的代码中,我有如下所示的两个代码 sn-ps。

此代码初始化 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,我看到类路径是:.(句号)

3 天来我已经阅读了很多关于这个问题的帖子,但没有任何东西可以解决我的问题。我将不胜感激。

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

【问题讨论】:

  • 在查找资源时必须始终检查是否为空!

标签: java maven wordnet


【解决方案1】:

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

  1. 对于属性文件:

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

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

JWNL.initialize(ClassLoader.getSystemResourceAsStream("resources/properties.xml"));
  1. 对于字典: 该 API 不是为读取 jar 中的字典文件而设计的。在第 363 行的 edu.mit.jwi.data.FileProvider 中,您会看到:

    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
       ...
    }
    

【讨论】:

  • 谢谢 Hugo G。你在 20 分钟内解决了我的问题,我已经搜索了 3 天!!!我也可以问点别的吗?我将 WordNet 字典放在 C:/WordNet-3.0/dict 目录中。我想在平台中导入这个 jar 文件并在任何机器上运行。我必须创建一个自述文件,警告将 WordNet 字典放在 C: 目录中?
  • 那将是一个坏主意:如果您的用户没有 C 盘符或者他使用的是 linux 或 mac 怎么办?我用一些方法更新了我的答案。
  • 我认为我的情况更好的解决方案是使用环境变量,但我不知道怎么做,我也不明白上面的链接。我使用带有值的 CLASSPATH 变量: 。 (点)(当前工作目录)并将其放在 properties.xml 文件中的字典路径中: 和字典构造函数中java: dict = new Dictionary(new File("${CLASSPATH}WordNet-3.0\\dict"));但我有以下错误:属性文件必须指定字典路径并且字典目录不存在。知道如何使用它吗?
  • CLASSPATH 不表示目录,它是 java 类路径中包含的文件和目录的列表。我添加了一个使用环境变量来配置字典位置的示例。如果对您有帮助,请考虑接受答案。
  • 抱歉耽搁了……由于字典的构造函数,上面的例子不起作用。它只获取 URL 或文件,并且 wordNetDicDir 是一个字符串....您对此有什么解决方案吗?提前致谢!!!
猜你喜欢
  • 2016-09-15
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 2013-07-10
  • 2013-05-28
  • 2019-03-22
相关资源
最近更新 更多