Beryx Badass Runtime镜像TLS握手异常及JavaFX模块警告问题
问题解决方案
问题2:JavaFX模块未知警告(--list-modules未列出JavaFX模块)
原因
Badass Runtime插件默认不会自动识别并纳入外部JavaFX模块,即便jar包存在于镜像lib目录,也会因模块未被正确加入模块路径触发未知模块警告。JavaFX在JDK11+属于外部模块化依赖,需显式配置插件将其纳入runtime镜像的模块系统。
解决步骤
- 修改
build.gradle中的Badass Runtime配置,显式指定需要包含的JavaFX模块:
plugins { id 'java' id 'org.openjfx.javafxplugin' version '0.0.13' id 'org.beryx.runtime' version '1.15.0' } // 配置JavaFX依赖模块 javafx { version = '11' modules = ['javafx.controls', 'javafx.graphics', 'javafx.web'] // 按需调整 } // 配置Runtime镜像 runtime { // 显式添加JavaFX模块到镜像 modules = [project.name, 'javafx.controls', 'javafx.graphics', 'javafx.web'] // 确保模块路径包含JavaFX模块 options = ['--add-modules', 'javafx.controls,javafx.graphics,javafx.web'] }
- 重新构建镜像:执行
./gradlew runtime,之后运行./build/image/bin/[你的应用名] --list-modules,应能看到JavaFX模块被列出,警告同步消失。
问题1:TLS握手时SSLProtocolException: Received close_notify during handshake
原因
Runtime镜像默认未包含完整的加密相关模块(如jdk.crypto.cryptoki、jdk.crypto.ec),或信任库cacerts缺失/不完整,导致与瑞士Topo服务器握手时无法完成证书验证或加密协商,触发连接关闭。IDE使用完整JDK,包含这些模块,因此无问题。
解决步骤
方案1:添加加密相关模块到Runtime配置
修改build.gradle的runtime配置,补充加密模块:
runtime { modules = [ project.name, 'javafx.controls', 'javafx.graphics', 'javafx.web', 'jdk.crypto.cryptoki', 'jdk.crypto.ec', 'java.net.http' // 若使用HttpClient拉取瓦片需添加 ] }
方案2:确保信任库cacerts被包含
Runtime镜像的默认cacerts可能缺少瑞士Topo服务器的根证书,需将完整JDK的信任库复制到镜像中:
- 在
build.gradle中添加配置:
runtime { jre { // 包含完整的cacerts文件 options = ['--include-files', 'lib/security/cacerts'] } }
- 若上述配置不生效,可手动复制JDK安装目录下
lib/security/cacerts到镜像的lib/security目录。
方案3:调试TLS握手过程
启动镜像时添加调试参数,定位具体问题:
./build/image/bin/[你的应用名] -Djavax.net.debug=ssl,handshake
根据输出日志查看握手失败的具体环节(如证书验证失败、协议不匹配等),针对性调整配置。
内容的提问来源于stack exchange,提问作者rickybobby
相关产品推荐
相关产品推荐

