如何通过Jenkins从源码构建含依赖的Java项目单Jar包
先给你纠偏最核心的认知
Jenkins本身只是流水线调度工具,不负责实现Java项目的编译、打包逻辑。你现在卡壳的根本原因是跳过了Java生态标准构建工具的学习,试图用原生javac命令处理多层目录项目,这完全偏离了业界的通用做法,效率极低且完全没法维护。
关于多层目录Java项目的编译
不要手动拼接javac命令遍历目录,Java生态有成熟的专用构建工具处理这类问题,目前业界主流就两个选择:
- 绝大多数传统企业、存量项目使用Maven,约定大于配置,上手门槛低
- 追求构建速度、多模块复杂项目会用Gradle,灵活性更高
这类工具默认就会递归扫描约定目录下(比如Maven默认的src/main/java路径)所有层级的Java文件,自动处理类之间的依赖顺序、第三方包引用,不需要你手动指定每个文件的路径。
你当前项目里的Lib文件夹存放本地依赖jar,只需要在构建工具的配置文件里声明该目录为本地依赖路径即可。以最容易上手的Maven为例,你只需要在项目根目录创建pom.xml配置文件,定义好项目的JDK版本、依赖规则,之后不管是本地环境还是Jenkins环境,只要执行一条mvn clean compile命令,就会自动完成所有源码的编译,编译生成的class文件会统一输出到target/classes目录,全程不需要你处理目录遍历的逻辑。
Jenkins侧需要做的配置非常少:
- 在Jenkins插件管理中安装对应构建工具的集成插件,在全局工具配置里绑定好服务器上安装的JDK、Maven/Gradle路径
- 新建构建任务,配置好代码拉取地址后,在构建步骤里直接调用Maven/Gradle的对应命令即可,不需要额外写文件遍历、编译的脚本。
关于打包含依赖的单Jar包
同样不需要你手动解压依赖jar、合并class文件、写manifest配置,构建工具的官方插件可以一键完成这类fat jar(包含所有依赖类的独立Jar包)构建:
- 使用Maven的话,配置
maven-assembly-plugin或者maven-shade-plugin,执行mvn package命令时,插件会自动把你项目的编译产物、所有依赖(包括你Lib目录下的本地jar)的class文件合并到同一个Jar中,还可以自动配置启动类信息,生成的包可以直接用java -jar命令启动 - 使用Gradle的话,引入Shadow插件,执行
gradle build即可直接生成对应单Jar包
给你一个可以直接复用的Maven打单Jar的最简配置片段,放到pom.xml的build节点下就行:
<plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <!-- 替换成你自己项目的启动类全限定名 --> <mainClass>com.example.YourMainClass</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>build-fat-jar</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins>
业界Jenkins构建Java项目的通用实践
- 所有编译、打包逻辑全部沉淀在项目代码仓内的构建配置文件(pom.xml/build.gradle)中,Jenkins只负责调用标准构建命令,绝对不要在Jenkins的构建步骤里写长串原生javac、jar操作命令,保证本地开发环境和CI环境构建逻辑完全一致,避免出现“本地能跑CI跑挂”的问题
- 不要长期把依赖包直接扔在项目的Lib目录下提交到代码仓,等你把基础流程跑通后,建议搭一个私有Maven仓库(比如Nexus)统一管理所有第三方依赖、内部公共包,构建时自动从仓库拉取,避免依赖包散落在各个项目里
- 优先使用Jenkinsfile以代码形式定义流水线,直接存在项目代码仓中做版本管理,不要在Jenkins页面上手动点选配置构建步骤,方便后续修改追溯。
学习优先级建议
- 先花1-2天学Maven基础:搞懂Maven生命周期、依赖管理、常用插件的用法,跑通本地编译、打单Jar的流程,这是所有后续操作的基础,比你自己啃javac命令参数效率高得多
- 再学Jenkins基础流水线操作:掌握代码拉取、构建命令调用、构建产物归档的配置,把本地能跑通的Maven构建流程搬到Jenkins上跑通
- 等Maven用熟了,如果后续碰到多模块大项目、构建速度慢的问题,再去了解Gradle也不迟
参考学习方向
- 优先看Maven官方的入门指南,把核心概念(坐标、依赖范围、生命周期、插件绑定)搞透,避免被零散的旧博客内容误导
- 看Jenkins官方的流水线示例,找Java+Maven的最小Demo照着敲,跑通一个完整的构建打包流程再往自己的业务项目上适配
- 打包插件的配置直接看对应插件的官方说明,避免抄到跨版本的无效配置。
内容的提问来源于stack exchange,提问作者Hien Nguyen
相关产品推荐
相关产品推荐

