在与java11+;相同的应用程序中使用ojdbc5和ojdbc8驱动程序;
在我的程序中,我必须连接到几个数据库。由于某些原因,我必须使用几种不同的ojdbc驱动程序,例如ojdbc5.jar、ojdbc8.jar、等等。这方面没有什么可以改变的。 Java 8的工作原理如下:在与java11+;相同的应用程序中使用ojdbc5和ojdbc8驱动程序;,java,jdbc,java-9,urlclassloader,Java,Jdbc,Java 9,Urlclassloader,在我的程序中,我必须连接到几个数据库。由于某些原因,我必须使用几种不同的ojdbc驱动程序,例如ojdbc5.jar、ojdbc8.jar、等等。这方面没有什么可以改变的。 Java 8的工作原理如下: import java.io.File; import java.net.URL; import java.net.URLClassLoader; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.Driver;
import java.util.Properties;
public class JdbcMain {
public static void main(final String[] args) throws Exception {
final File driverOne = new File("C:\\workspace\\lib\\ojdbc5.jar");
final File driverTwo = new File("C:\\workspace\\lib\\ojdbc8.jar");
getJDBCForDriver(driverOne);
getJDBCForDriver(driverTwo);
}
private static void getJDBCForDriver(final File jdbcDriverFile) throws Exception {
final URL url = jdbcDriverFile.toURI().toURL();
final URL[] array = new URL[] {url};
final URLClassLoader ucl = new URLClassLoader(array, null);
final Class driverClass = ucl.loadClass("oracle.jdbc.driver.OracleDriver");
final Driver driver = (Driver) driverClass.getDeclaredConstructor().newInstance();
final Properties prop = new Properties();
prop.put("user", "myUser");
prop.put("password", "myPassword");
try (final Connection connection = driver.connect("jdbc:oracle:thin:@localhost:1521:xe", prop)) {
final DatabaseMetaData metaData = connection.getMetaData();
final int jdbcMajorVersion = metaData.getJDBCMajorVersion();
final int jdbcMinorVersion = metaData.getJDBCMinorVersion();
System.out.println("JDBC Version for File " + jdbcDriverFile.getName() + ": " + jdbcMajorVersion + "." + jdbcMinorVersion);
}
}
}
Java 8的输出是:
JDBC Version for File ojdbc5.jar: 11.1
JDBC Version for File ojdbc8.jar: 4.2
但是,自Java 11(或9)以来,这不再有效。此处发生以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: java/sql/Driver
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:550)
at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:458)
at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:452)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:451)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at zzzz_Jdbc.JdbcMain.getJDBCForDriver(JdbcMain.java:26)
at zzzz_Jdbc.JdbcMain.main(JdbcMain.java:17)
Caused by: java.lang.ClassNotFoundException: java.sql.Driver
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 12 more
有什么办法解决这个问题吗?您的应用程序模块化了吗?如果是,您是否已将
requires java.sql
添加到模块info.java
?请提供一个复制这个。我的应用程序不是模块化的。我提供了一个例子,为什么要在Java11中使用针对Java1.5的JDBC驱动程序?你写了“对此无能为力”,但对我来说这听起来像是一个错误。首先,您应该了解为什么您认为需要使用过时(并且不推荐使用)的驱动程序。我们必须连接到许多不同的数据库。我们发现,某些驱动程序版本与某些数据库版本不兼容。因此,我们希望能够定义哪个驱动程序应该用于哪个数据库连接。