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)
如你所见,詹金斯找不到我的资源.
我错过了什么?
我终于解决了我的问题.在类路径上,文件/ares/file1.xml在我的代码中被命名,我正在调用该文件/ares/file1.XML.你注意到了大写XML吗?
在Windows上,没有区别,因为文件名不区分大小写.在Linux上,它失败,因为文件名区分大小写.
最后的想法是,当您在不同于目标平台的平台上进行编码时,更喜欢小写文件名.
我遇到了类似症状但原因不同且解决方案不同的问题。
在我的情况下,问题是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)
我从几个问题中总结了这些内容,但对于詹金斯案,没有一个将其汇总在一起,因此我在这里回答。其他相关问答: