近期要使用javafx做一个电脑上使用的GUI小工具,所以假期刚好在家学习了一下javafx,把打包步骤在此记录一下。
从jdk11起,javafx就已经交给社区维护了,中国官网地址:https://openjfx.cn/
环境
jpackage打包需要java14以上的jdk版本,所以我下载了jdk17,可以去oracle下载,jdk17开发者版本下载地址:https://www.oracle.com/cn/java/technologies/downloads/#jdk17-windows
下载之后配置好JAVA_HOME PATH ClASS_PATH等环境变量,这里省略。
安装好之后cmd运行 jpackage 看看能不能用,能用说明安装成功了。
maven要配好国内仓库源,这里也省略。
步骤
1.新建项目
2.打成jar包
3.利用jdk17 jpackage命令行打包成可运行程序
eclipse新建javafx maven项目
eclipse新建File -> New -> Project... -> Maven -> Maven project
下一步 选择Add Archetypes... groupId: org.openjfx artifactId: javafx-archetype-fxml version:0.0.6
点击ok,Filter填入org.openjfx 选择javafx-archetype-fxml
下一步 groupId:org.openjfx artifactId:hellofx javafx-version:19 javafx-maven-plugin-version:0.0.8 点击完成
项目出现之后,eclipse默认jdk11,可以在File -> Properties -> Java Build Path -> Libraries修改jdk的版本,当然jdk11也是可以的
修改下pom.xml
4.0.0
org.openjfx
hellofx
0.0.1
UTF-8
11
11
11
19
0.0.8
1.6.7
org.openjfx
javafx-controls
${javafx.version}
org.openjfx
javafx-fxml
${javafx.version}
org.apache.maven.plugins
maven-compiler-plugin
3.8.1
${maven.compiler.release}
${maven.compiler.source}
${maven.compiler.target}
org.openjfx
javafx-maven-plugin
${javafx.maven.plugin.version}
default-cli
org.openjfx.hellofx.App
app
app
true
true
true
org.apache.maven.plugins
maven-jar-plugin
3.2.0
false
true
lib/
org.openjfx.hellofx.App
./
org.apache.maven.plugins
maven-dependency-plugin
copy-dependencies
package
copy-dependencies
jar
jar
${project.build.directory}/lib
可以看到上面加入了构建jar包plugin
和 在打包阶段将依赖的jar包导出到lib目录下
两个插件
右击项目Maven->Update Project...一下
修改下module-info.java
module hellofx {
requires javafx.controls;
requires javafx.fxml;
requires transitive javafx.graphics;
requires javafx.base;
opens org.openjfx.hellofx to javafx.fxml;
exports org.openjfx.hellofx;
}
用Run as->Maven Build...执行clean javafx:run启动项目或者直接进入App.java运行主类,可以看到项目正常运行并出现了窗口。
打包
Run as->Maven Build...执行clean package进行打jar包
打包成功,在target文件夹出现了hellofx-0.0.1.jar和lib文件夹
把hellofx-0.0.1.jar移动到lib文件夹使其在同一个文件夹下
把一个ico图标也复制到lib文件夹里,作为程序的图标
这里推荐一个png转ico的网站:https://convertico.com/
cmd打开lib文件夹 执行jpackage打包命令
jpackage --type app-image -n DemoApp -p . -m hellofx/org.openjfx.hellofx.App --vendor zhaohy --app-version 0.0.1 --icon ./TV.ico
稍等片刻后,即可打包成功。在lib下面出现了一个DemoApp的文件夹,进去双击DemoApp.exe
可以看到运行成功。
上面命令里各参数:
--type 或 -t <键入字符串>
#要创建的包的类型
#有效值为:{"app-image", "exe", "msi", "rpm", "deb", "pkg", "dmg"}
#如果未指定此选项,则将创建一个与平台相关的默认类型。
--name 或 -n
#应用程序和/或程序包的名称。
-p . 代表当前路径
-m 代表module-info.java里的模块名和包路径
--vendor <字符串>
#应用程序的供应商。
--app-version <版本>
#应用程序和/或软件包的版本
--icon 图片路径
更多jpackage解释请看:https://www.bilibili.com/read/cv14523427?spm_id_from=333.999.0.0
上面这位大神从Oracle官方文档翻译的,讲的比较全。
关于javafx,贴一个我发现的宝藏up教程:https://space.bilibili.com/5096022/channel/collectiondetail?sid=210809
关于非模块化打包
上面的示例是javafx模块化的打包方式,很多时候用到的第三方jar包不一定支持模块化,所以记录一下改成非模块化之后遇到的这些坑。
从模块化转成非模块化非常简单,只要把根目录的module-info.java删除就好了,但是直接删除之后,它也直接运行不了启动类了。
所以得新建一个类单独做启动,这个类就是一般的启动类就好,不要继承Application。
比如新建Launch .java
package org.openjfx.hellofx;
import javafx.application.Application;
public class Launch {
public static void main(String[] args) {
Application.launch(App.class, args);
}
}
直接运行Launch类的main方法就可以启动javafx项目了。
非模块化的打包和模块化的打包命令是有点区别的,前期步骤都一样:
1.先运行 clean package命令打出jar包
2.把项目jar包移到target/lib目录下
3.把图标ico复制到target/lib目录下
4.用cmd打开target/lib 此时这里有所有的业务jar包和依赖包和图标ico文件
运行以下命令:
jpackage --type app-image -n DemoApp -i D:\work\workspace2\hellofx\target\lib --main-jar hellofx-0.0.1.jar --main-class org.openjfx.hellofx.Launch --app-version 0.0.1 --icon ./TV.ico --dest D:\work\workspace2\out
-i:指的是需要打包的输入地址
--main-jar:业务jar包名称
--main-class: 业务jar包里的启动类名称指定,只有在--main-jar指定之后,这个才有效。
--dest:输出安装包的文件夹目录
上面的文件夹地址换成自己真实的就ok.
--dest这个一定要指定,如果不指定默认会在当前目录陷入打包死循环,不要问我是怎么知道的,不知道是不是jpackage的bug(捂脸),谨记。
如此,就可以打包出非模块化的可执行程序包,亲测可以成功运行。