Maven执行assembly:single未指定executionId报错,如何批量生成所有压缩包?
问题描述
某Maven项目的pom.xml中maven-assembly-plugin配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <appendAssemblyId>false</appendAssemblyId> <formats> <format>zip</format> </formats> </configuration> <executions> <execution> <id>generate-scripts-package</id> <goals> <goal>single</goal> </goals> <phase>package</phase> <configuration> <descriptors> <descriptor>src/main/assembly/script.xml</descriptor> </descriptors> </configuration> </execution> <execution> <id>rest-runtime-scripts-secondary-package</id> <phase>secondary-generate-resources</phase> <goals> <goal>single</goal> </goals> <configuration> <includes> <include>computeClasspath.sh</include> </includes> <descriptors> <descriptor>src/main/assembly/script.xml</descriptor> </descriptors> <outputDirectory>${project.build.directory}/tempscript</outputDirectory> <formats> <format>dir</format> </formats> <ignoreDirFormatExtensions>true</ignoreDirFormatExtensions> <attach>false</attach> </configuration> </execution> </executions> </plugin>
- 执行
mvn package可正常生成压缩包,但因性能问题无法使用该命令 - 执行
mvn jar:jar jar:test-jar assembly:single时触发错误:Error reading assemblies: No assembly descriptors found - 指定executionId执行
mvn jar:jar jar:test-jar assembly:single@generate-scripts-package可生成对应压缩包,但从父pom执行时无法指定executionId,需要不指定executionId即可触发所有assembly执行逻辑
解决方案
方案1:添加全局默认Descriptor配置
将descriptor配置移到插件的全局configuration节点,让assembly:single命令默认能找到描述文件。同时保留两个execution的独立配置,确保各自的逻辑不受影响:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <appendAssemblyId>false</appendAssemblyId> <formats> <format>zip</format> </formats> <!-- 全局默认的descriptor配置 --> <descriptors> <descriptor>src/main/assembly/script.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>generate-scripts-package</id> <goals> <goal>single</goal> </goals> <phase>package</phase> <!-- 可保留该配置,也可省略,全局配置已覆盖 --> <configuration> <descriptors> <descriptor>src/main/assembly/script.xml</descriptor> </descriptors> </configuration> </execution> <execution> <id>rest-runtime-scripts-secondary-package</id> <phase>secondary-generate-resources</phase> <goals> <goal>single</goal> </goals> <configuration> <includes> <include>computeClasspath.sh</include> </includes> <descriptors> <descriptor>src/main/assembly/script.xml</descriptor> </descriptors> <outputDirectory>${project.build.directory}/tempscript</outputDirectory> <formats> <format>dir</format> </formats> <ignoreDirFormatExtensions>true</ignoreDirFormatExtensions> <attach>false</attach> </configuration> </execution> </executions> </plugin>
执行mvn jar:jar jar:test-jar assembly:single即可生成zip包;若要触发第二个execution,可结合方案2或3。
方案2:自定义Profile绑定所有Assembly执行
创建一个专用Profile,将两个assembly的execution绑定到同一个生命周期阶段(比如process-classes),执行时激活该Profile即可一次性触发所有逻辑:
<profiles> <profile> <id>assemble-all</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <id>generate-scripts-package</id> <goals> <goal>single</goal> </goals> <phase>process-classes</phase> <configuration> <appendAssemblyId>false</appendAssemblyId> <formats> <format>zip</format> </formats> <descriptors> <descriptor>src/main/assembly/script.xml</descriptor> </descriptors> </configuration> </execution> <execution> <id>rest-runtime-scripts-secondary-package</id> <goals> <goal>single</goal> </goals> <phase>process-classes</phase> <configuration> <includes> <include>computeClasspath.sh</include> </includes> <descriptors> <descriptor>src/main/assembly/script.xml</descriptor> </descriptors> <outputDirectory>${project.build.directory}/tempscript</outputDirectory> <formats> <format>dir</format> </formats> <ignoreDirFormatExtensions>true</ignoreDirFormatExtensions> <attach>false</attach> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
执行命令:mvn jar:jar jar:test-jar -Passemble-all,即可触发两个assembly执行,生成对应的zip包和目录。
方案3:用Maven Invoker插件批量执行目标
添加maven-invoker-plugin,在其配置中指定要执行的两个assembly目标,执行时只需调用invoker的run目标即可:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-invoker-plugin</artifactId> <version>3.5.0</version> <executions> <execution> <id>run-all-assemblies</id> <goals> <goal>run</goal> </goals> <configuration> <pomFile>pom.xml</pomFile> <goals> <goal>assembly:single@generate-scripts-package</goal> <goal>assembly:single@rest-runtime-scripts-secondary-package</goal> </goals> </configuration> </execution> </executions> </plugin>
执行命令:mvn jar:jar jar:test-jar invoker:run,invoker插件会自动执行两个指定的assembly目标,无需手动指定executionId。
内容的提问来源于stack exchange,提问作者Kevin Nammour
相关产品推荐
相关产品推荐

