为什么Jenkins无法加载资源?

Ste*_*han 8 java eclipse junit jenkins m2e

这是我的项目的布局:

src/
  test/
    resources/
        ares/
          file1.xml
          file2.xml
Run Code Online (Sandbox Code Playgroud)

这是Jenkins工作区的布局:

 my-module/
   target/
     test-classes/
       ares/
         file1.xml
         file2.xml
Run Code Online (Sandbox Code Playgroud)

在eclipse下,测试运行没有任何错误.在詹金斯,测试失败了.詹金斯无法找到资源.以下是测试执行的一些输出:

日食

MyClass.class.getResourceAsStream(/ares/file1.xml) => java.io.BufferedInputStream@4f4b2f1a
MyClass.class.getResourceAsStream(ares/file1.xml) => null

Thread.currentThread().getContextClassLoader().getResourceAsStream(/ares/file1.xml) => null
Thread.currentThread().getContextClassLoader().getResourceAsStream(ares/file1.xml) => java.io.BufferedInputStream@5d402eeb

MyClass.class.getClassLoader().getResourceAsStream(/ares/file1.xml) => null
MyClass.class.getClassLoader().getResourceAsStream(ares/file1.xml) => java.io.BufferedInputStream@20c87621
Run Code Online (Sandbox Code Playgroud)

詹金斯

MyClass.class.getResourceAsStream(/ares/file1.xml) => null
MyClass.class.getResourceAsStream(ares/file1.xml) => null

Thread.currentThread().getContextClassLoader().getResourceAsStream(/ares/file1.xml) => null
Thread.currentThread().getContextClassLoader().getResourceAsStream(ares/file1.xml) => null

MyClass.class.getClassLoader().getResourceAsStream(/ares/file1.xml) => null
MyClass.class.getClassLoader().getResourceAsStream(ares/file1.xml) => null
Run Code Online (Sandbox Code Playgroud)

如你所见,詹金斯找不到我的资源.

我错过了什么?

Ste*_*han 9

我终于解决了我的问题.在类路径上,文件/ares/file1.xml在我的代码中被命名,我正在调用该文件/ares/file1.XML.你注意到了大写XML吗?

在Windows上,没有区别,因为文件名不区分大小写.在Linux上,它失败,因为文件名区分大小写.

最后的想法是,当您在不同于目标平台的平台上进行编码时,更喜欢小写文件名.


Bri*_*ick 9

我遇到了类似症状但原因不同且解决方案不同的问题。

在我的情况下,问题是Jenkins服务器是Windows计算机,服务器上到资源位置的完整路径C:\Program Files (x86)\...以空格开头。%20如果需要,这些空间将被编码为,File而不是使用new File(getClass().getResource(fileName).getFile())。这fileName是一个包含资源名称的字符串。我通过添加一个呼叫来解决了这个问题URLDecoder.decode。当没有空格或您不在Windows上时(根据我所见),这不会造成任何问题,但是如果您沿名称的某处留有空格,则可以解决此问题。完整呼叫如下:

 new File(URLDecoder.decode(getClass().getResource(fileName).getFile(), "UTF-8"))
Run Code Online (Sandbox Code Playgroud)

我从几个问题中总结了这些内容,但对于詹金斯案,没有一个将其汇总在一起,因此我在这里回答。其他相关问答: