新闻中心
J*aFX应用打包:现代SDK中原生库(DLLs等)的定位与管理指南

针对j*afx sdk 19及更高版本中原生库(如dlls)位置变化的困惑,本文详细阐述了如何定位这些库文件。我们将探讨从gluon下载的sdk中`lib/`目录的结构,以及m*en仓库中平台特定jars的打包方式,并提供相应的应用打包策略,以确保j*afx应用程序的顺利构建与部署。
在早期J*aFX版本中,开发者习惯于在SDK的bin目录下寻找.dll等原生库文件,以便在构建项目时将其包含进最终的JAR
包中。然而,随着J*aFX版本的迭代,许多开发者发现新版SDK中bin目录不再包含这些文件,从而对如何打包带有外部库的J*aFX应用程序产生了疑问。事实上,原生库并未消失,只是其存放位置和管理方式发生了变化。
J*aFX SDK原生库的定位
现代J*aFX SDK中的原生库(如Windows上的.dll,macOS上的.dylib,Linux上的.so等)的定位方式取决于您获取J*aFX的方式:
1. 从官方SDK包获取
如果您从Gluon等官方渠道下载并解压了完整的J*aFX SDK二进制包(例如openjfx-20-ea+11_osx-x64_bin-sdk.zip),您会发现所有必要的原生库文件都位于SDK根目录下的lib/文件夹中。
例如,在一个解压后的J*aFX SDK目录结构中,您可能会看到:
j*afx-sdk-20/ ├── bin/ ├── legal/ ├── lib/ │ ├── j*afx.base.jar │ ├── j*afx.controls.jar │ ├── j*afx.fxml.jar │ ├── ... │ ├── libj*afx_font.dylib (macOS) │ ├── libj*afx_iio.dylib (macOS) │ ├── ... │ ├── glfw.dll (Windows) │ ├── prism_d3d.dll (Windows) │ └── ... └── src.zip
这里的lib/目录不仅包含J*aFX的JAR文件,还包含了所有平台特定的原生库。在构建和运行J*aFX应用程序时,您需要确保JVM能够找到这些库。
2. 通过M*en/Gradle依赖管理
当您使用M*en或Gradle等构建工具管理项目依赖时,J*aFX的原生库通常以平台特定JAR包的形式提供。这意味着,您不再需要手动处理lib/目录下的原生文件,构建工具会根据您的操作系统自动引入正确的依赖。
例如,在M*en中央仓库中,J*aFX的某些模块(如j*afx-graphics)会有针对不同操作系统的变体,通过classifier进行区分:
- j*afx-graphics-*-mac.jar (macOS)
- j*afx-graphics-*-win.jar (Windows)
- j*afx-graphics-*-linux.jar (Linux)
这些平台特定的JAR包内部就包含了对应的原生库。
J*aFX应用程序的打包策略
了解了原生库的定位后,我们可以根据不同的项目设置选择合适的打包策略。
1. 使用直接下载的SDK进行打包
如果您选择直接使用下载的J*aFX SDK,并在没有M*en/Gradle的情况下进行构建,您需要手动配置构建路径和打包过程,以确保原生库被正确包含或引用。
基本步骤:
- 编译: 确保J*a编译器在编译时能找到J*aFX的JAR文件(位于SDK的lib/目录)。
-
运行/打包:
- 运行时指定模块路径: 在运行应用程序时,使用--module-path参数指向J*aFX SDK的lib/目录,并使用--add-modules指定所需的J*aFX模块。
- 使用jlink创建自定义运行时: jlink工具可以根据您的应用程序需求,创建一个包含JVM、J*aFX模块及所有原生库的最小化运行时环境。这对于分发独立的应用程序非常有用。
- 使用jpackage创建安装包: jpackage工具可以在jlink的基础上,进一步创建平台特定的安装包(如Windows的.exe,macOS的.dmg,Linux的.deb或.rpm)。它会自动处理原生库的包含和路径问题。
示例 (命令行运行):
假设您的应用程序主类是com.example.MyApp,并且您已经将J*aFX SDK解压到/path/to/j*afx-sdk-20。
Openflow
一键极速绘图,赋能行业工作流
88
查看详情
# 编译 j*ac --module-path /path/to/j*afx-sdk-20/lib --add-modules j*afx.controls,j*afx.fxml -d out src/com/example/*.j*a # 运行 j*a --module-path /path/to/j*afx-sdk-20/lib --add-modules j*afx.controls,j*afx.fxml -jar YourApp.jar # 或者 (如果不是打包成jar) j*a --module-path /path/to/j*afx-sdk-20/lib --add-modules j*afx.controls,j*afx.fxml -p out -m com.example/com.example.MyApp
在实际打包时,jlink和jpackage是更推荐的工具,它们能自动化原生库的集成。
2. 使用M*en/Gradle管理依赖并打包
这是现代J*aFX项目最推荐的实践方式。构建工具会自动处理原生库的引入。
M*en 示例 (pom.xml):
您需要在dependencies部分为J*aFX模块添加相应的依赖,并指定classifier来引入平台特定的原生库。
<project>
<!-- ... 其他配置 ... -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<j*afx.version>20</j*afx.version>
<m*en.compiler.source>17</m*en.compiler.source>
<m*en.compiler.target>17</m*en.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>j*afx-controls</artifactId>
<version>${j*afx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>j*afx-fxml</artifactId>
<version>${j*afx.version}</version>
</dependency>
<!-- 平台特定模块:根据您的操作系统添加 -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>j*afx-graphics</artifactId>
<version>${j*afx.version}</version>
<classifier>${os.detected.classifier}</classifier> <!-- 自动检测操作系统 -->
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>j*afx-controls</artifactId>
<version>${j*afx.version}</version>
<classifier>${os.detected.classifier}</classifier>
</dependency>
<!-- ... 其他J*aFX模块 ... -->
</dependencies>
<build>
<plugins>
<!-- 插件用于自动检测操作系统分类器 -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-m*en-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>j*afx-m*en-plugin</artifactId>
<version>0.0.8</version>
<configuration>
<mainClass>com.example.MyApp</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>Gradle 示例 (build.gradle):
plugins {
id 'j*a'
id 'application'
id 'org.openjfx.j*afxplugin' version '0.0.10' // J*aFX Gradle 插件
}
group 'com.example'
version '1.0-SNAPSHOT'
repositories {
m*enCentral()
}
j*afx {
version = "20"
modules = [ 'j*afx.controls', 'j*afx.fxml' ]
}
mainClassName = 'com.example.MyApp'在这些配置中,J*aFX M*en/Gradle插件会自动处理平台特定原生库的引入和打包,极大地简化了开发流程。
3. 模块化(Jigsaw)与jlink的集成
J*a 9引入的模块系统(Jigsaw)为J*aFX应用程序的部署提供了更优雅的解决方案。通过将J*aFX应用程序模块化,并结合jlink工具,您可以创建包含应用程序所需所有J*a模块和原生库的自定义运行时镜像。
优势:
- 轻量级: 只包含应用程序实际需要的模块和原生库,减小了分发包的大小。
- 独立性: 应用程序可以包含自己的JRE,无需用户安装独立的J*a环境。
- 安全性: 模块系统提供了更强的封装性。
基本流程:
- 创建module-info.j*a: 为您的应用程序创建模块描述符,声明对J*aFX模块的依赖。
- 使用jlink: 运行jlink命令,指定您的应用程序模块、J*aFX模块以及输出目录,生成一个包含所有依赖的自定义运行时镜像。
// src/main/j*a/module-info.j*a
module com.example.myapp {
requires j*afx.controls;
requires j*afx.fxml;
opens com.example to j*afx.fxml;
exports com.example;
}示例 (使用jlink):
# 假设您的应用程序JAR和J*aFX SDK都在当前目录
# --module-path 指向应用程序模块和J*aFX模块
# --add-modules 指定要包含的模块
# --output 指定输出目录
jlink --module-path "path/to/YourApp.jar;path/to/j*afx-sdk-20/lib" \
--add-modules com.example.myapp,j*afx.controls,j*afx.fxml \
--output myapp-runtime生成的myapp-runtime目录将包含一个完整的J*a运行时环境和您的应用程序,可以直接运行。
关键注意事项与最佳实践
- 版本匹配: 确保您使用的J*aFX SDK版本与您的JDK版本兼容。通常,J*aFX SDK会明确指出其支持的JDK版本范围。
- 平台兼容性: 在处理原生库时,务必注意目标平台的兼容性。Windows的.dll不能在macOS或Linux上运行。使用M*en/Gradle的classifier或jpackage可以很好地处理这一点。
- 使用构建工具: 强烈建议使用M*en或Gradle来管理J*aFX项目的依赖和构建过程。它们能自动化许多复杂任务,特别是原生库的引入。
- 探索jlink和jpackage: 对于生产环境的部署,jlink和jpackage是创建专业级、独立应用程序包的强大工具。它们能有效解决原生库的捆绑和分发问题。
- 文档查阅: 遇到问题时,优先查阅J*aFX官方文档和Gluon提供的指南,它们通常包含最新和最准确的信息。
通过理解J*aFX SDK中原生库的实际位置变化,并采用现代化的构建和打包策略,开发者可以更高效、更可靠地构建和部署J*aFX应用程序。
以上就是J*aFX应用打包:现代SDK中原生库(DLLs等)的定位与管理指南的详细内容,更多请关注其它相关文章!
# 乳山网站建设方案
# 您需要
# 运行环境
# 如果您
# 所需
# 镜像
# 新和
# 泡菜营销与推广的区别
# 长宁区推广营销策划厂家批发价
# 自定义
# 遂宁网站建设招聘网
# 洗浴店营销推广文案
# 建材主动营销的推广方式
# 昆明网站建设托管方案
# 视频网站建设课程代码
# 苹果商城关键词排名优化
# 网站建站优化方法
# linux
# 您的
# 应用程序
# 封装
# cos
# win
# 解压
# macos
# ai
# mac
# 工具
# app
# 操作系统
# windows
# go
# java
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题
美团外卖商家服务中心入口 美团商家版官网入口
在命令行怎么运行html项目_命令行运行html项目方法【教程】
高德地图沿途添加点失败如何解决 高德多点规划方法
php源码怎么看淘宝客系统_看php源码淘宝客系统技巧
文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】
一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化
R星幕后开发视频泄露 包含《GTA6》等多款大作
微博网页版官方账号登录 微博网页版内容浏览使用指南
中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】
12306怎么选座位选到安静区_12306选座安静区域选择策略
新手怎么开始学化妆 零基础化妆入门教程
必由学官网入口 必由学教师登录入口
QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口
Centos/Linux 系统下安装 composer 的完整步骤
Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区
微信网页版官方入口教程 微信网页版网页版快速登录步骤
Python类型检查:优化关联可选属性的Mypy推断策略
vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法
Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】
如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】
Mac怎么锁定备忘录_Mac备忘录加密设置教程
4399免费游戏网址入口 4399小游戏免费入口点开即玩
J*aScript数组对象转换:按指定键分组与值收集
动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道
期待已久:小米17 Ultra、小米首款NAS本月登场
神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正
163邮箱注册官网 免费申请163个人邮箱
React Router 嵌套组件中 URL 重定向问题的解决方案
CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示
c++20的std::jthread是什么_c++可中断线程与RAII式管理
Lar*el DB::listen 事件中的查询执行时间单位解析
深入理解J*aScript中的B样条曲线与节点向量生成
jQuery Mask 插件中实现电话号码固定前导零的教程
J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析
Selenium Python中处理点击后新窗口加载冻结问题的策略与实践
如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践
如何使用纯J*aScript判断Input元素是否在特定类容器内
qq游戏网页版直接玩_qq游戏免下载快速入口
PHP 枚举:根据字符串获取枚举案例的策略与实现
百度网盘网页版入口 百度网盘网页版官方登录网址
铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则
漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站
《主播少女的秘密账号迷宫》首支宣传片
Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】
Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程
怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除
谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】
漫蛙漫画官方首页 漫蛙2漫画在线阅读入口
html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】


2025-12-07
浏览次数:次
返回列表