You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX+MySQL程序自定义JRE运行失败,需排查依赖模块

JavaFX程序搭配自定义JRE后MySQL连接失败,隐式依赖jdk.crypto.cryptoki模块的疑问

我开发了一个基于JavaFX的小型应用,通过JDBC连接MySQL数据库。Jar包单独运行完全正常,但用launch4j打包成exe并搭配自己构建的精简JRE后,exe只能在装有完整JRE的环境下运行,用自定义JRE启动时会抛出通信链接失败的错误,具体日志如下:

[10-Jul-2023 15:40] FATAL - DbConnection.java - Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
←[mException in Application start method
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at javafx.graphics@19.0.2.1/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:465)
at javafx.graphics@19.0.2.1/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method

我尝试用jdeps分析依赖:

jdeps --ignore-missing-deps --list-deps --multi-release 11 --module-path javafx\lib;libs --add-modules ALL-MODULE-PATH ExpensesViewer.jar

得到的依赖列表包含java.base、java.sql等模块以及多个JavaFX模块,但没检测到java.naming这类实际需要的模块。之后我用jlink构建自定义JRE:

jlink --no-header-files --no-man-pages --compress=2 --strip-debug --module-path libs;javafx/lib --add-modules java.base,java.naming,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,jdk.xml.dom --output java-runtime

程序还是无法运行,直到我尝试添加所有可能的模块后才恢复正常,最终发现问题出在缺少jdk.crypto.cryptoki模块。

我从来没有直接使用过这个模块,想请教两个问题:

  1. 我的程序为什么会依赖jdk.crypto.cryptoki模块?
  2. 有没有更高效的方法排查这类隐式依赖问题?

附上我的module-info.java内容:

module ru.viewer.expensesviewer {
    requires javafx.controls;
    requires javafx.fxml;
    requires java.sql;
    requires mysql.connector.j;
    requires org.apache.logging.log4j;
    //requires rt;

    opens ru.viewer.expensesviewer to javafx.fxml;
    exports ru.viewer.expensesviewer;

    opens ru.viewer.expensesviewer.model to javafx.fxml;
    exports ru.viewer.expensesviewer.model;

    opens ru.viewer.expensesviewer.controller to javafx.fxml;
    exports ru.viewer.expensesviewer.controller;

    exports ru.viewer.expensesviewer.model.objects;
    opens ru.viewer.expensesviewer.model.objects to javafx.fxml;

    exports ru.viewer.expensesviewer.controller.settings;
    opens ru.viewer.expensesviewer.controller.settings to javafx.fxml;

    exports ru.viewer.expensesviewer.controller.reports;
    opens ru.viewer.expensesviewer.controller.reports to javafx.fxml;

    exports ru.viewer.expensesviewer.model.objects.settings;
    opens ru.viewer.expensesviewer.model.objects.settings to javafx.fxml;
}

内容的提问来源于stack exchange,提问作者Алексей Благодатских

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 23:15:02