You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 06:17:34