簡體   English   中英

Derby 在使用 Maven 時給出 ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver

[英]Derby gives ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver while using Maven

我看過以下主題,但他們沒有發布我的問題的解決方案:

  1. java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver
  2. 找不到 JDBC Derby 驅動程序
  3. SQLException: 找不到適合 jdbc:derby://localhost:1527 的驅動程序
  4. 找不到類 [org.apache.derby.jdbc.ClientDriver] 異常
  5. 找不到類 [org.apache.derby.jdbc.ClientDriver]。 嘗試連接到數據庫時
  6. ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver 在嘗試將 JPA 與 Derby 一起使用時

你好。
在我的項目中,我使用Maven ,我還想在嵌入式模式下使用Derby 數據庫 因此,我通過以下方式更新了pom.xml文件:

<dependencies>
    ...
    <dependency>
        <groupId>org.apache.derby</groupId>
        <artifactId>derby</artifactId>
        <version>10.12.1.1</version>
    </dependency>
</dependencies>

Maven 成功下載了依賴項。 它在Maven 依賴項下的 Eclipse BuildPath中可見,為derby-10.12.1.1.jar
然后我創建了測試類:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.apache.derby.jdbc.EmbeddedDriver;

public class DerbyTest {
    public static void main (String...strings){
         try {
             DriverManager.registerDriver(new EmbeddedDriver());
            Connection conn = DriverManager.getConnection("jdbc:derby:test2;create=true");
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

這給了我以下 ClassNotFoundException

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/derby/jdbc/EmbeddedDriver
    at DerbyTest.main(DerbyTest.java:10)
Caused by: java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more

問題是——為什么? 該類位於構建路徑中。 Eclipse 沒有給我任何編譯時錯誤警告——它在編寫過程中看到了這個類。 依賴的范圍是編譯。 JVM 在查找類時應該沒有問題。 此外,JVM 對我使用的其他依賴項(jTest、Hibernate、SQLite)沒有問題。

Post Scriptum:我試圖解決這個難題:

  1. 我使用與上面相同的測試類創建了新項目 然后我從https://db.apache.org/derby/releases/release-10.12.1.1.cgi(bin版)手動下載了Derby,並手動將derby.jar添加到新項目的構建路徑中。 運行程序后,成功創建數據庫

  2. 然后我使用與以前相同的測試類創建了另一個新項目 2 我在我的本地存儲庫中找到了 Maven 的 Debry 版本(在C:\\Users\\User\\.m2\\repository\\org\\apache\\derby\\derby\\10.12.1.1 中)並手動將derby-10.12.1.1.jar添加到新項目的構建路徑 運行程序后,我得到了與使用 Maven 完全相同的錯誤

  3. 我使用手動下載的 Derby(從第 1 點開始)並通過在我的主項目中編輯pom.xml文件來創建外部存儲庫

.

<repositories>
    <repository>
        <id>derby-repo</id>
        <url>file://C:/libs</url>
    </repository>
</repositories>

<dependencies>
    ...
    <dependency>
        <groupId>derbygroupid</groupId>
        <artifactId>derby</artifactId>
        <version>0.0.1</version>
    </dependency>
</dependencies>

Maven 成功地在Maven 依賴項下的 Eclipse 的BuildPath 中添加了一個依賴項作為derby-0.0.1.jar 運行程序后,成功創建了數據庫
這通常可以解決問題,但問題是,為什么Maven 不能自己處理

編輯:對於那些有興趣的人。 我通過使用舊版本的 derby 暫時解決了問題:

<dependencies>
    ...
    <dependency>
        <groupId>org.apache.derby</groupId>
        <artifactId>derby</artifactId>
        <version>10.11.1.1</version>
    </dependency>
</dependencies> 

這個版本有效,但我仍然不知道為什么 10.12.1.1 沒有

我遇到了同樣的問題,但我克服了它......

自從我在 intellij 工作以來,我去了

文件->項目結構->模塊->依賴項

單擊加號並選擇 JAR 和依賴項

打開 jdk 的路徑,並在其中添加以下 jar 文件 1.derby.jar 2.derbyclient.jar 3.derbynet.jar 4.derbytools.jar 5.derby.jar

單擊應用。 它奏效了!

對於 Eclipse,試試 這個

雖然我仍然不明白為什么會這樣:從 Java 1.6 開始,即使您不手動注冊驅動程序,您對 DriverManager.getConnection() 的調用也會成功。 嘗試省略創建 EmbeddedDriver 的實例來注冊驅動程序並只獲取 Connection 對象。 我在調用 Class.forName("org.apache.derby.jdbc.EmbeddedDriver") 時遇到了相同的異常並簡單地將其刪除。

但是,關閉 Derby 將取消注冊驅動程序。 因此,如果您打算重新啟動 Derby,這個技巧只會在您關閉 Derby 之前有效一次。 在關閉時傳遞“deregister=false”將確保在初始注冊后不會刪除 Derby 驅動程序。

我正在使用相同 Maven 包的 10.15.2.0,並且在我的 pom.xml 中沒有進一步的 derby 包。

我遇到了同樣的問題,通過恢復到 10.11.1.1 版本的驅動程序一切正常。

暫無
暫無

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

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