使用jlink构建自定义JRE启动JavaFX程序时出现JNDI不支持错误
问题描述
开发了一个JavaFX小程序,打包为Jar后通过start.bat加载JavaFX模块可正常启动,但完整JRE17体积超400MB。使用jdeps分析依赖后,通过jlink生成了自定义JRE(目标体积约135MB),但在无Java环境的电脑上启动程序时出现以下错误:
WARN StatusConsoleListener JNDI lookup class is not available because this JRE does not support JNDI. JNDI string lookups will not be available, continuing configuration. Ignoring java.lang.NoClassDefFoundError: javax/naming/Context
Exception in Application start method
使用的命令如下:
jdeps --ignore-missing-deps --list-deps --multi-release 17 --module-path libs --add-modules ALL-MODULE-PATH ExpensesViewer.jar
jlink --no-header-files --no-man-pages --compress=2 --strip-debug --module-path libs;javafx/lib --add-modules java.datatransfer,java.desktop,java.logging,java.management,java.net.http,java.scripting,java.sql,java.transaction.xa,java.xml,jdk.jsobject,jdk.unsupported,jdk.unsupported.desktop --output java-runtime
使用的Java版本:
java version "17.0.2" 2022-01-18 LTS Java(TM) SE Runtime Environment (build 17.0.2+8-LTS-86) Java HotSpot(TM) 64-Bit Server VM (build 17.0.2+8-LTS-86, mixed mode, sharing)
解决方案
- 添加JNDI相关模块
错误提示缺少javax/naming/Context,该类属于java.naming模块,需要在jlink命令的--add-modules参数中加入该模块。修改后的jlink命令如下:
jlink --no-header-files --no-man-pages --compress=2 --strip-debug --module-path libs;javafx/lib --add-modules java.datatransfer,java.desktop,java.logging,java.management,java.net.http,java.naming,java.scripting,java.sql,java.transaction.xa,java.xml,jdk.jsobject,jdk.unsupported,jdk.unsupported.desktop --output java-runtime
- 验证依赖完整性
如果添加java.naming后仍有问题,建议去掉jdeps命令中的--ignore-missing-deps参数,重新分析依赖,确保没有遗漏其他必要模块。修改后的jdeps命令:
jdeps --list-deps --multi-release 17 --module-path libs --add-modules ALL-MODULE-PATH ExpensesViewer.jar
该命令会严格检查所有依赖,避免遗漏隐藏的模块依赖。
- 检查JavaFX模块完整性
确保javafx/lib路径下包含程序实际使用的所有JavaFX模块(如javafx.controls、javafx.fxml等),jlink的--module-path需正确覆盖这些模块,避免因JavaFX模块缺失导致启动失败。
内容的提问来源于stack exchange,提问作者Алексей Благодатских
相关产品推荐
相关产品推荐

