我之前创建了javafx项目,想打包试试。一试,全是坑,所以记录下来,为有缘人节约时间。直接构建工件是错误的,别尝试了,找不在JDK的。我也花了一天多的时间尝试了网上各种大神的办法,就没找到一个是正确的。最后自己找到了解决办法,并分享给大家。
我们用Maven进行打包
1、检查javafx的版本,如果是23以下的版本,你无法使用jdk21。坑的是他运行时可以,打包才说不行。
2、更改pom.xml的build部分为下面的代码,不要问我为什么要这样改,我问谁去?
<build>
<plugins>
<!-- Maven Compiler Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>21</source>
<target>21</target>
</configuration>
</plugin>
<!-- JavaFX Maven Plugin -->
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.8</version>
<configuration>
<mainClass>com.example.demo.HelloApplication</mainClass>
</configuration>
</plugin>
<!-- Maven Shade Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.demo.HelloApplication</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
3、用cmd导航到项目所在的文件夹,运行:mvn clean package,如图
4、进入到target文件夹,运行:java -jar demo-1.0-SNAPSHOT.jar,提示:“错误: 缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序”。恭喜你,打包成功了。
5、复制javafx的sdk过来(里面应该有bin,legal,lib等东西,全部复制到target),现在你的target应该类似于下图:
6、我们新建test.bat,内容为:
@echo off
REM 获取当前目录
set CURRENT_DIR=%~dp0
REM 运行命令
java -Xmx12G --module-path "%CURRENT_DIR%\lib" --add-modules javafx.controls,javafx.fxml -jar demo-1.0-SNAPSHOT.jar
REM 立即关闭命令行窗口,不等待java程序结束
exit
7、需要注意的是我用-Xmx12G,给了这个项目12G的运行内存限制。这个值是要按照运行电脑的配置进行修改的。这个设置也非常重要,它能避免运行内存太多出现的问题。
8:双击test.bat,如图:
9、打包成功。在windows上你可以把这个文件夹复制到任何电脑,直接就能运行(运行环境JDK21是需要的)。
10、如果是在linux上用,你按bat的思路,建一个sh文件即可。记得把javafx的sdk换成linux的。macos同理。
11、现在是2024年6月17号,这篇博客应该是目前为止,唯一一篇说清楚了用jdk21和javafx23打包的文章。