2

我有一个包含 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,我可以毫无问题地开始课程的主要内容。

4

2 回答 2

2

这是您的示例的运行良好的源代码

dezip,然后在命令行上,转到包含父 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 复制到目标/测试类可能是一种解决方案:

<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"));
于 2012-08-14T14:32:37.417 回答
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")));
于 2012-08-14T16:05:02.640 回答