Использование драйвера ojdbc5 и ojdbc8 в одном приложении с java11 + - PullRequest
2 голосов
/ 29 мая 2020

В моей программе мне нужно подключиться к нескольким базам данных. По определенным причинам мне приходится использовать несколько разных драйверов ojdb c, например ojdbc5.jar, ojdbc8.jar, et c. В этом ничего нельзя изменить. С 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

Есть идеи, как решить эту проблему?

...