admin管理员组

文章数量:1600155

Windows下的JAVAFX桌面应用程序打包ABC

目录

  • Windows下的JAVAFX桌面应用程序打包ABC
  • Kotlin+JavaFX系列
    • 谁会读这个文章
    • 写作的目标
    • 知识背景
      • JavaFx
      • 模块化Java
    • JavaFX打包的例子
      • 例子代码
      • 编译的命令行
        • 设置变量
        • 编译Java代码
        • 运行
        • ``jlink``生成自定义运行时映像
        • ``jpackage``打包

Kotlin+JavaFX系列

  1. 使用Kotlin开发JavaFX
  2. Windows下的JavaFX桌面应用程序打包ABC
  3. Kotlin编写JavaFX的顺滑
  4. JavaFX动画:有趣的AnimationTimer
  5. JavaFX应用程序图标
  6. JavaFX专业开发者与业余开发者之间就差一个一个Icon packs
  7. JavaFX七巧板游戏:布局窗格Panes
  8. JavaFX七巧板游戏:布局控件
  9. JavaFX+Kotlin游戏从入门到放弃:拯救蛇蛇大作战又名454行实现几何数独游戏
  10. Kotlin编写JavaFX的顺滑之数据控件(一)列表视图ListView
  11. Kotlin编写JavaFX的顺滑之数据控件(二)表视图TableView基础应用
  12. Kotlin编写JavaFX的顺滑之数据控件(二)表视图TableView基础深入浅出

谁会读这个文章

  1. 自学使用Java开发桌面程序的初学者(为什么要这么做?);
  2. 要迅速撸出一个压缩包百兆以下windows应用程序的初级程序员;
  3. 大部分梯子都是java的程序员,客户只能接受Windows、只能接受单机传统桌面应用;
  4. 无聊的大佬想要给别人(也就是我)一个成长的机会(谢谢!)。

写作的目标

  1. 把自己在此处躺的坑记录下来以后回顾;
  2. 弄一个外部记忆防止自己老年痴呆。

知识背景

JavaFx

官方网站:openjfx

“JavaFX是一个开源的下一代客户端应用平台,用于桌面、移动和嵌入式系统,建立在Java之上。它是由许多个人和公司合作完成的,目标是为开发丰富的客户端应用程序制作一个现代、高效和功能齐全的工具包。”

总之,JavaFX挺愉快,也是开源的。是不是下一代就很那说,也可能就是上一代中没火也没挂的那种。

倒是我最近把它捡起来之后发现,随便写点界面发布一个小应用程序(压缩包二十兆左右)不要太愉快。

  1. 采用Kotlin开发,
  2. 不去用webkit,
  3. 不去用FXML,
  4. 把数据模型分开放数据可视化模型放在object里面。

模块化Java

参考:Jakob Jenkov博客文章

Java模块是一种打包机制,它使你能够将一个Java应用程序或Java API打包成一个单独的Java模块。一个Java模块被打包成一个模块化的JAR文件。一个Java模块可以指定它包含的哪些Java包应该对使用这个模块的其他Java模块可见。一个Java模块还必须指定哪些其他Java模块来完成它的工作。

Java模块是Java 9中通过Java平台模块系统(JPMS)的一项新功能。

模块化Java有很多优点:

  1. 通过模块化Java平台的小型应用分发
  2. 内部包的封装
  3. 启动时检测缺失的模块

最重要的也就是:“在Java 9和Java平台模块系统之前,你不得不把所有的Java平台API和你的Java应用打包在一起,因为没有正式的方法可以可靠地检查你的Java应用使用了哪些类。由于Java平台的API在这些年里已经变得相当庞大,你的应用程序会得到大量的Java类,其中许多你的应用程序可能不会使用。”

而采用了新的系统之后呢?打包出来的Java应用程序就再也不会那么大。一个典型的JavaFX应用程序,压缩包的大小也就是刚刚超过20M这种量级。

当然,最新版本的JavaFX也是模块化的。包括7个jmod文件。

  • javafx.base.jmod
  • javafx.controls.jmod
  • javafx.fxml.jmod
  • javafx.graphics.jmod
  • javafx.media.jmod
  • javafx.swing.jmod
  • javafx.web.jmod

下载JavaFX的时候,有三个下载项。

  1. SDK
  2. jmods
  3. Monocle SDK

SDK就是我们编译和运行的时候所需要的dll、jar文件;jmods就是我们模块化打包时需要的;Monocle SDK针对那些没有底层窗口系统的情况,例如手持设备等等。

我们把SDK和jmods下载了解压在硬盘上。下面要用到。

JavaFX打包的例子

例子代码

官方网站的例子:HelloFX.java
这是一个很无聊的例子,显示一个 640 × 480 640\times 480 640×480的窗口,窗口正中是一个标签,显示Java和JavaFX的版本。

package hellofx;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;


public class HelloFX extends Application {

    @Override
    public void start(Stage stage) {
        String javaVersion = System.getProperty("java.version");
        String javafxVersion = System.getProperty("javafx.version");
        Label l = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");
        Scene scene = new Scene(new StackPane(l), 640, 480);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }

}

程序在包hellofx中,src目录下包括一个文件module-info.java和包对应的目录。

module hellofx {
    requires javafx.controls;

    exports hellofx;
}

编译的命令行

在此之前,我们要确认Java是否在路径上;JavaFX SDK和jmods是否已经解压完成。此时我们打开的终端当前目录下有一个文件夹src,文件夹里是module-info.javahellofx文件夹(文件夹里就是HelloFX.java)。

设置变量

首先,我们设置JavaFX的库文件地址和jmods文件地址。

set FX="D:\javafx-sdk-17.0.1\lib"
set FX_MODS="D:\javafx-sdk-17.0.1\javafx-jmods-17.0.1"
编译Java代码

下面的命令按顺序执行三个命令:

  1. src目录下(包含子目录)所有的java文件的绝对地址输出到sources.txt中;
  2. 执行Java编译器,输出在mods/hellofx目录中,增加模块地址JavaFX的jar文件地址
  3. 删除sources.txt
dir /s /b src\*.java > sources.txt & javac --module-path %FX% -d mods/hellofx @sources.txt & del sources.txt

执行完之后,当前目录下面增加一个mods目录,该目录下有一个hellofx目录为模块的名字;模块下是module-info.class和包目录hellofx(包含其中的HelloFX.class)。

运行

此时,只需要把JavaFx对应的库文件地址加入到module-path就可以运行。

java --module-path "%FX%;mods" -m hellofx/hellofx.HelloFX
jlink生成自定义运行时映像

对一个模块化的项目,可以用jlink来创建一个使用JavaFX jmods的自定义运行时映像。

jlink --module-path "%FX_MODS%;mods" --add-modules hellofx --output hellofx

如此,就在目录hellofx下面生成了一个定制化的运行时镜像,可以通过这样来运行程序。

hellofx\bin\java.exe hellofx.HelloFX
jpackage打包

jpackage命令可以生成一个包装好的应用程序。

jpackage -n hellofx-pack --module-path "%FX_MODS%;mods" -m hellofx/hellofx.HelloFX -t app-image

查看hellofx-pack下面,可就可以运行hellofx-pack.exe

本文标签: 应用程序桌面WindowsJavaFXabc