为何指定maven-assembly-plugin后Maven仍运行maven-jar-plugin?
问题原因与解决方案
核心问题1:插件配置位置错误
你把maven-assembly-plugin放在了<pluginManagement>标签里,这个标签仅负责统一管理插件的版本和配置模板,不会让插件实际参与Maven的构建生命周期。只有直接放在<build>下的<plugins>标签内的插件,才会被Maven执行。
核心问题2:默认插件绑定未被禁用
对于jar打包类型的项目,Maven会默认绑定maven-jar-plugin的jar目标到package阶段,哪怕你在<pluginManagement>里注释了它,Maven还是会调用默认版本的该插件完成jar打包。
修正后的POM配置
把maven-assembly-plugin移到<build>下的<plugins>中,同时如果需要完全禁用默认的jar插件执行,可以添加禁用配置:
<?xml version="1.0" encoding="UTF-8"?> <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"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.sortlist</groupId> <artifactId>sort-list</artifactId> <version>1.0-SNAPSHOT</version> <name>sort-list</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <!-- clean lifecycle --> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- default lifecycle, jar packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <!-- 保留jar插件的版本管理即可,无需注释 --> <plugin> <artifactId>maven-jar-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> <!-- site lifecycle --> <plugin> <artifactId>maven-site-plugin</artifactId> <version>3.7.1</version> </plugin> <plugin> <artifactId>maven-project-info-reports-plugin</artifactId> <version>3.0.0</version> </plugin> </plugins> </pluginManagement> <!-- 新增直接的plugins标签,放置实际要执行的插件 --> <plugins> <!-- 配置maven-assembly-plugin参与构建 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.1.1</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.mycompany.sortlist.App</mainClass> </manifest> </archive> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> <!-- 可选:完全禁用默认的maven-jar-plugin执行 --> <plugin> <artifactId>maven-jar-plugin</artifactId> <executions> <execution> <id>default-jar</id> <phase>none</phase> </execution> </executions> </plugin> </plugins> </build> </project>
验证效果
执行mvn clean package后,控制台会出现maven-assembly-plugin的执行日志:
- 如果未禁用jar插件,
target目录会生成两个jar包:普通jar包(来自默认插件)、带所有依赖的可执行jar包(来自assembly插件) - 如果禁用了默认jar插件,只会生成带依赖的可执行jar包
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

