0

0

JavaFX应用打包:现代SDK中原生库(DLLs等)的定位与管理指南

霞舞

霞舞

发布时间:2025-12-07 16:05:54

|

908人浏览过

|

来源于php中文网

原创

JavaFX应用打包:现代SDK中原生库(DLLs等)的定位与管理指南

针对javafx sdk 19及更高版本中原生库(如dlls)位置变化的困惑,本文详细阐述了如何定位这些库文件。我们将探讨从gluon下载的sdk中`lib/`目录的结构,以及maven仓库中平台特定jars的打包方式,并提供相应的应用打包策略,以确保javafx应用程序的顺利构建与部署。

在早期JavaFX版本中,开发者习惯于在SDK的bin目录下寻找.dll等原生库文件,以便在构建项目时将其包含进最终的JAR包中。然而,随着JavaFX版本的迭代,许多开发者发现新版SDK中bin目录不再包含这些文件,从而对如何打包带有外部库的JavaFX应用程序产生了疑问。事实上,原生库并未消失,只是其存放位置和管理方式发生了变化。

JavaFX SDK原生库的定位

现代JavaFX SDK中的原生库(如Windows上的.dll,macOS上的.dylib,Linux上的.so等)的定位方式取决于您获取JavaFX的方式:

1. 从官方SDK包获取

如果您从Gluon等官方渠道下载并解压了完整的JavaFX SDK二进制包(例如openjfx-20-ea+11_osx-x64_bin-sdk.zip),您会发现所有必要的原生库文件都位于SDK根目录下的lib/文件夹中。

例如,在一个解压后的JavaFX SDK目录结构中,您可能会看到:

立即学习Java免费学习笔记(深入)”;

javafx-sdk-20/
├── bin/
├── legal/
├── lib/
│   ├── javafx.base.jar
│   ├── javafx.controls.jar
│   ├── javafx.fxml.jar
│   ├── ...
│   ├── libjavafx_font.dylib  (macOS)
│   ├── libjavafx_iio.dylib   (macOS)
│   ├── ...
│   ├── glfw.dll              (Windows)
│   ├── prism_d3d.dll         (Windows)
│   └── ...
└── src.zip

这里的lib/目录不仅包含JavaFX的JAR文件,还包含了所有平台特定的原生库。在构建和运行JavaFX应用程序时,您需要确保JVM能够找到这些库。

2. 通过Maven/Gradle依赖管理

当您使用Maven或Gradle等构建工具管理项目依赖时,JavaFX的原生库通常以平台特定JAR包的形式提供。这意味着,您不再需要手动处理lib/目录下的原生文件,构建工具会根据您的操作系统自动引入正确的依赖。

例如,在Maven中央仓库中,JavaFX的某些模块(如javafx-graphics)会有针对不同操作系统的变体,通过classifier进行区分:

  • javafx-graphics-*-mac.jar (macOS)
  • javafx-graphics-*-win.jar (Windows)
  • javafx-graphics-*-linux.jar (Linux)

这些平台特定的JAR包内部就包含了对应的原生库。

JavaFX应用程序的打包策略

了解了原生库的定位后,我们可以根据不同的项目设置选择合适的打包策略。

1. 使用直接下载的SDK进行打包

如果您选择直接使用下载的JavaFX SDK,并在没有Maven/Gradle的情况下进行构建,您需要手动配置构建路径和打包过程,以确保原生库被正确包含或引用。

基本步骤:

  1. 编译: 确保Java编译器在编译时能找到JavaFX的JAR文件(位于SDK的lib/目录)。
  2. 运行/打包:
    • 运行时指定模块路径: 在运行应用程序时,使用--module-path参数指向JavaFX SDK的lib/目录,并使用--add-modules指定所需的JavaFX模块。
    • 使用jlink创建自定义运行时: jlink工具可以根据您的应用程序需求,创建一个包含JVM、JavaFX模块及所有原生库的最小化运行时环境。这对于分发独立的应用程序非常有用。
    • 使用jpackage创建安装包: jpackage工具可以在jlink的基础上,进一步创建平台特定的安装包(如Windows的.exe,macOS的.dmg,Linux的.deb或.rpm)。它会自动处理原生库的包含和路径问题。

示例 (命令行运行):

HeroPack
HeroPack

以电子游戏为灵感,用AI制作游戏化身。

下载

假设您的应用程序主类是com.example.MyApp,并且您已经将JavaFX SDK解压到/path/to/javafx-sdk-20。

# 编译
javac --module-path /path/to/javafx-sdk-20/lib --add-modules javafx.controls,javafx.fxml -d out src/com/example/*.java

# 运行
java --module-path /path/to/javafx-sdk-20/lib --add-modules javafx.controls,javafx.fxml -jar YourApp.jar
# 或者 (如果不是打包成jar)
java --module-path /path/to/javafx-sdk-20/lib --add-modules javafx.controls,javafx.fxml -p out -m com.example/com.example.MyApp

在实际打包时,jlink和jpackage是更推荐的工具,它们能自动化原生库的集成。

2. 使用Maven/Gradle管理依赖并打包

这是现代JavaFX项目最推荐的实践方式。构建工具会自动处理原生库的引入。

Maven 示例 (pom.xml):

您需要在dependencies部分为JavaFX模块添加相应的依赖,并指定classifier来引入平台特定的原生库。

<project>
    <!-- ... 其他配置 ... -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <javafx.version>20</javafx.version>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <!-- 平台特定模块:根据您的操作系统添加 -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics</artifactId>
            <version>${javafx.version}</version>
            <classifier>${os.detected.classifier}</classifier> <!-- 自动检测操作系统 -->
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>${javafx.version}</version>
            <classifier>${os.detected.classifier}</classifier>
        </dependency>
        <!-- ... 其他JavaFX模块 ... -->
    </dependencies>

    <build>
        <plugins>
            <!-- 插件用于自动检测操作系统分类器 -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>flatten-maven-plugin</artifactId>
                <version>1.2.7</version>
                <executions>
                    <execution>
                        <id>flatten</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>flatten</goal>
                        </goals>
                        <configuration>
                            <updatePomFile>true</updatePomFile>
                            <outputDirectory>${project.build.directory}</outputDirectory>
                            <flattenMode>oss</flattenMode>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.8</version>
                <configuration>
                    <mainClass>com.example.MyApp</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Gradle 示例 (build.gradle):

plugins {
    id 'java'
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.0.10' // JavaFX Gradle 插件
}

group 'com.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

javafx {
    version = "20"
    modules = [ 'javafx.controls', 'javafx.fxml' ]
}

mainClassName = 'com.example.MyApp'

在这些配置中,JavaFX Maven/Gradle插件会自动处理平台特定原生库的引入和打包,极大地简化了开发流程。

3. 模块化(Jigsaw)与jlink的集成

Java 9引入的模块系统(Jigsaw)为JavaFX应用程序的部署提供了更优雅的解决方案。通过将JavaFX应用程序模块化,并结合jlink工具,您可以创建包含应用程序所需所有Java模块和原生库的自定义运行时镜像。

优势:

  • 轻量级: 只包含应用程序实际需要的模块和原生库,减小了分发包的大小。
  • 独立性: 应用程序可以包含自己的JRE,无需用户安装独立的Java环境。
  • 安全性: 模块系统提供了更强的封装性。

基本流程:

  1. 创建module-info.java: 为您的应用程序创建模块描述符,声明对JavaFX模块的依赖。
  2. 使用jlink: 运行jlink命令,指定您的应用程序模块、JavaFX模块以及输出目录,生成一个包含所有依赖的自定义运行时镜像。
// src/main/java/module-info.java
module com.example.myapp {
    requires javafx.controls;
    requires javafx.fxml;

    opens com.example to javafx.fxml;
    exports com.example;
}

示例 (使用jlink):

# 假设您的应用程序JAR和JavaFX SDK都在当前目录
# --module-path 指向应用程序模块和JavaFX模块
# --add-modules 指定要包含的模块
# --output 指定输出目录
jlink --module-path "path/to/YourApp.jar;path/to/javafx-sdk-20/lib" \
      --add-modules com.example.myapp,javafx.controls,javafx.fxml \
      --output myapp-runtime

生成的myapp-runtime目录将包含一个完整的Java运行时环境和您的应用程序,可以直接运行。

关键注意事项与最佳实践

  • 版本匹配: 确保您使用的JavaFX SDK版本与您的JDK版本兼容。通常,JavaFX SDK会明确指出其支持的JDK版本范围。
  • 平台兼容性: 在处理原生库时,务必注意目标平台的兼容性。Windows的.dll不能在macOS或Linux上运行。使用Maven/Gradle的classifier或jpackage可以很好地处理这一点。
  • 使用构建工具: 强烈建议使用Maven或Gradle来管理JavaFX项目的依赖和构建过程。它们能自动化许多复杂任务,特别是原生库的引入。
  • 探索jlink和jpackage: 对于生产环境的部署,jlink和jpackage是创建专业级、独立应用程序包的强大工具。它们能有效解决原生库的捆绑和分发问题。
  • 文档查阅: 遇到问题时,优先查阅JavaFX官方文档和Gluon提供的指南,它们通常包含最新和最准确的信息。

通过理解JavaFX SDK中原生库的实际位置变化,并采用现代化的构建和打包策略,开发者可以更高效、更可靠地构建和部署JavaFX应用程序。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

0

2025.09.15

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1936

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2112

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1142

2024.11.28

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1314

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1156

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

825

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

460

2023.08.02

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

6

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 9.9万人学习

Git 教程
Git 教程

共21课时 | 3.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号