Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取java.lang.NoClassDefFoundError:无法初始化类oracle.jdbc.OracleDriver异常_Java_Jdbc_Sybase - Fatal编程技术网

获取java.lang.NoClassDefFoundError:无法初始化类oracle.jdbc.OracleDriver异常

获取java.lang.NoClassDefFoundError:无法初始化类oracle.jdbc.OracleDriver异常,java,jdbc,sybase,Java,Jdbc,Sybase,在尝试使用JDBC驱动程序访问数据库时,我看到一些奇怪的行为。下面是代码片段: LOGGER.debug("driver is " + driver); try { Class.forName(driver); LOGGER.debug("got driver"); } catch (Throwable t) { LOGGER.debug("throwable getting driver " + driver); t.printStackTrace(System

在尝试使用JDBC驱动程序访问数据库时,我看到一些奇怪的行为。下面是代码片段:

LOGGER.debug("driver is " + driver);
try {
    Class.forName(driver);
    LOGGER.debug("got driver");
} catch (Throwable t) {
    LOGGER.debug("throwable getting driver " + driver);
    t.printStackTrace(System.out);
    throw t;
}
当我运行这个程序时,下面是我在堆栈跟踪中看到的内容

08:20:00.417 [main] DEBUG - driver is com.sybase.jdbc4.jdbc.SybDriver
08:20:00.604 [main] DEBUG - throwable getting driver com.sybase.jdbc4.jdbc.SybDriver
java.lang.NoClassDefFoundError: Could not initialize class oracle.jdbc.OracleDriver
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:398)
        at java.sql/java.sql.DriverManager.isDriverAllowed(DriverManager.java:555)
        at java.sql/java.sql.DriverManager.isDriverAllowed(DriverManager.java:547)
        at java.sql/java.sql.DriverManager.getDrivers(DriverManager.java:449)
        at java.sql/java.sql.DriverManager.getDrivers(DriverManager.java:426)
        at com.sybase.jdbc4.jdbc.SybDriver.registerWithDriverManager(Unknown Source)
        at com.sybase.jdbc4.jdbc.SybDriver.<init>(Unknown Source)
        at com.sybase.jdbc4.jdbc.SybDriver.<clinit>(Unknown Source)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:315)
        ... my code

这不是一个完整的答案,但与自动驱动程序加载相结合,似乎是一个类加载问题

当显式使用
Class.forName
加载JDBC驱动程序时,驱动程序应该在
java.sql.DriverManager
中注册

查看堆栈跟踪,特别是:

代码示例9-1实现java.sql.driver

加载
驱动程序
实现时,静态初始值设定项将 自动注册驱动程序的实例

由于调用了
DriverManager.getDrivers
,它将自动加载
META-INF/service/java.sql.drivers
文件(以及系统属性
jdbc.drivers
中的文件)中类路径上的驱动程序

看起来Oracle JDBC驱动程序是通过这种方式发现和加载的,但随后在
isDriverAllowed
中检查当前类加载器中是否有可用的驱动程序失败,并出现
NoClassDefFoundError
(该检查捕获异常,但不捕获错误,可能应该)

作为一种解决方法,您应该从类路径中删除Oracle JDBC驱动程序,或者找出它在当前类加载器中不可用的原因

作为进一步的诊断,尝试在代码中调用
DriverManager.getDrivers()
Class.forName(“oracle.jdbc.Driver
),甚至调用
new-oracle.jdbc.Driver()
,看看会发生什么


您可能还需要检查Sybase驱动程序的版本,如果有更新的版本不进行此检查,尽管这可能会导致代码中的其他地方出现错误。

因此,我做了以下进一步的调查。我编写了一个最简单的完整示例:

import java.sql.*;
import java.util.*;

public class TestDrivers {

    public static void main(String[] args) {
        try {
            Enumeration<Driver> driverEnumeration = DriverManager.getDrivers();
            while (driverEnumeration.hasMoreElements()) {
                Driver driver = driverEnumeration.nextElement();
                System.out.println("driver is " + driver.getClass().getName());
            }
        } catch (Throwable t) {
            System.out.println("throwable getting drivers");
            t.printStackTrace(System.out);
            throw t;
        }
    }
}

最后,我在运行JDK 8的另一台机器上尝试了这一点,并且所有四种类路径变体都成功运行。

可能,您的类路径中没有相应的jar文件。您是否检查了相同的jar文件?您是否有更深入的堆栈跟踪,可能有异常原因?您不需要此代码。自2007年以来,它就没有必要了。请删除我的代码t、 如果我没有弄错的话,我删除了Class.forName()的用法,并检查了所有相关的JDBC库JAR文件是否都是类型4(即包含META-INF\services\java.sql.Driver文件)。但是,我仍然看到了相同的问题:当应用程序尝试使用com.sybase.jdbc4.jdbc.sybdriver时,无法初始化类oracle.jdbc.OracleDriver。我可以通过从类路径中删除oracle jdbc库JAR来避免此错误,但当应用程序需要连接到oracle和我还没有解决这个问题,但这非常有用。我添加了DriverManager.getDrivers();然后重新运行代码。我应该在这里添加,我的类路径包含多个包含JDBC驱动程序的JAR文件。其中一个JAR文件是ojdbc6-11.1.0.6.0.JAR。如果这包含在类路径中,则应用程序会在DriverManager.getDrivers()处抛出错误行。如果我从类路径中删除这个JAR文件,那么我可以看到预期的其他JDBC驱动程序列表。替换为ojdbc7.JAR没有帮助。我将尝试看看升级Sybase驱动程序是否有帮助…@user304582,因为您正在使用Java 11(或至少9或更高版本),您可能想尝试更新版本的Oracle JDBC驱动程序(如18.3)。我不知道错误的确切上下文,因此很难提供更具体的帮助。发布完整的异常堆栈跟踪,并详细描述您的应用程序可能会有所帮助(例如,它是一个简单的应用程序,还是一个Java EE应用程序,或者…,依赖关系是如何安排的等等)。如果您可以通过创建一个应用程序将其减少到最低限度,这也会有所帮助。您是否也尝试过使用较新版本的Oracle JDBC驱动程序(例如18.3)?另外,这是哪个版本的Sybase驱动程序?另外,如果使用
java-Xlog:class*=debug运行此驱动程序,日志记录是什么
    at java.sql/java.sql.DriverManager.getDrivers(DriverManager.java:426)
    at com.sybase.jdbc4.jdbc.SybDriver.registerWithDriverManager(Unknown Source)
    at com.sybase.jdbc4.jdbc.SybDriver.<init>(Unknown Source)
    at com.sybase.jdbc4.jdbc.SybDriver.<clinit>(Unknown Source)
    at java.base/java.lang.Class.forName0(Native Method)
public class AcmeJdbcDriver implements java.sql.Driver {
    static {
        java.sql.DriverManager.registerDriver(new AcmeJdbcDriver());
    }
    ... 
} 
import java.sql.*;
import java.util.*;

public class TestDrivers {

    public static void main(String[] args) {
        try {
            Enumeration<Driver> driverEnumeration = DriverManager.getDrivers();
            while (driverEnumeration.hasMoreElements()) {
                Driver driver = driverEnumeration.nextElement();
                System.out.println("driver is " + driver.getClass().getName());
            }
        } catch (Throwable t) {
            System.out.println("throwable getting drivers");
            t.printStackTrace(System.out);
            throw t;
        }
    }
}
java.lang.NoClassDefFoundError: Could not initialize class oracle.jdbc.OracleDriver
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:398)
        at java.sql/java.sql.DriverManager.isDriverAllowed(DriverManager.java:555)
        at java.sql/java.sql.DriverManager.isDriverAllowed(DriverManager.java:547)
        at java.sql/java.sql.DriverManager.getDrivers(DriverManager.java:449)
        at java.sql/java.sql.DriverManager.getDrivers(DriverManager.java:426)
        at com.javamarket.drivers.TestDrivers.main(TestDrivers.java:10)
Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class oracle.jdbc.OracleDriver
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:398)
        at java.sql/java.sql.DriverManager.isDriverAllowed(DriverManager.java:555)
        at java.sql/java.sql.DriverManager.isDriverAllowed(DriverManager.java:547)
        at java.sql/java.sql.DriverManager.getDrivers(DriverManager.java:449)
        at java.sql/java.sql.DriverManager.getDrivers(DriverManager.java:426)
        at com.javamarket.drivers.TestDrivers.main(TestDrivers.java:10)