You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为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

火山引擎 最新活动