[英]No suitable driver found for jdbc:sqlite on app image
我有一个 JavaFX 应用程序连接到 SQLite 使用
Connection connection = DriverManager.getConnection("jdbc:sqlite:data.sqlite");
我的 pom 文件中有 SQLite 驱动程序的依赖项:
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.32.3.2</version>
</dependency>
我可以使用 Maven 目标javafx:compile
和javafx:run
顺利运行应用程序,一切正常,应用程序查询数据库没有问题。 在项目的根文件夹(与src/
和pom.xml
相同的文件夹)上创建data.sqlite
文件。
但是,当我尝试运行使用jlink
构建的可执行文件时,我收到了线程标题中描述的错误。 首先,我跑了 maven 目标javafx:jlink
。 这会在target/image/
处生成一些东西。 我导航到target/image/bin
并运行./java -m <name-of-my-module>/<group-id>.App
,这是运行我构建的文件的命令。 然后我得到:
No suitable driver found for jdbc:sqlite:data.sqlite
还有一个NullPointerException
,因为数据库初始化例程尝试访问我的数据库连接。 我怎样才能解决这个问题? 提前致谢。
编辑:似乎该解决方案与在调用DriverManager.getConnection()
之前添加Class.forName()
语句有关。 我尝试执行以下操作:
Class.forName("org.sqlite.JDBC");
Connection connection = DriverManager.getConnection("jdbc:sqlite:data.sqlite");
通过这样做,现在应用程序呈现,但是。 它仍然崩溃。 我得到ClassNotFoundException: org.sqlite.JDBC
。 任何提示...?
我担心这不会直接与 jlink 一起使用,因为据我所知 SQLite 尚未模块化。 我在这里描述了另一种方法https://github.com/dlemmermann/JPackageScriptFX它也在内部使用 jlink 但仅用于创建专用运行时。 使用这种方法链接 SQLite 可以工作。 我知道这是因为我自己的应用程序也使用完全相同版本的 SQLite 驱动程序而没有问题。
我能够通过使用 Draque Thompson 的Module Info Inject来解决这个问题。 基本上,该程序所做的是为您的 .jar 创建一个module-info.class
.jar
让 JLink 将其视为一个模块。 (对不起,如果缺乏解释,我对Java的模块系统没有深入的了解)。
所以基本上我所做的是:
module-info.class
文件中,获取模块的名称。 就我而言,它是sqlite.jdbc
。module-info.java
中。 为 SQLite 驱动程序生成的module-info.class
文件:
module sqlite.jdbc {
requires transitive java.logging;
requires transitive java.sql;
exports org.sqlite;
exports org.sqlite.core;
exports org.sqlite.date;
exports org.sqlite.javax;
exports org.sqlite.jdbc3;
exports org.sqlite.jdbc4;
exports org.sqlite.util;
provides java.sql.Driver with org.sqlite.JDBC;
}
在我的项目的module-info.java
中需要模块:
module com.demo {
requires sqlite.jdbc;
/ * ... * /
exports pkg.app;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.