You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 19:22:30