Ubuntu22.04编译MAVGCL时遇javafx.controls模块未找到错误求助
解决Ubuntu 22.04 LTS下MAVGCL编译打包时JavaFX模块找不到的问题
问题背景
在Ubuntu 22.04 LTS编译MAVGCL(用于反编译PX4 ULog日志)时,已安装OpenJDK 17和JavaFX 17,克隆所有依赖仓库并修改pom.xml的groupId/artifactId后,执行ant deploy_linux_17编译正常,但打包生成App-image时出现Module javafx.controls not found错误,导致custom_jre目录无法创建。
错误原因
核心问题是jlink工具无法在模块路径中找到JavaFX的模块化依赖:OpenJDK默认不包含JavaFX,通过snap安装的JavaFX未正确配置到模块路径,手动编译集成的操作也未到位。
解决步骤
1. 手动安装匹配版本的JavaFX SDK
放弃snap安装方式,直接下载和OpenJDK 17匹配的JavaFX 17 SDK,解压到本地固定目录,比如/opt/javafx-sdk-17。
2. 修改Ant构建脚本,配置JavaFX模块路径
找到MAVGCL项目中的build.xml,定位到deploy_linux_17目标里调用jlink的代码段,添加JavaFX模块路径参数,并显式声明所需的JavaFX模块:
<!-- 参考修改jlink调用部分,根据实际脚本调整 --> <exec executable="jlink"> <arg value="--module-path"/> <!-- 替换为你的JavaFX lib目录 + 项目自身的模块路径 --> <arg value="/opt/javafx-sdk-17/lib:${project.module.path}"/> <arg value="--add-modules"/> <!-- MAVGCL通常需要这些JavaFX模块,可按需调整 --> <arg value="javafx.controls,javafx.fxml,javafx.graphics"/> <arg value="--output"/> <arg value="./target/custom_jre"/> <!-- 保留原有其他参数 --> </exec>
如果脚本中用变量管理模块路径,直接把JavaFX的lib目录追加到对应变量中即可。
3. 先编译所有依赖仓库
在执行部署命令前,确保所有克隆的依赖项目已编译安装到本地仓库:
# 依次编译每个依赖 cd ../MAVBase && mvn clean install cd ../mavcom && mvn clean install cd ../mavutils && mvn clean install cd ../mavmap && mvn clean install # 回到MAVGCL主目录 cd ../MAVGCL/MAVGCL
4. 验证JavaFX模块路径配置
执行以下命令确认JVM能找到JavaFX模块:
java --module-path /opt/javafx-sdk-17/lib --list-modules | grep javafx
如果能列出javafx.controls等模块,说明路径配置正确。
5. 重新执行部署命令
ant clean deploy_linux_17
额外注意事项
- JDK和JavaFX版本必须严格匹配(均为17),避免版本不兼容
- 统一使用手动下载的JavaFX SDK,不要混合snap或其他来源的安装包
- 确保
build.xml中配置的JAVA_HOME指向你的OpenJDK 17安装目录
内容的提问来源于stack exchange,提问作者eg_julien
相关产品推荐
相关产品推荐

