我看过以下主题,但他们没有在我的问题上发布解决方案:
您好。
在我的项目中,我正在使用 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:我试图解决这个难题:
我使用与上面相同的测试类创建了新项目。然后我从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无法自行处理?
编辑:对于那些感兴趣的人。通过使用旧版本的德比,我暂时解决了问题:
<dependencies>
...
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>10.11.1.1</version>
</dependency>
</dependencies>
此版本有效,但我仍然不知道为什么10.12.1.1没有
答案 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版本,一切正常。