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

使用jpackage打包的JavaFX程序运行时出现类找不到异常

解决jpackage打包JavaFX项目后java.sql.DriverClassNotFound的问题

问题场景

在Linux系统的NetBeans中,使用jpackage命令打包JavaFX Maven项目:

./jpackage --input ~/Documents/NetBeans/MyFX/target/ --dest ~/Documents/NetBeans/MyFX/ --name "MyFX" --main-jar MyFX-2.0.jar --main-class my.myfx.App --icon ~/Documents/NetBeans/MyFX/mypic.png --add-modules javafx.controls,javafx.fxml

程序安装正常,但终端运行时抛出异常:

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at javafx.fxml@19/javafx.fxml.FXMLLoader$MethodHandler.invoke(Unknown Source)
    at javafx.fxml@19/javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(Unknown Source)
...
Caused by: java.lang.NoClassDefFoundError: java/sql/DriverManager
    at my.myfx.DB.init(DB.java:22)
... 50 more
Caused by: java.lang.ClassNotFoundException: java.sql.DriverManager
... 57 more

出错代码行:

java.sql.Connection conn;
String fileName="a.db";
conn=java.sql.DriverManager.getConnection("jdbc:sqlite:"+fileName);

module-info配置:

module my.myfx {
    requires javafx.controls;
    requires javafx.fxml;
    requires java.logging;
    requires java.base;
    requires java.sql;
    requires org.apache.poi.poi;
    requires org.apache.poi.ooxml;
    requires jarchivelib;

    opens my.myfx to javafx.fxml;
    exports my.myfx;
}

POM依赖包含:javafx-controls、javafx-fxml、maven-jar-plugin、maven-dependency-plugin、javafx-maven-plugin

解决方案

1. 修正jpackage命令的模块参数

jpackage命令仅添加了JavaFX相关模块,未包含java.sql模块,导致运行时无法加载JDBC核心类。修改命令,在--add-modules中补充java.sql:

./jpackage --input ~/Documents/NetBeans/MyFX/target/ --dest ~/Documents/NetBeans/MyFX/ --name "MyFX" --main-jar MyFX-2.0.jar --main-class my.myfx.App --icon ~/Documents/NetBeans/MyFX/mypic.png --add-modules javafx.controls,javafx.fxml,java.sql

2. 补充SQLite JDBC驱动依赖

你的POM中缺少SQLite的JDBC驱动依赖,需添加到<dependencies>节点:

<dependency>
    <groupId>org.xerial</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.45.2.0</version> <!-- 使用最新稳定版本 -->
</dependency>

同时确保maven-dependency-plugin配置正确,将依赖复制到打包目录的lib文件夹(jpackage会自动扫描该目录加载依赖),若POM未配置,添加如下插件配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <overWriteReleases>false</overWriteReleases>
                <overWriteSnapshots>false</overWriteSnapshots>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>

3. 验证模块配置

虽然module-info已声明requires java.sql;,但java.sql作为JDK内置模块,必须在jpackage的--add-modules中明确指定,否则运行时模块路径不会自动包含该模块,导致类加载失败。

内容的提问来源于stack exchange,提问作者JavaUser007

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:25:18