我读过很多关于使用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。
发布于 2018-05-30 09:13:05
根据我的经验,您需要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')发布于 2017-12-22 11:37:50
如果您没有使用默认的系统类加载器,那么您必须显式加载JDBC驱动程序,然后才能使用它。只有默认类加载器上的JDBC驱动程序才会由DriverManager自动加载。在这种情况下,您将显式地需要使用Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")或甚至Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver", true, classLoader)加载JDBC驱动程序。
https://stackoverflow.com/questions/47928917
复制相似问题