【发布时间】:2019-07-24 10:20:06
【问题描述】:
我在尝试使用 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
所以我可以看到我想要获取的驱动程序名称是 com.sybase.jdbc4.jdbc.SybDriver,这是正确的,但由于某种原因,DriverManager 正在寻找 oracle.jdbc.OracleDriver。
发生了什么事?这段代码多年来一直运行良好,我唯一能想到的其他相关信息是我最近将这台机器上的 JDK 升级为 Open JDK 11。
>java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
【问题讨论】:
-
可能您的类路径中没有相应的 jar 文件。你也检查过吗?
-
你有更深的堆栈跟踪,可能有异常原因吗?
-
您不需要此代码。自 2007 年以来一直没有必要。只需将其删除即可。
-
如果我理解正确的话,我删除了我对 Class.forName() 的使用,并检查了所有相关的 JDBC 库 JAR 文件都是 Type 4(即包含 META-INF\services\java.xml)。 sql.Driver 文件)。但是,我仍然看到同样的问题:在应用程序尝试使用 com.sybase.jdbc4.jdbc.SybDriver 时无法初始化类 oracle.jdbc.OracleDriver
-
我可以通过从类路径中删除 Oracle JDBC 库 JAR 来避免这个错误,但是当应用程序需要同时连接到 Oracle 和 Sybase 数据库时,这并不能解决我在生产中的问题。