如何解决在应用程序映像上找不到适合jdbc:sqlite的驱动程序
我有一个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
平稳地运行该应用程序,一切都按预期工作,并且该应用程序查询数据库没有问题。 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
,因为尝试访问我的数据库连接的数据库初始化例程。我怎样才能解决这个问题?预先感谢。
编辑:似乎该解决方案与在调用Class.forName()
之前添加DriverManager.getConnection()
语句有关。我尝试执行以下操作:
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解决此问题。基本上,程序所做的就是为module-info.class
创建一个.jar
,让JLink将其视为一个模块。 (很抱歉,如果缺少解释,我对Java的模块系统不了解。)
所以基本上我所做的是:
- 克隆Module-Info-Inject并运行它。
- 选择所需的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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。