概述
JavaFx官网有一个JavaPackager插件,支持跨平台打包和精简jre打包。于是我在开发完JavaFx应用后尝试用JavaPackager打包,实践过程没那么顺利,踩了很多坑踩才完成打包。因此记录下打包过程,方便以后回顾。
环境
jdk 12,javafx 11.0.2 ,window10 ,IntelliJ IDEA Community。
1.javafx sdk
下载好sdk后,同时有需要下载jmod,并把javafx 的jmod 复制到jdk的 jmods 目录下。
2.引入javafx 插件。
plugins {
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.9'
}
javafx {
version = "11.0.2" //version 根据本地sdk版本
sdk = JAVAFX_SDK //本地sdk根目录
modules = ['javafx.controls', "javafx.fxml"]
}
3.引入java packager 插件。
apply plugin: 'io.github.fvarrui.javapackager.plugin'
javapackager {
mainClass = 'com.neo.desktop.Launcher' // 包含main 方法的启动类
generateInstaller = false
jreMinVersion = '1.9.0'
description = 'Packages the application as a native Windows executable and bundles it in a zipball'
platform = 'windows'
bundleJre = true //这里true,必须打包jre
customizedJre = true //这里true,需要自定义jre
createZipball = true
modules = ['java.base', 'java.desktop', 'java.xml', 'java.scripting', 'java.management', 'java.sql', 'jdk.unsupported']
//modules 是 默认的 模块,包含了基础项目所需的基础库
zipName ='desktop.zip'
}
task packageForWindows64(type: io.github.fvarrui.javapackager.gradle.PackageTask, dependsOn: build) {
def dir = JAVAFX_SDK + "/bin"
def dlls=new ArrayList<File>()
// javafx_dlls 是javafx sdk中的dll文件
javafx_dlls.forEach{
dlls.add(new File("$dir/$it"))
}
//找到要打包的dll文件
appName = 'desktop_win64'
winConfig {
icoFile =file('/assets/windows/desktop.ico')
//会将dll 复制到 /build/desktop_win64/jre/bin 目录下
bundleDlls = dlls
//bundleDlls 将打包dll文件到jre中
}
}
有几点比较重要
- customizedJre 必须设置true,选择自定义打包jre 。同时modules参数配置所需的jdk模块。所需jdk模块根据项目所需。可以执行我自己添加的jdeps task,查看项目所需的module。如下:
require module:java.base,java.desktop,java.management,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,jdk.unsupported
其中除了java的模块,我们还需要javafx的几个模块。 所以在 modules 参数里配置 java 的基础模块。 javafx所需的模块,因为添加在dependencies里了,java packager 会打包。
- javafx 在windows平台需要dll支持。所需的dll都在sdk/bin 目录下。需要的dll参考openjfx.cn/openjfx-doc…, Custom JDK+JavaFX image一节,包括以下文件:
['decora_sse.dll',
'glass.dll',
'javafx_font.dll',
'javafx_iio.dll',
'jfxmedia.dll',
// 'jfxwebkit.dll', jfxwebkit 暂不添加,没用到
'prism_common.dll',
'prism_d3d.dll',
'prism_sw.dll']
打包任务会将这些文件,在创建自定义的jre后,copy到jre/bin 目录下,然后一起打包进zip文件,作为运行时环境。
如果打包后的exe不能正常运行,可以用以下方法排查。 打包后,build 目录下会有 /{project_name} 目录 , {project_name}.zip 文件 和 /launch4j 目录。在命令行下 cd 进入/{project_name}/jre/bin 然后执行 java -jar {launch4j目录}/libs/runnable-jar 。命令行会在打包出的jre环境下 执行jar包。如果有报错会有相应日志。
会出现缺少class,class找不到等情况。然后需要排查对应的包或者jdk module 是否打有打包。
完成以上配置后,就可以执行打包任务,生成zip。zip文件会有40m左右,因为打包了jre 环境 和 javafx sdk。但是最便捷的地方在于,在windows pc上,不需要安装jdk环境,解压zip后可以直接使用。
demo github:github.com/Tiny1213/Ja…