我有一个包含2个模块的maven项目。有一个爬虫模块,它依赖于核心模块。每个模块在src / main / resources /中都有自己的config.ini文件,每个模块有一个主要的主类。
现在我想像这样启动NewsCrawler:
mvn exec:java -Dexec.mainClass="org.aksw.simba.rdflivenews.NewsCrawler"
这适用于加载抓取工具自己的配置文件,但无法从核心模块加载配置文件:
NewsCrawler.CONFIG = new Config(new Ini(File.class.getResourceAsStream("/newscrawler-config.ini")));
RdfLiveNews.CONFIG = new Config(new Ini(File.class.getResourceAsStream("/rdflivenews-config.ini")));
第二个配置加载失败,出现NullPointerException。我检查了jar文件,配置文件在里面。奇怪的是,相同的两行在测试用例中起作用。使用eclipse,我可以毫无问题地启动课程的主要部分。
答案 0 :(得分:2)
这是 well-functioning source code of your example 。
解压缩,然后在命令行上,转到包含父pom的目录,然后执行:
mvn clean test
在调用getResourceAsStream()时,执行以下操作以了解您的位置:
try {
IniFile = new Ini(File.class.getResourceAsStream("/newscrawler-config.ini"));
} catch(Exception e) {
System.out.println("Resource file not found : " + File.class.getResource("."));
}
还尝试在/
之前移除newscrawler-config.ini
。这取决于您将文件放在层次结构中的位置。 getResourceAsStream
搜索CLASSPATH,而不是源路径。
您也可以使用this.getClass().getResourceAsStream()
代替File.class.getResourceAsStream()
。
通过在pom.xml中配置资源,可以将src / main / resource复制到target / test-classes:
<build>
<resources>
<resource>
<filtering>false</filtering>
<directory>${basedir}/src/main/resource</directory>
</resource>
</resources>
<testResources>
<testResource>
<filtering>false</filtering>
<directory>${basedir}/src/main/resource</directory>
</testResource>
</testResources>
</build>
并使用准全路径调用getResourceAsStream():
this.class.getResourceAsStream("/com/jeromeradix/stackoverflow/newscrawler/newscrawler-config.ini"));
答案 1 :(得分:0)
这解决了我的问题!我想我看错了(阶级)路径......
NewsCrawler.CONFIG = new Config(new Ini(NewsCrawler.class.getResourceAsStream("/newscrawler-config.ini")));
RdfLiveNews.CONFIG = new Config(new Ini(RdfLiveNews.class.getResourceAsStream("/rdflivenews-config.ini")));