Что такое classpath для драйвера Groovy Console / jdbc?
Такой код базы данных работает нормально в среде Java (без связанного значения 'c'), но в консоли Groovy не может правильно использовать jdbc, за исключением
java.sql.SQLException: No suitable driver found for jdbc:sqlserver://localhost;databaseName=
Класс драйвера известен для скрипта (загружается без нуля и т. Д.), Но, вероятно, не зарегистрирован в Drivermanager?
код (я пытаюсь с и без Class.forname()
)
import groovy.sql.Sql
import groovy.sql.DataSet
c = Class.forName('com.microsoft.sqlserver.jdbc.SQLServerDriver')
def db = [url:'jdbc:sqlserver://localhost;databaseName=... ,driver:'com.microsoft.sqlserver.jdbc.SQLServerDriver']
def sql = Sql.newInstance(db )
РЕДАКТИРОВАТЬ: что я уже проверил:
- только что запущенная консоль Groovy не имеет sqljdbc4.jar на пути к классам.
Естественное исключение java.lang.ClassNotFoundException
на линии 4 Class.forName()
или если строка 4 прокомментирована, а параметры db с именем драйвера - исключение в строке 7 Sql.newInstance(db )
Это логично, класс драйвера не найден и т.д.
1a. если параметры БД с 3 аргументами (без драйвера), я предполагаю, что его юридическое (и работающее в других ситуациях) исключение изменится на SQLException: No suitable driver
на линии 7 Sql.newInstance(db )
Это тоже логично, DriverManager не знает, как решить ключ jdbc:sqlserver
, Драйвер не зарегистрирован, и DriverManager не знает, что реализует класс.
2. когда я добавляю jar в консольный путь к классам (Script / Add jar(s) к classpath) вещи несколько меняются. Больше не надо ClassNotFoundException
и переменная c
имеет ненулевое значение (класс драйвера), но SQLException: No suitable driver
продолжается.
Мое понимание философии JDBC: (современный) драйвер JAR использует технику с файлом META-INF/services/java.sql.Driver
быть известным DriverManager
, Таким образом, в правильной ситуации 4-й аргумент (имя класса драйвера) не требуется, поскольку обнаруживается автоматически. Пожалуйста, исправьте мое понимание, если я ошибаюсь.
В этом смысле я использовал слово "активный" ("неактивный" означает, что класс существует и загружен, но может использоваться как драйвер jdbc).
Мой максимальный код:
import groovy.sql.Sql
import groovy.sql.DataSet
import java.sql.DriverManager;
import java.util.ServiceLoader;
c = Class.forName('com.microsoft.sqlserver.jdbc.SQLServerDriver')
DriverManager.getDrivers()
ServiceLoader.load(java.sql.Driver.class)
def db = [url:'jdbc:sqlserver://localhost;...,driver:'com.microsoft.sqlserver.jdbc.SQLServerDriver']
def sql = Sql.newInstance(db )
но до сих пор no suitable driver
исключение
EDIT2: я перечисляю вещи с таким кодом (до newInstance()):
StringBuilder sb = new StringBuilder();
String grVersion = "brak";
Enumeration<Driver> dri = DriverManager.getDrivers();
for (Enumeration<Driver> e = dri; e.hasMoreElements();) {
Driver e1 = e.nextElement();
sb.append(e1.getClass().getName()).append(' ');
sb.append(e1.getMajorVersion()).append('.').append(e1.getMinorVersion());
}
// get LOADED drivers niesetty
ServiceLoader<java.sql.Driver> codecSetLoader = ServiceLoader.load(java.sql.Driver.class);
for (Driver e1 : codecSetLoader) {
sb.append(e1.getClass().getName()).append('!');
sb.append(e1.getMajorVersion()).append('.').append(e1.getMinorVersion());
sb.append("# ");
}
и получить
com.mysql.jdbc.Driver 5.1com.mysql.fabric.jdbc.FabricMySQLDriver 5.1com.mysql.jdbc.Driver!5.1# com.mysql.fabric.jdbc.FabricMySQLDriver!5.1# com.microsoft.sqlserver.jdbc.SQLServerDriver!4.0#
Exception thrown
java.sql.SQLException: No suitable driver found for jdbc:sqlserver://localhost;databaseName=....
at ConsoleScript11.run(ConsoleScript11:32)
Мой (базовый) код выполняется в среде Tomcat, все еще работает нормально. В чем дело?
2 ответа
Решение на сегодня, это добавить следующее в начале сценария. Использование Groovy 2.5.
@Grab('com.microsoft.sqlserver:sqljdbc4:4.0')
@GrabConfig(systemClassLoader=true)
Ответ автора:
Когда JAR драйвера добавлен, "динамический" из меню (например, перезаписан) виден, но не работает как JDBC.
Когда драйвер JAR сбрасывается в каталог...console\lib (между остальными JAR'ами Groovy) все ок.
Этот уровень исследования мне достаточно, может быть, кто-то попытается найти ошибку в меню. Могу ли я принять (зеленый) мой собственный ответ?