[英]java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver
[英]Derby gives ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver while using Maven
我看過以下主題,但他們沒有發布我的問題的解決方案:
你好。
在我的項目中,我使用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:我試圖解決這個難題:
我使用與上面相同的測試類創建了新項目。 然后我從https://db.apache.org/derby/releases/release-10.12.1.1.cgi(bin版)手動下載了Derby,並手動將derby.jar添加到新項目的構建路徑中。 運行程序后,成功創建了數據庫。
然后我使用與以前相同的測試類創建了另一個新項目 2 。 我在我的本地存儲庫中找到了 Maven 的 Debry 版本(在C:\\Users\\User\\.m2\\repository\\org\\apache\\derby\\derby\\10.12.1.1 中)並手動將derby-10.12.1.1.jar添加到新項目的構建路徑。 運行程序后,我得到了與使用 Maven 完全相同的錯誤。
我使用手動下載的 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.