在应用图片上找不到适合 jdbc:sqlite 的 driver
No suitable driver found for jdbc:sqlite on app image
我有一个使用
连接到 SQLite 的 JavaFX 应用程序
Connection connection = DriverManager.getConnection("jdbc:sqlite:data.sqlite");
我的 pom 文件有 SQLite driver 的依赖项:
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.32.3.2</version>
</dependency>
我可以 运行 使用 Maven 目标 javafx:compile
和 javafx:run
顺利地应用程序,一切都按预期工作,应用程序查询数据库没有问题。 data.sqlite
文件创建在项目的根文件夹(与 src/
和 pom.xml
相同的文件夹)。
但是,当我尝试 运行 使用 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
,让 JLink 将其视为一个模块。 (抱歉,如果解释不足,我对 Java 的模块系统了解不深)。
基本上我所做的是:
- 克隆 Module-Info-Inject 并 运行 它。
- Select 所需的 jar 文件夹并单击“注入”。
- 在生成的
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;
}
我有一个使用
连接到 SQLite 的 JavaFX 应用程序Connection connection = DriverManager.getConnection("jdbc:sqlite:data.sqlite");
我的 pom 文件有 SQLite driver 的依赖项:
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.32.3.2</version>
</dependency>
我可以 运行 使用 Maven 目标 javafx:compile
和 javafx:run
顺利地应用程序,一切都按预期工作,应用程序查询数据库没有问题。 data.sqlite
文件创建在项目的根文件夹(与 src/
和 pom.xml
相同的文件夹)。
但是,当我尝试 运行 使用 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
,让 JLink 将其视为一个模块。 (抱歉,如果解释不足,我对 Java 的模块系统了解不深)。
基本上我所做的是:
- 克隆 Module-Info-Inject 并 运行 它。
- Select 所需的 jar 文件夹并单击“注入”。
- 在生成的
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;
}