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

如何将多模块Maven微服务项目合并为单个Jar包?(Assembly插件无效)

解决多模块Maven微服务打包成单个Jar的问题

你在父pom里配置maven-assembly-plugin没生效的核心原因是:父项目的打包类型是pom,这类项目本身不会生成可执行产物,插件配置不会被触发执行。要实现整合所有微服务的Jar包,你需要单独创建一个专门用于打包的聚合模块,而不是在父pom里配置插件。

下面是具体实现步骤:

步骤1:创建聚合打包模块

在你的Maven项目根目录下,新建一个模块(比如命名为all-microservices),它的pom.xml需要满足:

  • 打包类型为jar
  • 依赖所有你要整合的微服务模块

示例pom.xml核心内容:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>你的父项目groupId</groupId>
        <artifactId>父项目artifactId</artifactId>
        <version>父项目版本</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>all-microservices</artifactId>
    <packaging>jar</packaging>

    <dependencies>
        <!-- 引入所有微服务模块依赖 -->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>microservice-a</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>microservice-b</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!-- 其他微服务模块... -->
    </dependencies>
</project>

步骤2:选择合适的打包插件

这里提供两种常用方案,根据你的需求选择:

方案一:使用maven-assembly-plugin(修正你的配置)

把你之前的插件配置放到这个新模块的pom.xml的<build>节点下,而不是父pom。如果你的微服务是Spring Boot项目,jar-with-dependencies可能会和Spring Boot的打包结构冲突,这种情况更推荐方案二。

修正后的插件配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <finalName>all-microservices</finalName>
                <appendAssemblyId>false</appendAssemblyId>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <!-- 这里要指定一个有效的启动类,如果是多服务,需要自己写一个统一启动入口 -->
                        <mainClass>com.example.UnifiedMainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

方案二:使用maven-shade-plugin(更适合多模块依赖冲突场景)

如果你的微服务模块存在重复依赖、类冲突等问题,maven-shade-plugin能更好地处理这些情况,它支持合并资源、重命名冲突类等操作。

配置示例:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.4.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <createDependencyReducedPom>false</createDependencyReducedPom>
                        <finalName>all-microservices</finalName>
                        <transformers>
                            <!-- 指定主类 -->
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.example.UnifiedMainClass</mainClass>
                            </transformer>
                            <!-- 合并Spring Boot的配置文件(如果是Spring Boot项目) -->
                            <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.handlers</resource>
                            </transformer>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.schemas</resource>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

步骤3:执行打包命令

在项目根目录执行Maven打包命令:

mvn clean package -DskipTests

打包完成后,你会在all-microservices/target目录下找到生成的all-microservices.jar。

注意事项

  • 如果你的微服务是Spring Boot项目,每个服务原本是可执行Jar,整合到单个Jar后需要一个统一的启动类,来初始化所有服务的上下文;或者你可以通过配置让Spring Boot同时启动多个服务。
  • 多模块整合打包可能会遇到依赖冲突、资源文件重复等问题,需要根据实际情况调整插件的配置(比如shade的transformer来合并资源)。

内容的提问来源于stack exchange,提问作者Sagar Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:37:51