
针对javafx sdk 19及更高版本中原生库(如dlls)位置变化的困惑,本文详细阐述了如何定位这些库文件。我们将探讨从gluon下载的sdk中`lib/`目录的结构,以及maven仓库中平台特定jars的打包方式,并提供相应的应用打包策略,以确保javafx应用程序的顺利构建与部署。
在早期JavaFX版本中,开发者习惯于在SDK的bin目录下寻找.dll等原生库文件,以便在构建项目时将其包含进最终的JAR包中。然而,随着JavaFX版本的迭代,许多开发者发现新版SDK中bin目录不再包含这些文件,从而对如何打包带有外部库的JavaFX应用程序产生了疑问。事实上,原生库并未消失,只是其存放位置和管理方式发生了变化。
现代JavaFX SDK中的原生库(如Windows上的.dll,macOS上的.dylib,Linux上的.so等)的定位方式取决于您获取JavaFX的方式:
如果您从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能够找到这些库。
当您使用Maven或Gradle等构建工具管理项目依赖时,JavaFX的原生库通常以平台特定JAR包的形式提供。这意味着,您不再需要手动处理lib/目录下的原生文件,构建工具会根据您的操作系统自动引入正确的依赖。
例如,在Maven中央仓库中,JavaFX的某些模块(如javafx-graphics)会有针对不同操作系统的变体,通过classifier进行区分:
这些平台特定的JAR包内部就包含了对应的原生库。
了解了原生库的定位后,我们可以根据不同的项目设置选择合适的打包策略。
如果您选择直接使用下载的JavaFX SDK,并在没有Maven/Gradle的情况下进行构建,您需要手动配置构建路径和打包过程,以确保原生库被正确包含或引用。
基本步骤:
示例 (命令行运行):
假设您的应用程序主类是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是更推荐的工具,它们能自动化原生库的集成。
这是现代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插件会自动处理平台特定原生库的引入和打包,极大地简化了开发流程。
Java 9引入的模块系统(Jigsaw)为JavaFX应用程序的部署提供了更优雅的解决方案。通过将JavaFX应用程序模块化,并结合jlink工具,您可以创建包含应用程序所需所有Java模块和原生库的自定义运行时镜像。
优势:
基本流程:
// 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中原生库的实际位置变化,并采用现代化的构建和打包策略,开发者可以更高效、更可靠地构建和部署JavaFX应用程序。
以上就是JavaFX应用打包:现代SDK中原生库(DLLs等)的定位与管理指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号