Maven官方仓库是否发布Fat Jar?部署Java应用该选哪种Jar?
关于Maven仓库发布Fat Jar还是瘦Jar的问题
嘿,这个问题问到点子上了——Jar包的类型选择直接关系到你的项目在Maven生态里的易用性,咱们一步步说清楚:
先搞懂两种Jar的核心区别
- 瘦Jar(不含依赖的Jar):只包含你自己编写的代码、配置和资源文件,体积小巧(就像你看到的JUnit 4.12,只有307KB)。它依赖的第三方库会通过Maven的依赖管理机制,由使用者的项目自动拉取。
- Fat Jar(Uber Jar):把项目本身和所有依赖的第三方类库都打包进同一个Jar里,体积大,但能直接通过
java -jar命令独立运行。不过它的致命问题是不适合被其他项目当作依赖引用——会导致严重的版本冲突(比如你的Fat Jar里包含了Guava 28,而引用你的项目用了Guava 30,就会出现类版本不兼容的问题)。
业内通用的发布策略
- 如果你的项目是类库/框架(比如JUnit、MyBatis这类,用来给其他项目做依赖的):必须发布瘦Jar。这是Maven生态的共识,类库的核心价值是提供可复用的功能,而不是把所有依赖都打包进来——把依赖管理交给Maven,能最大程度避免使用者的项目出现依赖冲突。
- 如果你的项目是可独立运行的应用(比如Spring Boot Web应用):通常会同时发布两种Jar。比如Spring Boot的Maven插件会自动生成两个Jar:一个是可直接运行的Fat Jar(文件名一般是
xxx.jar),另一个是瘦Jar(文件名一般是xxx.jar.original)。这样既满足用户直接运行的需求,也方便其他项目集成你的应用模块。
官方Maven中央仓库是否接受Fat Jar?
官方Maven中央仓库几乎不接受Fat Jar,除非是那种明确为独立运行设计、且绝对不会被当作依赖的特殊项目(这种情况非常罕见)。中央仓库的审核标准严格遵循Maven的依赖管理理念,瘦Jar才是符合规范的发布方式——它能保证整个生态的依赖一致性,避免重复打包和版本冲突。
给你的小建议
- 如果是类库项目:在
pom.xml里准确声明所有<dependency>,确保依赖范围(比如compile、test)设置正确,然后直接发布瘦Jar即可。 - 如果是独立应用:用Maven插件(比如
spring-boot-maven-plugin)生成Fat Jar供用户直接运行,同时保留瘦Jar的发布,方便其他项目集成。
内容的提问来源于stack exchange,提问作者Aimee
相关产品推荐
相关产品推荐

