首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Maven发出可执行jar中资源文件的相对路径

使用Maven发出可执行jar中资源文件的相对路径
EN

Stack Overflow用户
提问于 2016-03-23 09:57:48
回答 1查看 1.8K关注 0票数 1

我想要创建一个jar文件,它可以在任务标签之间找到相似之处。出于这个原因,我使用了WordNet字典的两个java库:JWNL-1.4-rc3JWI-2.3.3。我还在myProjectmyProject文件夹中放置了JWNL库需要的properties.xml文件以进行初始化,以及WordNet字典:

代码语言:javascript
复制
src/main/resources/
    properties.xml
    WordNet-3.0/dict (dict has 24 files inside)

properties.xml文件具有具有以下值的字典路径:

代码语言:javascript
复制
<param name="dictionary_path" value="WordNet-3.0\dict"/>

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

此代码初始化JWNL库:

代码语言:javascript
复制
try {
    JWNL.initialize(similarities.class.getClassLoader().getResourceAsStream("/properties.xml"));
}
catch (JWNLException e) {
    e.printStackTrace();
}

similarities是我的主修课。

这是JWI字典的构造函数:

代码语言:javascript
复制
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并在控制台中运行它时,我会得到以下错误:

代码语言:javascript
复制
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文件。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-23 10:43:52

您所犯的错误与属性文件的加载有关,但我认为您将得到另一个带有双值加载的错误。

  1. 对于属性文件: JWNL.initialize(ClassLoader.getSystemResourceAsStream("properties.xml"));

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

代码语言:javascript
复制
JWNL.initialize(ClassLoader.getSystemResourceAsStream("resources/properties.xml"));
  1. 对于字典: API不是为读取jar中的字典文件而设计的。在第363行的edu.mit.jwi.data.FileProvider中,您可以看到: 文件目录= toFile(url);如果(!directory.exists())抛出新的IOException(“字典目录不存在:”+目录); 因此,您必须将它们保存在jar之外,在文件系统中: 新字典(“WordNet3.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)配置目录路径。

使用环境变量的示例:

  • 例如,用户定义了一个环境变量: 设置WORD_NET_DICTIONARY = "C:\WordNet-3.0\Dict“
  • 您可以在代码中获取这个env变量并配置库: 字符串wordNetDicDir = System.getenv("WORD_NET_DICTIONARY");if (wordNetDicDir != null) { dict =新字典(新文件(WordNetDicDir));dict.open();}wordNetDicDir{ //引发异常或日志错误.}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36174897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档