如何使用Maven Shaded插件在不同构件中包含或排除文件
我来帮你梳理下在这个单体仓库场景下,用Maven Shaded插件构建uber jar的具体配置和实操要点:
1. 先确保单体仓库的构建顺序正确
因为Project-A依赖Project-B和Project-C,Maven需要先构建这两个依赖项目,再处理Project-A。如果你的单体仓库是多模块结构,记得在父pom的modules节点里按依赖顺序声明模块:
<!-- 父pom.xml 中的modules配置 --> <modules> <module>Project-B</module> <module>Project-C</module> <module>Project-A</module> </modules>
这样Maven Reactor会自动按顺序构建所有模块,避免出现依赖未编译的问题。
2. 在Project-A的Maven Profile中配置Shaded插件
你已经创建了Profile,现在把Shaded插件配置到这个Profile里,指定主类、依赖包含规则,还要处理常见的资源冲突问题:
<!-- Project-A的pom.xml 中的Profile配置 --> <profiles> <profile> <id>uber-jar</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.1</version> <!-- 建议使用最新稳定版本 --> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 指定你的主类,让生成的uber jar可以直接运行 --> <mainClass>com.sample.project.projecta.MainClass</mainClass> <!-- 明确包含依赖的项目(可选,但能避免意外引入无关依赖) --> <includes> <include>com.sample.project:Project-B</include> <include>com.sample.project:Project-C</include> </includes> <!-- 处理META-INF下的冲突资源,比如服务发现文件、Spring配置文件 --> <transformers> <!-- 合并META-INF/services下的文件 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <!-- 重新生成Manifest文件,指定主类 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.sample.project.projecta.MainClass</mainClass> </transformer> <!-- 如果有Spring factories文件,需要合并而不是覆盖 --> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.factories</resource> </transformer> </transformers> <!-- 生成带"uber"后缀的jar,保留原始jar作为备份 --> <shadedArtifactAttached>true</shadedArtifactAttached> <shadedClassifierName>uber</shadedClassifierName> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
3. 执行构建命令
在仓库根目录运行以下命令,激活uber-jar Profile并构建所有模块:
mvn clean install -P uber-jar
执行完成后,你会在Project-A的target目录下看到类似Project-A-1.5.0-uber.jar的文件,这就是包含所有依赖的可执行uber jar。
4. 关键注意事项
- 统一版本管理:因为三个项目共享同一groupId,建议在父pom的
dependencyManagement节点统一管理版本,避免版本冲突:
<!-- 父pom.xml的dependencyManagement配置 --> <dependencyManagement> <dependencies> <dependency> <groupId>com.sample.project</groupId> <artifactId>Project-B</artifactId> <version>1.5.0</version> </dependency> <dependency> <groupId>com.sample.project</groupId> <artifactId>Project-C</artifactId> <version>1.5.0</version> </dependency> <dependency> <groupId>com.sample.project</groupId> <artifactId>Project-A</artifactId> <version>1.5.0</version> </dependency> </dependencies> </dependencyManagement>
- 处理重复资源:如果Project-B和Project-C有同名资源文件(比如日志配置文件),默认会被覆盖,需要添加对应的Transformer(比如
XmlAppendingTransformer)来合并内容。 - 跳过测试(可选):如果构建时想跳过测试环节,可以添加
-DskipTests参数:
mvn clean install -P uber-jar -DskipTests
内容的提问来源于stack exchange,提问作者gihan-maduranga
相关产品推荐
相关产品推荐

