如何将多模块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
相关产品推荐
相关产品推荐

