使用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
相关产品推荐
相关产品推荐

