我之前创建了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=%~dp0REM 运行命令
java -Xmx12G --module-path "%CURRENT_DIR%\lib" --add-modules javafx.controls,javafx.fxml -jar demo-1.0-SNAPSHOT.jarREM 立即关闭命令行窗口,不等待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打包的文章。