为什么Jenkins无法加载资源?

时间:2015-11-13 11:41:02

标签: java eclipse jenkins junit m2e

这是我项目的布局:

src/
  test/
    resources/
        ares/
          file1.xml
          file2.xml

以下是Jenkins工作区的布局:

 my-module/
   target/
     test-classes/
       ares/
         file1.xml
         file2.xml

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

的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

詹金斯

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

正如您所见,詹金斯找不到我的资源。

我错过了什么?

3 个答案:

答案 0 :(得分:7)

我终于解决了我的问题。在类路径上,文件名为/ares/file1.xml,而在我的代码中,我调用文件/ares/file1.XML。您是否注意到大写的XML

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

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

答案 1 :(得分:6)

我有类似症状但不同原因和不同解决方案的这个问题。

在我的情况下,问题是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"))

我从几个问题拼凑起来,但没有一个人把它全部放在一起用于詹金斯的案子,因此我的答案在这里。其他相关的Q& A:

答案 2 :(得分:1)

自从我半天困惑之后,我两次来这里解决问题之前,我想我会添加什么解决方案来帮助未来的旅行者。

Jenkins上作业名称中的空格将中断Java项目中资源文件的加载。除非您只是为了安抚詹金斯而专门编写了不同的加载代码。

我将其归结为一个非常沮丧的建议:不要在JANK项目的JENKINS职位名称中留空格。

您可以总结两点...

一个,如果您在詹金斯工作的名称中放置一个空格,那么詹金斯就不会假牙来隐藏该空格。因此,将您的工作称为“我的出色新工作”,该工作的路径将变为/home/jenkins/My%Awesome%New%20Job

两个,如果您的资源路径中包含%20,则您的代码将需要对资源路径进行URL解码,以便能够加载资源。就像在我到达的另一个答案中一样:https://stackoverflow.com/a/43269197/222163

在我的情况下,这些资源文件仅用于测试,因此我只是用连字符替换了工作名称中的空格。