使用Grapes获取JDBC驱动程序的问题

时间:2017-12-21 16:21:55

标签: sql-server jdbc groovy grape

我已经阅读了许多关于使用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。

2 个答案:

答案 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')