JavaFX+Gradle跨平台打包方案

1,935 阅读2分钟

概述

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…