如何在Maven同一模块中生成Shaded Jar(Uber Jar)与非Shaded Jar并发布至本地仓库?
如何在Maven构建时同时生成Shaded Jar和非Shaded Jar并发布到本地仓库
当然可以!用Maven实现同时生成普通Jar和Shaded(Uber)Jar并发布到本地仓库完全可行,我常用maven-shade-plugin来搞定这个需求,下面是具体的实现步骤和配置示例:
核心思路
Maven默认会生成一个不包含依赖的普通Jar,我们只需要通过maven-shade-plugin额外生成一个带**分类器(classifier)**的Shaded Jar,这样两个Jar会以不同的文件名共存,不会冲突,且都会被安装到本地仓库。
Pom.xml配置示例
在你的项目pom.xml中添加maven-shade-plugin的配置:
<build> <plugins> <!-- Maven默认会生成普通Jar,无需额外配置maven-jar-plugin --> <!-- 配置maven-shade-plugin生成Shaded Jar --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <!-- 使用最新稳定版即可 --> <executions> <execution> <phase>package</phase> <!-- 在package阶段执行shade打包 --> <goals> <goal>shade</goal> </goals> <configuration> <!-- 给Shaded Jar添加分类器,避免和普通Jar重名 --> <classifier>shaded</classifier> <!-- 可选:指定Shaded Jar的主类,方便直接运行 --> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.yourpackage.YourMainClass</mainClass> </transformer> </transformers> <!-- 可选:排除不需要打包进Shaded Jar的文件,比如签名文件 --> <!-- <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> --> </configuration> </execution> </executions> </plugin> </plugins> </build>
构建与验证
执行以下命令完成构建并发布到本地仓库:
mvn clean install
构建完成后,你会在项目的target目录下看到两个Jar文件:
your-artifact-id-1.0.0.jar:非Shaded的普通Jar(仅包含项目自身代码)your-artifact-id-1.0.0-shaded.jar:Shaded的Uber Jar(包含项目代码+所有依赖)
同时,这两个Jar都会被安装到你的Maven本地仓库(默认路径:~/.m2/repository),其他项目可以通过指定分类器来引用对应的Jar:
- 引用普通Jar:直接添加依赖即可,无需额外配置
- 引用Shaded Jar:在依赖中添加
<classifier>shaded</classifier>
注意事项
- 确保
maven-shade-plugin使用稳定版本,避免兼容性问题 - 分类器可以自定义(比如用
uber代替shaded),只要能和普通Jar区分开就行 - 如果项目中还有其他打包插件(比如
spring-boot-maven-plugin),要注意插件执行顺序,避免Jar文件被覆盖
内容的提问来源于stack exchange,提问作者Brandon Kalashian
相关产品推荐
相关产品推荐

