Derby在使用Maven时提供ClassNotFoundException:org.apache.derby.jdbc.EmbeddedDriver

时间:2016-09-01 11:08:39

标签: java maven derby noclassdeffounderror classnotfoundexception

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

  1. java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver
  2. JDBC Derby driver not found
  3. SQLException: No suitable driver found for jdbc:derby://localhost:1527
  4. Class [org.apache.derby.jdbc.ClientDriver] not found Exception
  5. Class [org.apache.derby.jdbc.ClientDriver] not found. When trying to connect to db
  6. ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver when trying to use JPA with Derby
  7. 您好。
    在我的项目中,我正在使用 Maven ,我还希望在嵌入模式下使用 Derby数据库。因此,我通过以下方式更新了 pom.xml 文件:

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

    Maven成功下载了依赖项。它在 derven-10.12.1.1.jar 中的 Maven Dependencies 下的Eclipse BuildPath 中可见。
    然后我创建了测试类:

    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 文件创建外部存储库

    4. <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无法自行处理

      编辑:对于那些感兴趣的人。通过使用旧版本的德比,我暂时解决了问题:

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

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

3 个答案:

答案 0 :(得分:0)

我也面临着同样的问题,但是我过去了...

自从我从事intellij工作以来,我去了

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

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

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

单击“应用”。奏效了!

对于Eclipse,请尝试this

答案 1 :(得分:0)

尽管我仍然不知道为什么会这样:从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软件包。

答案 2 :(得分:0)

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