这是我的项目布局:
src/
test/
resources/
ares/
file1.xml
file2.xml
这是 Jenkins 工作区的布局:
my-module/
target/
test-classes/
ares/
file1.xml
file2.xml
在 eclipse 下,测试运行没有任何错误。 在 Jenkins 上,测试只是失败了。 Jenkins 无法定位资源。 以下是测试执行的一些输出:
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
Jenkins
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
如您所见,Jenkins 没有找到我的资源。
我错过了什么?
最佳答案
我遇到了类似症状但不同原因和不同解决方案的问题。
在我的例子中,问题是 Jenkins 服务器是一台 Windows 机器,服务器上到资源位置的完整路径以 C:\Program Files (x86)\...
有空格。如果您需要使用 new File(getClass().getResource(fileName)) 作为
。这里的 File
而不是流,这些空格将被编码为 %20
。 getFile())fileName
是一个包含资源名称的字符串。我通过添加对 URLDecoder.decode
的调用解决了这个问题。当没有空格或您不在 Windows 上时(据我所知),这不会产生任何问题,但如果您在该行的某处名称中有空格,则可以解决问题。完整的调用是:
new File(URLDecoder.decode(getClass().getResource(fileName).getFile(), "UTF-8"))
我从几个问题中拼凑了这个,但没有一个问题将它们拼凑起来用于 Jenkins 案例,因此我在这里回答。其他相关问答:
关于java - 为什么 Jenkins 无法加载资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33691950/