在与java11+;相同的应用程序中使用ojdbc5和ojdbc8驱动程序;

在与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.

在我的程序中,我必须连接到几个数据库。由于某些原因,我必须使用几种不同的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.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驱动程序?你写了“对此无能为力”,但对我来说这听起来像是一个错误。首先,您应该了解为什么您认为需要使用过时(并且不推荐使用)的驱动程序。我们必须连接到许多不同的数据库。我们发现,某些驱动程序版本与某些数据库版本不兼容。因此,我们希望能够定义哪个驱动程序应该用于哪个数据库连接。