jar资源在测试中加载但在应用程序中没有

时间:2014-02-04 15:01:57

标签: java maven junit jar

我有一个maven项目,它构建了一个包含2个构造函数的xmlreader类。一个采用外部文件名和一个默认加载资源。

默认构造函数适用于test,但在使用默认参数执行程序时找不到该文件。更改我访问资源的方式会导致测试失败并且maven停止构建。我已经解压缩了jar,文件位于那里。

这是构造函数:

public XmlReader() {
    this.filename = getClass().getResource("/Default.xml").getPath();
    this.git = new GitClass();
    this.cucumber = new CucumberClass();
    this.execute = new ExecuteClass();
}

ERRORMESSAGE:

5030 [main] ERROR - File file:/Users/andreasjoelsson/XmlReader/target/XmlReader-1.0-SNAPSHOT.jar!/Default.xml not found.
5030 [main] DEBUG - Context: init of reader: false

JUnit测试:

@Test
public void test2() {
    XmlReader testObject = new XmlReader();
    // Subject to change as it's the default config to run.
    assertEquals(true, testObject.init());
    assertEquals(25, testObject.getExecute().getMaxUsers());
    assertEquals(true, testObject.getExecute().isRepeatFeature());
    assertEquals(1, testObject.getExecute().getSecondsBetweenIncrease());
    assertEquals(2, testObject.getExecute().getUsersIncreasedEachInterval());
    assertEquals(20, testObject.getExecute().getWaitAfterRampSeconds());
    System.out.println(testObject.toString());
}

所以我执行测试的包工作正常,但是当我在maven之外运行它时。

2 个答案:

答案 0 :(得分:2)

当您将这些文件作为硬盘文件系统的一部分使用时,您无法使用属于JAR的文件。

在开发期间,您拥有工作区中的所有源文件。因此文件系统中确实存在物理文件。 new File(fileName)getResource(resourceName).getPath()等语句可以很好地运作。

在处理JAR内的资源时,首先必须通过Class.getResource(resourceName)ClassLoader.getResource(resourceName)检索资源。您将获得一个没有文件协议的URL,这也是您无法在其上调用getPath()的原因。您必须使用URL.openStream()检索输入流。这样你就可以阅读你的资源了(不要忘记之后关闭你的资源)。

答案 1 :(得分:0)

您需要的是在项目中创建一个名为src但具有不同名称的源文件夹。 要在Windows上引用此文件夹中的文件,您只需要指示项目的名称和资源名称:

getResource("ProjectName/Default.xml")

我希望这有帮助!