我已经阅读了许多关于使用Grapes加载依赖关系的类似帖子,但我尝试的一切都让我无处可去。使用:
@Grapes([
@Grab(group='com.microsoft', module='sqljdbc4', version='3.0')
])
class DatabaseTest {
static void executeSql() {
def sql = Sql.newInstance("jdbc:sqlserver://my.server.com:1433;databaseName=SOME_DB;user=USER;password=secret", "com.microsoft.sqlserver.jdbc.SQLServerDriver")
def rows = sql.rows("select something from some_table")
println rows.join("\n")
}
}
我明白了:
java.sql.SQLException: No suitable driver found for jdbc:sqlserver://my.server.com:1433;databaseName=SOME_DB;user=USER;password=secret
加载JDBC驱动程序的常见解决方案似乎是添加@GrabConfig(systemClassLoader = true)
,但这只会让我感到可怕的No suitable ClassLoader found for grab
错误,这很奇怪,因为好像其他人将@GrabConfig添加到解析没有合适的类加载器错误。
我也尝试过使用它:
static loadGrapes(){
ClassLoader classLoader = new groovy.lang.GroovyClassLoader()
Grape.grab(group:'com.microsoft', module:'sqljdbc4', version:'3.0', classLoader:classLoader)
printClassPath(classLoader)
}
static printClassPath(classLoader) {
println "$classLoader"
classLoader.getURLs().each {url->
println "- ${url.toString()}"
}
if (classLoader.parent) {
printClassPath(classLoader.parent)
}
}
给了我:
groovy.lang.GroovyClassLoader@740cae06
- file:/C:/Users/me/.groovy/grapes/com.microsoft/sqljdbc4/jars/sqljdbc4-3.0.jar
groovy.lang.GroovyClassLoader@23282c25
sun.misc.Launcher$AppClassLoader@55f96302
- file:/C:/dev/workspaces/utils/bin/
- file:/C:/dev/eclipse/plugins/org.codehaus.groovy_2.4.10.xx-201704192203-e45/lib/groovy-all-2.4.10.jar
- file:/C:/dev/eclipse/plugins/org.codehaus.groovy_2.4.10.xx-201704192203-e45/lib/bsf-2.4.0.jar
- file:/C:/dev/eclipse/plugins/org.codehaus.groovy_2.4.10.xx-201704192203-e45/lib/ivy-2.4.0.jar
- file:/C:/dev/eclipse/plugins/org.codehaus.groovy_2.4.10.xx-201704192203-e45/lib/servlet-api-2.4.jar
- file:/C:/Users/me/.groovy/greclipse/global_dsld_support/
- file:/C:/dev/eclipse/plugins/org.codehaus.groovy_2.4.10.xx-201704192203-e45/plugin_dsld_support/
sun.misc.Launcher$ExtClassLoader@1787f2a0
- file:/C:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/access-bridge-64.jar
- file:/C:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/cldrdata.jar
- file:/C:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/dnsns.jar
- file:/C:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/jaccess.jar
- file:/C:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/jfxrt.jar
- file:/C:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/localedata.jar
- file:/C:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/nashorn.jar
- file:/C:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/sunec.jar
- file:/C:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/sunjce_provider.jar
- file:/C:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/sunmscapi.jar
- file:/C:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/sunpkcs11.jar
- file:/C:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/zipfs.jar
Caught: java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
在这个例子中,我可以看到sqljdbc4 JAR在类路径上。如果有人有洞察力,那就太棒了,在这一点上,我已经厌倦了我能想到的每一个代码组合,以使其发挥作用。
我运行它的唯一方法是将JAR添加到我的.groovy / lib目录中,但我需要从Jenkins执行此操作,这可以在10个不同的从节点上运行,所以我真的不想要必须在不同的服务器上手动管理这个JAR。
答案 0 :(得分:0)
如果您没有使用默认的系统类加载器,那么必须先显式加载JDBC驱动程序才能使用它。默认类加载器上的只有JDBC驱动程序将自动由DriverManager
加载。在这种情况下,您将明确需要使用Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
加载JDBC驱动程序,甚至可能Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver", true, classLoader)
答案 1 :(得分:0)
根据我的经验,你需要GrabConfig注释和传统的Class.forName调用
例如,这是我在独立的Groovy脚本中加载JDBC驱动程序的方法:
@GrabConfig(systemClassLoader=true)
@Grab('org.postgresql:postgresql:+')
import groovy.sql.Sql
Class.forName('org.postgresql.Driver')
DB = Sql.newInstance('jdbc:postgresql://127.0.0.1/', 'postgres', 'postgres')