Maven插件执行多个目标需区分原生多goal支持与生命周期绑定:前者依赖插件是否允许同一execution内声明多个goal(如maven-source-plugin支持,maven-compiler-plugin不支持);后者通过多个execution绑定同一phase并按XML顺序执行;命令行方式可用空格分隔plugin:goal但无法复用pom配置;高级场景可利用shade插件transformer机制在单个goal内合并处理。

要让Maven插件在一次构建中执行多个目标(Goal),必须明确区分“单个插件绑定多个目标”和“多个插件目标按序触发”两种场景——前者需依赖插件自身是否支持多目标配置,后者则靠Maven生命周期阶段绑定与执行顺序控制。
确认插件是否原生支持多Goal
不是所有插件都允许同一<execution>内声明多个<goal>。例如maven-compiler-plugin只接受<goal>compile</goal>或<goal>testCompile</goal>单独存在;而maven-source-plugin的jar和test-jar可共存于同一execution中,但需显式列出:
在<executions>块内,用<goals>包裹多个<goal>标签:
<goals><goal>jar</goal><goal>test-jar</goal></goals>
【注意】若插件未在文档中声明支持多goal并行,强行写入会导致构建失败且无明确报错,仅跳过后续goal。
通过绑定到同一生命周期阶段实现串行执行
这是最通用、最可靠的方式:将多个独立的<execution>绑定到同一个phase(如package),Maven会按<executions>在pom.xml中出现的顺序依次执行。
第一步:为每个目标创建独立的<execution>块,指定相同<phase>:
<execution><id>attach-sources</id><phase>package</phase><goals><goal>jar</goal></goals></execution>
第二步:添加第二个<execution>,同样绑定到package阶段,但使用不同<id>和<goal>:
<execution><id>attach-javadoc</id><phase>package</phase><goals><goal>jar</goal></goals><configuration><classifier>javadoc</classifier></configuration></execution>
第三步:确保两个<execution>都在同一<executions>容器下,顺序不可颠倒——Maven严格按XML书写顺序执行同phase的execution。
使用命令行显式指定多个Goal
方法一:用空格分隔多个plugin:goal调用(不推荐用于生产)
执行mvn clean compile source:jar javadoc:javadoctest-jar,会依次触发clean→compile→source插件jar目标→javadoc插件jar目标→source插件test-jar目标。
方法二:结合生命周期阶段与插件目标混合调用
例如mvn package source:jar shade:shade,先走完default生命周期的package阶段,再单独执行source和shade插件的目标——此时shade:shade不会受package阶段配置影响,而是使用插件默认配置或命令行参数。
【关键限制】命令行方式无法复用pom.xml中<configuration>对特定<execution>的定制化设置,除非额外传入-D参数覆盖。
利用maven-shade-plugin的transformer机制合并逻辑
当多个Goal本质是“打包时附加不同资源”,可收归为一个Goal内部处理。例如同时生成fat jar + 源码jar + javadoc jar,不需启动三次jar任务,而是让shade插件在shade Goal内完成全部打包动作:
在<configuration>中启用<createDependencyReducedPom>并配合<transformers>添加Manifest、ServicesResource等处理器,再通过<artifactSet>精确控制哪些依赖打入最终jar。
这一步操作起来很简单,直接把<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>加进<transformers>即可生效。


















