这是我项目的布局:
src/
test/
resources/
ares/
file1.xml
file2.xml
以下是Jenkins工作区的布局:
my-module/
target/
test-classes/
ares/
file1.xml
file2.xml
在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
正如您所见,詹金斯找不到我的资源。
我错过了什么?
答案 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
在我的情况下,这些资源文件仅用于测试,因此我只是用连字符替换了工作名称中的空格。