В моей программе мне нужно подключиться к нескольким базам данных. По определенным причинам мне приходится использовать несколько разных драйверов 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
Есть идеи, как решить эту проблему?