如何为Launch4j搭配JRE?Maven自动复制JRE至指定目录方法咨询
用Maven自动复制JDK中的JRE到指定目录(配合Launch4j)
当然可以实现!下面我会一步步教你怎么配置Maven,自动把构建应用所用JDK中的JRE复制到指定目录,完美配合Launch4j生成的.exe文件:
1. 先明确JRE的路径来源
Maven内置了系统属性${java.home},它指向的就是当前Maven构建所使用的JDK中的JRE目录(比如Oracle JDK 8的jdk1.8.0_xxx/jre)。我们可以直接用这个属性来定位JRE,不用硬编码路径。
2. 完善maven-resources-plugin配置
你之前尝试的插件方向是对的,我给你补全并优化配置,确保能正确复制JRE的所有文件:
<plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.3.1</version> <!-- 建议用新版本,兼容性和稳定性更好 --> <executions> <execution> <id>copy-jre-to-dist</id> <phase>package</phase> <!-- 绑定到打包阶段,和Launch4j同步执行 --> <goals> <goal>copy-resources</goal> </goals> <configuration> <!-- 目标目录:设置成和最终生成的.exe同级的位置,比如dist/jre --> <outputDirectory>${project.build.directory}/dist/jre</outputDirectory> <resources> <resource> <directory>${java.home}</directory> <!-- 源路径:当前JDK的JRE目录 --> <includes> <include>**/*</include> <!-- 复制JRE下所有文件和子目录 --> </includes> <filtering>false</filtering> <!-- 必须设为false,避免破坏JRE的二进制文件 --> </resource> </resources> </configuration> </execution> </executions> </plugin>
3. 配合Launch4j插件配置
生成.exe的时候,要指定JRE的相对路径为./jre,这样.exe运行时会自动查找同级目录下的JRE:
<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>package</phase> <goals> <goal>launch4j</goal> </goals> <configuration> <headerType>gui</headerType> <!-- 根据你的应用类型选gui或console --> <outfile>${project.build.directory}/dist/YourApp.exe</outfile> <!-- exe输出到dist目录,和jre同级 --> <jar>${project.build.directory}/${project.build.finalName}.jar</jar> <jre> <path>./jre</path> <!-- 指定JRE的相对路径 --> <minVersion>1.8.0</minVersion> <!-- 设置你的应用需要的最低Java版本 --> </jre> <!-- 可以添加图标、应用标题等其他配置 --> </configuration> </execution> </executions> </plugin>
4. 针对JDK 11+的特殊处理
如果你的构建环境用的是OpenJDK 11及以上版本,很多发行版没有单独的JRE目录,这时候可以用jlink生成精简版JRE,配合maven-jlink-plugin实现自动化:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jlink-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>create-custom-jre</id> <phase>package</phase> <goals> <goal>jlink</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/dist/jre</outputDirectory> <modulePath> <modulePath>${java.home}/jmods</modulePath> </modulePath> <addModules> <!-- 添加你的应用依赖的Java模块,比如java.base、java.desktop等 --> <addModule>java.base</addModule> <addModule>java.desktop</addModule> </addModules> <stripDebug>true</stripDebug> <noHeaderFiles>true</noHeaderFiles> <noManPages>true</noManPages> </configuration> </execution> </executions> </plugin>
注意事项
- 运行
mvn -version确认当前Maven使用的JDK是否是你想要复制JRE的那个,避免复制错版本。 - 一定要把
filtering设为false,否则Maven会尝试替换JRE文件中的变量,导致JRE损坏无法运行。
内容的提问来源于stack exchange,提问作者Pablo Fernandez




