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

如何指定Maven插件执行顺序?解决copy-rename与launch4j执行顺序冲突

解决Maven插件执行顺序的坑

嘿,这个问题我之前也踩过!Maven里如果不明确控制插件的执行顺序,很容易出现像你这样的情况:两次copy-rename-maven-plugin都跑到launch4j前面,导致第二次复制时EXE还没生成。下面给你两种靠谱的解决方案:

方案1:用生命周期阶段控制顺序

Maven的生命周期是有固定执行顺序的,我们可以把三个步骤分别绑定到递进的阶段,确保前一步完成后再执行下一步:

  1. 第一次复制Jar包:绑定到package阶段——因为Jar包是在package阶段生成的,这个阶段结束后立刻复制,刚好能拿到最新的Jar。
  2. 生成EXE文件:绑定到verify阶段——这个阶段在package之后,能确保Jar已经复制到指定目录,launch4j可以正常读取。
  3. 第二次复制并重命名EXE:同样绑定到verify阶段,但要把这个插件配置在launch4j后面,这样EXE生成后才会执行重命名。

给你贴个具体的POM配置片段:

<build>
  <plugins>
    <!-- 第一步:把刚生成的Jar复制到目标目录 -->
    <plugin>
      <groupId>com.coderplus.maven.plugins</groupId>
      <artifactId>copy-rename-maven-plugin</artifactId>
      <version>1.0.1</version>
      <executions>
        <execution>
          <id>copy-jar-to-target</id>
          <phase>package</phase>
          <goals>
            <goal>copy</goal>
          </goals>
          <configuration>
            <sourceFile>${project.build.directory}/${project.build.finalName}.jar</sourceFile>
            <destinationFile>${project.build.directory}/custom-folder/${project.build.finalName}.jar</destinationFile>
          </configuration>
        </execution>
      </executions>
    </plugin>

    <!-- 第二步:用launch4j生成包裹Jar的EXE -->
    <plugin>
      <groupId>com.akathist.maven.plugins.launch4j</groupId>
      <artifactId>launch4j-maven-plugin</artifactId>
      <version>2.2.0</version>
      <executions>
        <execution>
          <id>build-exe</id>
          <phase>verify</phase>
          <goals>
            <goal>launch4j</goal>
          </goals>
          <configuration>
            <jar>${project.build.directory}/custom-folder/${project.build.finalName}.jar</jar>
            <outfile>${project.build.directory}/app.exe</outfile>
            <!-- 这里补充你的launch4j其他配置,比如图标、JRE参数等 -->
          </configuration>
        </execution>
      </executions>
    </plugin>

    <!-- 第三步:把生成的EXE重命名为SCR -->
    <plugin>
      <groupId>com.coderplus.maven.plugins</groupId>
      <artifactId>copy-rename-maven-plugin</artifactId>
      <version>1.0.1</version>
      <executions>
        <execution>
          <id>rename-exe-to-scr</id>
          <phase>verify</phase>
          <goals>
            <goal>rename</goal>
          </goals>
          <configuration>
            <sourceFile>${project.build.directory}/app.exe</sourceFile>
            <destinationFile>${project.build.directory}/custom-folder/app.scr</destinationFile>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

方案2:同一阶段内按配置顺序执行

如果你希望所有步骤都在package阶段完成,那只要保证三个插件的配置顺序是复制Jar → 生成EXE → 复制重命名EXE就行。Maven在同一个生命周期阶段里,会严格按照POM中插件出现的顺序执行,同一个插件的多个execution也会按配置顺序来。

配置示例大概是这样:

<build>
  <plugins>
    <!-- 第一步:复制Jar -->
    <plugin>
      <groupId>com.coderplus.maven.plugins</groupId>
      <artifactId>copy-rename-maven-plugin</artifactId>
      <version>1.0.1</version>
      <executions>
        <execution>
          <id>copy-jar</id>
          <phase>package</phase>
          <goals><goal>copy</goal></goals>
          <!-- 复制配置参数 -->
        </execution>
      </executions>
    </plugin>

    <!-- 第二步:生成EXE -->
    <plugin>
      <groupId>com.akathist.maven.plugins.launch4j</groupId>
      <artifactId>launch4j-maven-plugin</artifactId>
      <version>2.2.0</version>
      <executions>
        <execution>
          <id>generate-exe</id>
          <phase>package</phase>
          <goals><goal>launch4j</goal></goals>
          <!-- launch4j配置参数 -->
        </execution>
      </executions>
    </plugin>

    <!-- 第三步:重命名EXE为SCR -->
    <plugin>
      <groupId>com.coderplus.maven.plugins</groupId>
      <artifactId>copy-rename-maven-plugin</artifactId>
      <version>1.0.1</version>
      <executions>
        <execution>
          <id>exe-to-scr</id>
          <phase>package</phase>
          <goals><goal>rename</goal></goals>
          <!-- 重命名配置参数 -->
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

几个要注意的点

  • 每个execution一定要设置唯一的id,不然Maven可能会跳过重复的执行配置哦
  • 确认launch4j的jar参数指向的是第一次复制后的Jar路径,别写错了导致找不到文件
  • 测试的时候可以用mvn clean verify(方案1)或者mvn clean package(方案2),看看日志里的执行顺序是不是符合预期

内容的提问来源于stack exchange,提问作者Pablo Fernandez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:44:01