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

解决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>

排查步骤

  1. 确认profile激活:运行mvn help:active-profiles检查对应平台的profile是否生效。
  2. 查看完整构建计划:使用mvn buildplan:list -Dmaven.buildplan.output=verbose查看所有目标的执行阶段和顺序。
  3. 清理构建目录:执行mvn clean deploy避免残留文件干扰。

内容的提问来源于stack exchange,提问作者Arnault Bonafos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 00:05:15