Maven多模块构建fat jar时为何默认用maven-jar-plugin而非shade插件?
Maven打包未触发maven-shade-plugin,默认执行maven-jar-plugin的原因
问题描述
我需要用Maven构建两个依赖于第三个模块的项目,将每个模块打包成独立的fat jar。但执行mvn package时,系统没有调用maven-shade-plugin,反而默认执行了maven-jar-plugin:2.4:jar(default-jar),我并没有在任何地方配置这个插件,这是为什么?
父项目POM
<groupId>com.firstproject.myapp</groupId> <artifactId>parent-project</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>Player Communication Parent Project</name> <modules> <module>simple-message</module> <module>simple-client</module> <module>simple-server</module> </modules> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties> <dependencies> </dependencies> <build> </build> </project>
simple-client模块POM
<build> <finalName>Server</finalName> <pluginManagement> <plugins> <!-- Maven JAR Plugin for TCPServer --> <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> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.firstproject.myapp.AppServer</mainClass> </transformer> </transformers> <minimizeJar>false</minimizeJar> <createDependencyReducedPom>false</createDependencyReducedPom> <dependencyReducedPomLocation> ${java.io.tmpdir}/dependency-reduced-pom.xml </dependencyReducedPomLocation> <relocations> <relocation> <pattern>com.firstproject.myapp</pattern> <shadedPattern>hidden.coyote</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin> </plugins> </pluginManagement> </build>
原因分析
- maven-jar-plugin是Maven默认绑定插件:对于
jar打包类型的模块,Maven的package生命周期阶段会默认绑定maven-jar-plugin的jar目标,这是Maven内置的生命周期规则,无需手动配置就会执行。 - pluginManagement仅做配置声明,不实际执行:你把maven-shade-plugin放在了
<pluginManagement>标签内,这个标签的作用是统一管理插件的版本、配置模板,不会让插件实际参与构建流程。只有将插件直接放在<build><plugins>节点下,Maven才会在对应生命周期阶段执行该插件的目标。
解决方案
修改simple-client模块的POM,将maven-shade-plugin从<pluginManagement>中移出,直接放到<build><plugins>节点下:
<build> <finalName>Server</finalName> <!-- 若需统一管理插件版本,可保留pluginManagement;无需则可移除 --> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> </plugin> </plugins> </pluginManagement> <!-- 此处为实际启用插件的配置 --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.firstproject.myapp.AppServer</mainClass> </transformer> </transformers> <minimizeJar>false</minimizeJar> <createDependencyReducedPom>false</createDependencyReducedPom> <dependencyReducedPomLocation> ${java.io.tmpdir}/dependency-reduced-pom.xml </dependencyReducedPomLocation> <relocations> <relocation> <pattern>com.firstproject.myapp</pattern> <shadedPattern>hidden.coyote</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin> </plugins> </build>
若不需要统一管理插件版本,也可直接将整个插件配置放到<plugins>下,删除pluginManagement中的对应内容。修改后执行mvn package,Maven会先执行默认的maven-jar-plugin生成普通jar,再执行maven-shade-plugin的shade目标生成包含依赖的fat jar。
内容的提问来源于stack exchange,提问作者flying_kaktus
相关产品推荐
相关产品推荐

