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

Tyv*_*rel 8 java derby noclassdeffounderror maven classnotfoundexception

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

  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>
Run Code Online (Sandbox Code Playgroud)

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这给了我以下 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
Run Code Online (Sandbox Code Playgroud)

问题是——为什么?该类位于构建路径中。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>
Run Code Online (Sandbox Code Playgroud)

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> 
Run Code Online (Sandbox Code Playgroud)

这个版本有效,但我仍然不知道为什么 10.12.1.1 没有

小智 0

我也面临着同样的问题,但我已经克服了......

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

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

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

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

单击“应用”。有效!

对于 Eclipse,试试这个