Что такое 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
на линии 4Class.forName()
или если строка 4 прокомментирована, а параметры db с именем драйвера - исключение в строке 7Sql.newInstance(db )
Это логично, класс драйвера не найден и т.д.
1a. если параметры db с 3 аргументами (без драйвера), я предполагаю, что его юридическое (и работающее в других ситуациях) исключение изменится наSQLException: No suitable driver
на линии 7Sql.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, все еще работает нормально. В чем дело?