JDBC Derby驱动程序未找到。

13
我已经按照http://docs.oracle.com/javase/tutorial/jdbc/basics/gettingstarted.html中的JDBC教程创建了自己的JDBC数据库,一切都进行得很顺利。但是,当我尝试从Java应用程序连接到数据库时,出现了以下异常错误信息:

java.sql.SQLException: No suitable driver found for jdbc:derby:db directory

之后,我试图手动指定JDBC驱动程序,使用的方法是:
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");

我收到以下异常错误:

java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver

我确定该驱动程序不应该出现加载问题,因为该驱动程序在教程中指定,并且在使用该驱动程序创建数据库时没有任何问题。我甚至尝试在连接语句的末尾添加属性" ;create=true"以创建全新的数据库,但仍然收到相同的异常错误。

请参见下面的应用程序代码。 任何帮助都将是fantastic :).

package com.ddg;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;


public class SQLConnect
{
    Connection Conn = null;
    String URL;
    String Username;
    String Password;

    public SQLConnect()
    {
        try
        {
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
        }
        catch (ClassNotFoundException e)
        {
            System.out.println(e.toString());
        }
        URL = "jdbc:derby:*directory name*";

        System.out.println("Created SQL Connect");
    }

    public void CreateConnection()
    {
        try
        {
            Conn = DriverManager.getConnection(URL);
            System.out.println("Successfully Connected");
        }
        catch (SQLException e)
        {
            System.out.println(e.toString());
        }
    }

    public void CloseConnection()
    {
        try
        {
            this.Conn.close();
            System.out.println("Connection successfully closed");
        }
        catch (SQLException e)
        {
            System.out.println(e.toString());
        }
    }

    public static void main(String args[])
    {
        SQLConnect sql = new SQLConnect();
        sql.CreateConnection();
        sql.CloseConnection();
    }
}

1
你如何指定类路径? - home
1
你能尝试一下 "jdbc:derby:" + dbName + ";create=true" 吗? - longhua
1
将derby.jar添加到您的类路径中。 - longhua
@lhuang 我刚试了你的第一个建议,但是收到了同样关于无法找到驱动程序的错误信息。关于你的第二个建议,我该如何将它添加到我的项目类路径中?我已经下载了Derby库文件并将其添加到了我的Windows环境变量路径中。 - Ice Phoenix
如果您正在通过命令行运行Java,则应将JAR添加到CLASSPATH环境中,而不是Path。如果您使用的是Eclipse,请参考http://www.wikihow.com/Add-JARs-to-Project-Build-Paths-in-Eclipse-(Java)。 - longhua
@lhuang,非常感谢您提供的提示,将Derby文件添加到我的Lib文件夹中。我之前尝试过这种方法,但最初并没有成功,所以放弃了这种方法,应该坚持自己的直觉 :) - Ice Phoenix
11个回答

12

java.sql.SQLException: 找不到适用于jdbc:derby:db directory的驱动程序

所以你的错误可能是由以下原因引起的:

驱动程序没有正确加载或者你的URL格式不正确。所以首先需要确保*.jar在类路径中。请检查它。

还可以尝试将URL更改为:

jdbc:derby://<path>/<databasename>;create=true

create=true 确保若数据库不存在,则会创建一个新的数据库。

更新:

同时请查看此线程:SQLException: No suitable driver found for jdbc:derby://localhost:1527


感谢你的建议,Sajmon。事实证明,我缺少引用库(Classpath)中所需的derby文件。我将它们添加进去后,能够创建一个新的数据库,甚至链接到我的旧数据库。现在只需要想办法使用外部IP地址链接到数据库了哈哈 :) - Ice Phoenix

7
如果您遇到此类型的错误:
java.lang.ClassNotFoundException: org.apache.derby.jdbc.ClientDriver

如果您正在使用NetBeans,需要遵循以下步骤:
  1. 右键单击库
  2. 选择添加库选项,并从库列表中选择"Java DB Driver"

enter image description here


6

Java JDK 包含两部分

org.apache.derby.jdbc.EmbeddedDriver
org.apache.derby.jdbc.ClientDriver

在eclipse中,将以下jars添加到使用的JRE(JDK)或显式添加到您的项目中。

[JDK]db/lib/derby.jar (EmbeddedDriver)
[JDK]db/lib/derbyclient.jar (ClientDriver)

为了运行程序,您需要为Java应用程序提供适当的jar文件。


2

你说你已经按照教程操作了。在教程中,你需要安装JDBC驱动程序。

安装JDBC驱动程序通常包括将驱动程序复制到计算机上,然后将其位置添加到类路径中。

安装驱动程序后,运行以下命令:

java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver

这只有在您使用了正确的驱动程序时才可能实现。
您已经使用了


org.apache.derby.jdbc.EmbeddedDriver

加载驱动程序

但应使用

org.apache.derby.jdbc.ClientDriver

你怎么知道Ice Phoenix正在使用Derby服务器? - user330315
但是如果他正在使用嵌入式数据库,他必须使用嵌入式驱动程序。如果他正在使用服务器连接,他需要首先启动服务器,而他的帖子没有提到这一点。 - user330315
@a_horse_with_no_name 如果更换驱动程序可以解决问题,那么我的任务就完成了。 - user2173738
谢谢大家的建议,但像上面所说的那样,问题就在于没有引用驱动程序 : )。虽然如此,我真的很感激你们对此的贡献,谢谢。 - Ice Phoenix
@a_horse_with_no_name 我猜OP已经安装了JDBC驱动程序,根据他所遵循的教程第3页所说。如果OP弄混了嵌入式驱动程序,我猜库中没有使用嵌入式驱动程序。但是最近OP在这里发表评论说不理解教程的第3页。如果理解了,OP就不会出现java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver的错误。你明白吗? - user2173738
显示剩余2条评论

1
我在使用ClientDriver时遇到了java.lang.ClassNotFoundException错误。 我使用的是最新的驱动程序二进制文件,这就是错误的原因。
当时,最新的驱动程序二进制文件是10.15.1.3,在这里:Apache Site 我使用的是Java 8,并且使用Hibernate 5.4.2.Final。 然而,驱动程序是针对Java 9编译的。

1
请参阅https://db.apache.org/derby/papers/DerbyTut/install_software.html#derby_configure中的“设置DERBY_INSTALL”和“配置嵌入式Derby”部分以获取详细信息。
Derby是JavaSE安装的一部分,我已经设置了环境变量DERBY_HOME,而不是链接中显示的DERBY_INSTALL
C:\> set DERBY_HOME=c:\Program Files\Java\jdk1.8.0_60\db
C:\> set CLASSPATH=%DERBY_INSTALL%\lib\derby.jar;%DERBY_INSTALL%\lib\derbytools.jar;.
C:\> cd %DERBY_INSTALL%\bin
c:\Program Files\Java\jdk1.8.0_60\db\bin> setEmbeddedCP.bat

0
尝试了很多其他选项,但最终通过简单地从我的代码中删除以下行来解决了这个问题:
Class.forName(driverClass);

我在某个地方读到Derby使用默认的JDK内部JDBC驱动程序。
我查看了Derby安装中附带的许多JAR文件,并寻找org.apache.derby.jdbc.EmbeddedDriver类。但是没有在任何JAR文件中找到它。
有点令人惊讶,但这是真的,因为它可以工作。
注意:您必须将Derby.jar保留在类路径上,此答案专门针对Derby的嵌入式模式。


0

我一直将所需的JDBC驱动程序放在jre\lib\ext目录中,例如。 在我的系统上,它是:X:\Java\jre1.8.0_181\lib\ext 希望这可以帮到你。


0

这似乎是一个古老的问题,让我和其他人在这个帖子中感到极度沮丧。尽管在Eclipse IDE测试工具中成功运行测试,但如果通过网络连接调用应用程序,则应用程序将无法加载嵌入式驱动程序。

凭借很少的证据,我要建议问题出在Derby和它搜索classpath以查找驱动程序的方式上,而延迟会导致并发问题,因为当在其工作区之外进行搜索时,它无法及时找到驱动程序。我已经多次重复了这个测试,并且只有在创建一个SharedLibraries项目并将此共享库添加到libraries classpath中(如屏幕截图所示)后,才能实现一致性。

enter image description here

你可以通过使用 Project->Properties->Java Build Path->Libraries 来实现。这种方法的唯一缺点是你不知道库的来源和版本,但如果这是一个问题,你可以通过将版本号添加到库文件中来解决。

0
我最近发现,如果你使用 jlink 创建运行时环境,你可能需要包含额外的 JDK 模块来允许驱动程序实例化。
在我的情况下,我需要在镜像中包含 java.namingjava.management 模块。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接