Это не полный ответ, но, похоже, это проблема загрузки класса в сочетании с автоматической загрузкой драйвера.
Когда вы явно используете Class.forName
для загрузки драйвера JDBC, драйвер должен зарегистрироваться самс java.sql.DriverManager
.
Глядя на трассировку стека, а именно:
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)
Драйвер Sybase неправильно проверяет текущие зарегистрированные драйверы (используя DriverManager.getDrivers
) перед (?) Регистрацией себя.И что еще хуже, он делает это из конструктора драйвера вместо статического инициализатора, что потенциально может привести к тупику загрузки драйвера.Правильный драйвер должен вызывать DriverManager.registerDriver
из статического инициализатора, как указано в разделе 9.2 JDBC 4.3:
Драйверы JDBC должны реализовывать интерфейс Driver
, а реализация должна содержать статический инициализатор, который будетвызываться, когда драйвер загружен.Этот инициализатор регистрирует новый экземпляр самого себя с помощью DriverManager
, как показано в ПРИМ. КОДА 9-1.
public class AcmeJdbcDriver implements java.sql.Driver {
static {
java.sql.DriverManager.registerDriver(new AcmeJdbcDriver());
}
...
}
ПРИМЕР КОДА 9-1 Пример статического инициализатора для драйвера, реализующего java.sql.Driver
Когда загружена реализация Driver
, статический инициализатор автоматически зарегистрирует экземпляр драйвера.
Поскольку вызывается DriverManager.getDrivers
, он автоматически загружает драйверы в путь к классам в META-INF/service/java.sql.Driver
файлов (и тех, что в системном свойстве jdbc.drivers
).
Похоже, что драйвер Oracle JDBC был обнаружен и загружен таким образом, но затем проверка, доступен ли драйвер в текущем загрузчике классов в isDriverAllowed
, завершается неудачей с NoClassDefFoundError
(проверка перехватывает исключения, но не ошибки, и, возможно, должна).
В качестве обходного пути вы должны либо удалить драйвер Oracle JDBC из пути к классам, либо выяснить, почему он недоступен в текущемзагрузчик классов.
В качестве дополнительной диагностики попробуйте позвонить DriverManager.getDrivers()
, Class.forName("oracle.jdbc.Driver
) или даже new oracle.jdbc.Driver()
в своем коде и посмотреть, что произойдет.
Вы также можете проверитьверсия вашего драйвера Sybase, и если есть более новая версия, которая не выполняет эту проверку, хотя это может просто привести к возникновению ошибки в другом месте вашего кода.