簡體   English   中英

在應用圖像上找不到適用於 jdbc:sqlite 的驅動程序

[英]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:compilejavafx: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的模塊系統沒有深入的了解)。

所以基本上我所做的是:

  1. 克隆 Module-Info-Inject 並運行它。
  2. Select 所需的 jar 文件夾並單擊“注入”。
  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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM