为什么 Jenkins 无法加载资源?

2022-09-04 07:10:21

这是我的项目布局:

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

下面是 Jenkins 工作区的布局:

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

在日食下,测试运行没有任何错误。在 Jenkins 上,测试只是失败了。Jenkins 无法找到资源。以下是测试执行的一些输出:

日蚀

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

正如你所看到的,詹金斯找不到我的资源。

我错过了什么?


答案 1

我有这个问题,症状相似,但原因不同,解决方案不同。

在我的情况下,问题是Jenkins服务器是一台Windows机器,并且服务器上到资源位置的完整路径以空格开头。这些空格被编码为,如果你需要得到是一个而不是一个流使用.下面是一个字符串,其中包含资源的名称。我通过向 添加对 的调用解决了这个问题。当没有空格或您不在Windows上时(据我所知),这不会产生任何问题,但是如果您在名称中的某个地方获得空格,则可以解决问题。然后,完整的调用是:C:\Program Files (x86)\...%20Filenew File(getClass().getResource(fileName).getFile())fileNameURLDecoder.decode

 new File(URLDecoder.decode(getClass().getResource(fileName).getFile(), "UTF-8"))

我从几个问题中拼凑出来,但没有一个问题能为詹金斯案把它们放在一起,因此我在这里的答案。其他相关问答:


答案 2

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

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

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


推荐