【问题标题】:No suitable driver found for jdbc:sqlite on app image在应用映像上找不到适用于 jdbc:sqlite 的驱动程序
【发布时间】:2020-08-13 23:20:49
【问题描述】:

我有一个 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:compilejavafx:run 顺利运行应用程序,一切正常,应用程序查询数据库没有问题。在项目的根文件夹(与src/pom.xml 相同的文件夹)上创建data.sqlite 文件。

但是,当我尝试运行使用jlink 构建的可执行文件时,我收到了线程标题中描述的错误。首先,我运行了 maven 目标 javafx:jlink。这会在target/image/ 生成一些东西。我导航到target/image/bin 并运行./java -m &lt;name-of-my-module&gt;/&lt;group-id&gt;.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。任何提示...?

【问题讨论】:

  • 使用“现代”(Java 6+?)JDBC 驱动程序,不再需要 Class.forName
  • 你能检查一下 sqlite-jdbc 是否是生成的运行时映像的一部分吗?

标签: java sqlite maven javafx


【解决方案1】:

我担心这不能直接与 jlink 一起使用,因为据我所知 SQLite 还没有模块化。我在这里https://github.com/dlemmermann/JPackageScriptFX 描述了另一种方法,它也在内部使用 jlink,但仅用于创建专用运行时。使用这种方法链接 SQLite 可以工作。我知道这是因为我自己的应用程序也使用完全相同版本的 SQLite 驱动程序而没有问题。

【讨论】:

    【解决方案2】:

    我能够通过使用 Draque Thompson 的 Module Info Inject 解决这个问题。基本上,该程序所做的就是为您的.jar 创建一个module-info.class,让JLink 将其视为一个模块。 (如果缺少解释,抱歉,我对Java的模块系统没有深入的了解。

    所以基本上我所做的是:

    1. 克隆 Module-Info-Inject 并运行它。
    2. 选择需要的jar文件夹,点击“Inject”。
    3. 在生成的module-info.class 文件中,获取模块的名称。就我而言,它是sqlite.jdbc
    4. 将新模块添加到我项目的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;
    }
    

    【讨论】:

    • 我很高兴您能够解决您的问题,但在一般情况下,仅添加缺少的 module-info.class 是不够的。这样你就无法解决,例如拆分包问题和其他此类问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 2023-04-08
    • 2014-06-02
    • 1970-01-01
    • 2020-05-20
    相关资源
    最近更新 更多