NetBeans中mysql-connector正常,打包JRE运行时SQL类缺失
Java部署JRE缺失SQL核心类问题
我使用Win10、openjdk-18.0.2 x64、mysql-connector-j-8.2.0和Netbeans 15,通过Ant构建项目。IDE中运行时SQL相关功能正常;使用本地安装的Java执行java -jar app.jar也能正常运行。但需要部署到无Java环境的机器上,因此使用构建生成的appJRE运行时,appJre\bin\java -jar app.jar执行后,除SQL方法外其他功能均正常,会抛出NoClassDefFoundError,提示找不到SQLException、DriverManager等类。
IDE类路径中包含多个jar包,除mysql-connector*.jar外,其他jar在可执行文件中均能正常工作。该SQL驱动jar已放在dist/lib目录(与其他依赖jar同目录),尝试使用-Djava.libraries.path=dist\lib\mysql-connectors-j-8.2.0.jar启动无效。
按建议将jar包名称添加到Manifest中:仅添加mysql jar时,其他jar找不到;添加所有jar后,仅SQL jar报错。已查阅同类问题但无进展,若为版本冲突,IDE运行应也会报错,但实际IDE运行正常。
Manifest内容
Manifest-Version: 1.0 Ant-Version: Apache Ant 1.10.8 Created-By: 18.0.2+9-61 (Oracle Corporation) Class-Path: lib/jsch-0.1.55.jar lib/javaee-api-8.0.jar lib/AbsoluteLayout.jar lib/jfreechart-1.5.3.jar lib/mysql-connector-j-8.2.0.jar X-COMMENT: Main-Class will be added automatically by build Main-Class: app
目录结构
12/13/2023 10:24 AM <DIR> lib 12/13/2023 08:35 AM 1,471,425 app.jar 12/13/2023 10:24 AM <DIR> appJre
尝试过的启动命令
appJre\bin\java -jar app.jar appJre\bin\java -cp .:lib/* -jar app.jar
本地VM版本信息
<installed>java -version openjdk version "18.0.2" 2022-07-19 OpenJDK Runtime Environment (build 18.0.2+9-61) OpenJDK 64-Bit Server VM (build 18.0.2+9-61, mixed mode, sharing)
可部署VM版本信息
appJre\bin\java -version openjdk version "18.0.2" 2022-07-19 OpenJDK Runtime Environment (build 18.0.2+9-61) OpenJDK 64-Bit Server VM (build 18.0.2+9-61, mixed mode)
疑惑为何两者表现不同,似乎SQL库依赖SDK中JRE没有的内容。堆栈信息如下:
java.lang.NoClassDefFoundError: java/sql/SQLException at controllers.GuiMan.init(GuiMan.java:137) at controllers.MainFrame.init(MainFrame.java:181) at controllers.MerlinLab.lambda$main$0(MerlinLab.java:43) at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90) Caused by: java.lang.ClassNotFoundException: java.sql.SQLException at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 16 more
内容的提问来源于stack exchange,提问作者MattMan
相关产品推荐
相关产品推荐

