如何在Maven编译的自执行JAR包中嵌入JDK?(JavaFX项目场景)
你在Win10的IntelliJ CE环境下开发Maven+JavaFX项目,已经搞定了除JDK外的依赖打包,现在想把JDK也嵌进去让无Java环境的用户直接运行——这个需求用Java官方的jlink+jpackage方案最靠谱,也可以用第三方Maven插件简化流程,下面给你一步步讲:
方案一:官方推荐的jlink+jpackage(模块化打包)
Java 9+的模块化系统和jlink工具可以帮你裁剪出只包含项目所需的JDK模块(不是完整JDK,体积更小),再用jpackage做成exe或安装包,用户双击就能运行,完全不需要装Java。
步骤1:在pom.xml中添加maven-jlink-plugin
这个插件帮你自动执行jlink生成自定义JDK runtime,把以下配置加到你的pom.xml的<build><plugins>里:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jlink-plugin</artifactId> <version>3.1.0</version> <extensions>true</extensions> <configuration> <!-- 指定你的主类,格式是 模块名/全限定类名 --> <mainClass>Appiculture/com.base.Main</mainClass> <!-- 生成的runtime目录名称 --> <outputDirectory>${project.build.directory}/runtime</outputDirectory> <!-- 裁剪JDK,只保留项目用到的模块 --> <stripDebug>true</stripDebug> <noHeaderFiles>true</noHeaderFiles> <noManPages>true</noManPages> <!-- 自动包含依赖模块 --> <modulePath> <path>${project.build.directory}/modules</path> </modulePath> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>jlink</goal> </goals> </execution> </executions> </plugin>
步骤2:生成自定义JDK runtime
在IntelliJ的Terminal里执行:
mvn clean package
执行完后,target/runtime目录就是包含裁剪后JDK和你项目代码的运行环境。
步骤3:用jpackage制作可执行程序
打开命令提示符(cmd),切换到你的项目根目录,执行jpackage命令(JDK自带的工具,路径在你本地JDK的bin目录下):
jpackage --name Appiculture --input target/runtime/bin --main-jar your-project-jar-name.jar --type exe --dest target/installer
替换your-project-jar-name.jar为你实际生成的JAR文件名,执行后target/installer里会生成exe安装包,用户安装后就能直接运行。
方案二:用第三方插件简化流程(runtime-maven-plugin)
如果觉得上面的步骤麻烦,可以用org.beryx.runtime插件,它把jlink和jpackage的流程整合起来,一键生成包含JDK的独立应用:
步骤1:添加插件到pom.xml
<plugin> <groupId>org.beryx.runtime</groupId> <artifactId>runtime-maven-plugin</artifactId> <version>1.15.0</version> <configuration> <mainClass>Appiculture/com.base.Main</mainClass> <!-- 生成exe格式的可执行文件 --> <packageType>exe</packageType> <!-- 应用名称和输出目录 --> <appName>Appiculture</appName> <outputDirectory>${project.build.directory}/app</outputDirectory> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>package</goal> </goals> </execution> </executions> </plugin>
步骤2:一键生成独立应用
执行以下命令,插件会自动完成JDK裁剪、打包和exe生成:
mvn clean package
生成的应用在target/app目录下,直接把整个目录发给用户就能运行。
注意事项
- 你的
module-info.java已经正确声明了依赖模块,这两个方案都能自动识别并包含所需的JDK和JavaFX模块,不需要额外配置。 - 如果你执意要打单个包含JDK的JAR,官方其实不推荐(因为模块化JDK无法直接塞进普通JAR),可以尝试用Capsule等工具,但稳定性不如上面的方案。
- 确保你本地安装的是JDK 11+(JavaFX 11+才支持模块化打包),并且IntelliJ的项目SDK已经正确配置为这个JDK。
内容的提问来源于stack exchange,提问作者aaNti

