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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:36:55