如何指定Maven插件执行顺序?解决copy-rename与launch4j执行顺序冲突
解决Maven插件执行顺序的坑
嘿,这个问题我之前也踩过!Maven里如果不明确控制插件的执行顺序,很容易出现像你这样的情况:两次copy-rename-maven-plugin都跑到launch4j前面,导致第二次复制时EXE还没生成。下面给你两种靠谱的解决方案:
方案1:用生命周期阶段控制顺序
Maven的生命周期是有固定执行顺序的,我们可以把三个步骤分别绑定到递进的阶段,确保前一步完成后再执行下一步:
- 第一次复制Jar包:绑定到
package阶段——因为Jar包是在package阶段生成的,这个阶段结束后立刻复制,刚好能拿到最新的Jar。 - 生成EXE文件:绑定到
verify阶段——这个阶段在package之后,能确保Jar已经复制到指定目录,launch4j可以正常读取。 - 第二次复制并重命名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
相关产品推荐
相关产品推荐

