Jenkins执行JUnit测试提示JSON文件不存在但实际存在的问题求助
我之前踩过类似的跨环境文件读取的坑,结合你的情况,给你几个排查和解决的方向,应该能帮你定位问题:
检查代码中加载文件的方式是否正确
很多人习惯用new File("src/test/resources/testfolder/report.json")这种相对路径或绝对路径的方式读取文件,在本地IDE里因为工作目录和项目根目录一致,所以能正常找到,但Jenkins构建时,测试类是编译到target/test-classes目录下的,此时当前工作目录和本地完全不同,即使文件存在也会路径不匹配。
正确的跨环境做法是通过类加载器读取类路径下的资源,示例代码如下:// 方式1:通过当前类的类加载器读取(注意路径开头的斜杠) InputStream inputStream = getClass().getResourceAsStream("/testfolder/report.json"); // 方式2:通过上下文类加载器读取(不需要开头斜杠) InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("testfolder/report.json");Maven/Gradle构建时,
src/test/resources下的文件会自动复制到target/test-classes目录,成为类路径的一部分,用类加载器读取才是不受环境影响的正确姿势。确认Jenkins构建时资源文件是否被正确复制
有时候Maven的构建配置可能会导致资源文件没被复制到target/test-classes目录,你可以在Jenkins的构建步骤中添加一个shell命令,手动检查文件是否存在:ls -l /var/lib/jenkins/workspace/a-project/java-framework/tests/junit/project-test/target/test-classes/testfolder/如果输出里没有
report.json,那就要检查项目的pom.xml(如果是Maven)有没有配置资源过滤或排除规则,比如是否不小心把testfolder目录排除在了资源复制范围外。权限问题的深层排查
你已经执行了chmod 775 -R,但还要确认Jenkins进程的运行用户是谁,通常Jenkins默认用jenkins用户运行,你可以用以下命令查看:ps aux | grep jenkins然后检查目标文件的所属用户和组:
ls -l /var/lib/jenkins/workspace/a-project/java-framework/tests/junit/project-test/target/test-classes/testfolder/report.json如果文件的所属用户是
root而不是jenkins,那即使权限是775,jenkins用户也可能没有读取权限,这时候可以执行以下命令修改整个工作区的所有权:sudo chown -R jenkins:jenkins /var/lib/jenkins/workspace/a-project排查路径大小写问题
Linux系统是大小写敏感的,但Windows和Mac默认不敏感,比如你本地代码里写的是TestFolder/report.json,但实际文件是testfolder/report.json,本地运行没问题,但Linux下就会找不到文件。仔细核对代码中的路径字符串和服务器上实际文件的大小写是否完全一致。
你提到的把JSON内容硬编码到测试类里虽然能临时解决问题,但不是最优方案,以上几个方向应该能帮你找到问题的根源并彻底解决。
内容的提问来源于stack exchange,提问作者J. H

