解决Maven中jpackage执行前unpack-dependencies未执行的问题
解决Maven中unpack-dependencies在jpackage之后执行的问题
核心原因
Maven在同一阶段内的目标执行顺序取决于它们在POM中的声明顺序。由于你的maven-dependency-plugin配置在profile中,而jpackage-maven-plugin在主build块中,profile的配置会在主build之后被加载,导致unpack操作被追加到deploy阶段的末尾,晚于jpackage执行。
解决方案1:绑定到pre-deploy阶段
将unpack-dependencies绑定到pre-deploy生命周期阶段(该阶段在deploy之前立即执行),确保JDK解压完成后再运行jpackage。
在你的platform-windows/platform-linux profile中配置:
<profile> <id>platform-windows</id> <activation> <os> <family>Windows</family> </os> </activation> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>unpack-windows-jdk</id> <!-- 绑定到pre-deploy阶段 --> <phase>pre-deploy</phase> <goals> <goal>unpack-dependencies</goal> </goals> <configuration> <!-- 你的JDK依赖配置 --> <includeGroupIds>你的JDK组ID</includeGroupIds> <includeArtifactIds>windows-jdk-artifact</includeArtifactIds> <outputDirectory>${jdkUnzipDir}</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile>
验证执行顺序:运行mvn clean deploy -Pplatform-windows -Dmaven.buildplan.showAll,确认unpack-dependencies出现在pre-deploy阶段,且早于deploy阶段的jpackage目标。
解决方案2:绑定到更早的生命周期阶段
如果pre-deploy阶段绑定无效,可将unpack操作绑定到package阶段(该阶段远早于deploy):
<phase>package</phase>
此方式能确保JDK在打包阶段就完成解压,完全避免deploy阶段的顺序问题。
解决方案3:强制同一阶段内的执行顺序
若必须将两个目标都留在deploy阶段,可将maven-dependency-plugin的配置移到主build块中,通过profile激活执行,确保它在jpackage之前声明:
<build> <!-- 先声明依赖插件,确保先执行 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>unpack-jdk</id> <phase>deploy</phase> <goals> <goal>unpack-dependencies</goal> </goals> <configuration> <!-- 通用配置,通过profile覆盖特定参数 --> <outputDirectory>${jdkUnzipDir}</outputDirectory> </configuration> <activation> <activeByDefault>false</activeByDefault> <os> <family>${jdk.os.family}</family> </os> </activation> </execution> </executions> </plugin> <!-- 后声明jpackage插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>jpackage-maven-plugin</artifactId> <executions> <execution> <id>create-installer</id> <phase>deploy</phase> <goals> <goal>jpackage</goal> </goals> <configuration> <!-- jpackage配置,指向${jdkUnzipDir} --> </configuration> </execution> </executions> </plugin> </build> <profiles> <profile> <id>platform-windows</id> <activation> <os> <family>Windows</family> </os> </activation> <properties> <jdk.os.family>Windows</jdk.os.family> <jdkUnzipDir>${project.build.directory}/jdk-windows</jdkUnzipDir> </properties> </profile> <profile> <id>platform-linux</id> <activation> <os> <family>Linux</family> </os> </activation> <properties> <jdk.os.family>Linux</jdk.os.family> <jdkUnzipDir>${project.build.directory}/jdk-linux</jdkUnzipDir> </properties> </profile> </profiles>
排查步骤
- 确认profile激活:运行
mvn help:active-profiles检查对应平台的profile是否生效。 - 查看完整构建计划:使用
mvn buildplan:list -Dmaven.buildplan.output=verbose查看所有目标的执行阶段和顺序。 - 清理构建目录:执行
mvn clean deploy避免残留文件干扰。
内容的提问来源于stack exchange,提问作者Arnault Bonafos
相关产品推荐
相关产品推荐

