GitLab CI执行Jar打包步骤报错,请求排查问题原因
GitLab CI Java Jar构建报NoSuchFileException的解决
问题背景
GitLab CI构建步骤配置如下:
jar-java: stage: build image: openjdk:latest script: - javac *.java -d target/ - jar cf build/Main.jar target/*.class artifacts: paths: - target - build/*
执行时抛出文件不存在异常:
$ javac *.java -d target/ $ jar cf build/Main.jar target/*.class java.nio.file.NoSuchFileException: /tmp/Main.jar11521148926419944790.jar -> build/Main.jar at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92) at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106) at java.base/sun.nio.fs.UnixCopyFile.move(UnixCopyFile.java:477) at java.base/sun.nio.fs.UnixFileSystemProvider.move(UnixFileSystemProvider.java:266) at java.base/java.nio.file.Files.move(Files.java:1432) at jdk.jartool/sun.tools.jar.Main.validateAndClose(Main.java:458) at jdk.jartool/sun.tools.jar.Main.run(Main.java:325) at jdk.jartool/sun.tools.jar.Main.main(Main.java:1687)
问题原因
jar cf build/Main.jar target/*.class命令中,build目录不存在。jar工具会先在临时目录生成Jar包,之后尝试将其移动到指定的目标路径,但如果目标路径的父目录(这里是build)不存在,就会触发NoSuchFileException——jar工具不会自动创建目标路径的父目录。
解决方案
在执行jar命令前,先创建build目录,使用mkdir -p build(-p参数确保即使父目录不存在也不会报错)。修改后的CI配置如下:
jar-java: stage: build image: openjdk:latest script: - javac *.java -d target/ - mkdir -p build - jar cf build/Main.jar target/*.class artifacts: paths: - target - build/*
额外验证点
- 确认项目根目录下存在
.java文件,避免javac *.java没有编译任何文件导致后续target/*.class为空(当前报错并非此原因,但属于常见构建坑) - 检查GitLab CI runner的工作目录权限,确保当前用户有创建目录和写入文件的权限
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

