Derby 在使用 Maven 时给出 ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver

Posted

技术标签:

【中文标题】Derby 在使用 Maven 时给出 ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver【英文标题】:Derby gives ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver while using Maven 【发布时间】:2017-01-09 05:51:16 【问题描述】:

我看到了以下主题,但他们没有发布我的问题的解决方案:

    java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver JDBC Derby driver not found SQLException: No suitable driver found for jdbc:derby://localhost:1527 Class [org.apache.derby.jdbc.ClientDriver] not found Exception Class [org.apache.derby.jdbc.ClientDriver] not found. When trying to connect to db ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver when trying to use JPA with 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 Dependencies 下的 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 Dependencies 下的 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 没有

【问题讨论】:

也许线索在术语BuildPath 中。也许BuildPath 仅在您构建 项目时使用,而不是在您运行 项目时使用? 如何判断BuildPath是否只用于构建?另一方面,在同一个项目中,手动下载的 derby 可以工作,而 maven 的 derby 则不能。 2021 仍然面临同样的问题,感谢您的回答。 【参考方案1】:

我也遇到了同样的问题,但我解决了...

由于我在从事intellij工作,所以我去了

文件->项目结构->模块->依赖项

单击加号并选择 JAR 和依赖项

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

点击应用。成功了!

对于 Eclipse,请尝试 this。

【讨论】:

【参考方案2】:

虽然我还不明白为什么会这样:从 Java 1.6 开始,即使您不手动注册驱动程序,您对 DriverManager.getConnection() 的调用也会成功。尝试省略创建 EmbeddedDriver 的实例来注册驱动程序并仅获取 Connection 对象。我在调用 Class.forName("org.apache.derby.jdbc.EmbeddedDriver") 时遇到了同样的异常,只是将其删除。

但是,关闭 Derby 将注销驱动程序。因此,如果您打算重新启动 Derby,则此技巧将只工作一次,直到您关闭 Derby。在关机时传递“deregister=false”将确保在初始注册后不会删除 Derby Driver。

我正在使用同一个 Maven 包的 10.15.2.0,并且我的 pom.xml 中没有更多的 derby 包。

【讨论】:

【参考方案3】:

我遇到了同样的问题,通过恢复到 10.11.1.1 版本的驱动程序一切正常。

【讨论】:

以上是关于Derby 在使用 Maven 时给出 ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apache Derby 作为嵌入式数据库的 Spring-boot 错误

使用Gradle将Maven库打包成Jar

在 DERBY 查询中省略模式

org.apache.derby.jdbc.ClientDriver 在哪里?

apache Derby - 在创建新数据库时获取 java.io.FileNotFoundException: derby.log (Access is denied)

Eclipse 中的项目无法解析 Maven 依赖项中存在的 jars