java - 在 Jenkins 管道脚本中找不到适合抓取的类加载器

标签 java jenkins groovy

我在编写 Jenkins 管道脚本时遇到问题。

这是我的 Jenkins 管道脚本中的代码:

@Grab(group='org.postgresql', module='postgresql', version='42.1.4')
import groovy.sql.Sql;
import java.util.ServiceLoader;
import java.sql.Driver;

ServiceLoader<Driver> loader = ServiceLoader.load(Driver.class);
print("Go Checkout")
def dbUrl = "jdbc:postgresql://10.10.100.86:5432/qa"
def dbUser = "myDB"
def dbPassword = "myDB"
def dbDriver = "org.postgresql.Driver"   
def sql = Sql.newInstance(dbUrl, dbUser, dbPassword, dbDriver)

我还添加了这段代码:

@GrabConfig(systemClassLoader=true)

但它不起作用 - 我收到此错误消息:

Jenkins 版本:2.73.3

Obtained Jenkinsfile.groovy from git git@localhost:myg/myproject.git
java.lang.RuntimeException: No suitable ClassLoader found for grab
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:83)
    at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:105)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:247)
    at groovy.grape.GrapeIvy.chooseClassLoader(GrapeIvy.groovy:182)
    at groovy.grape.GrapeIvy$chooseClassLoader.callCurrent(Unknown Source)
    at groovy.grape.GrapeIvy.grab(GrapeIvy.groovy:249)
    at groovy.grape.Grape.grab(Grape.java:167)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
    at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.invoke(StaticMetaMethodSite.java:46)
    at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.callStatic(StaticMetaMethodSite.java:102)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:56)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:194)
    at org.kohsuke.groovy.sandbox.impl.Checker$2.call(Checker.java:188)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedStaticCall(Checker.java:190)
    at org.kohsuke.groovy.sandbox.impl.Checker$checkedStaticCall.callStatic(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:56)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:194)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:222)
    at WorkflowScript.<clinit>(WorkflowScript)
Caused: java.lang.ExceptionInInitializerError
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at org.codehaus.groovy.runtime.InvokerHelper.createScript(InvokerHelper.java:434)
    at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
    at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:129)
    at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:123)
    at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:517)
    at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:480)
    at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:269)
    at hudson.model.ResourceController.execute(ResourceController.java:97)
    at hudson.model.Executor.run(Executor.java:421)
Finished: FAILURE

最佳答案

以下代码使用系统类加载器并将加载 Postgres 驱动程序并尝试连接到它:

@Grapes([
 @Grab(group='org.postgresql', module='postgresql', version='42.1.4'),
 @GrabConfig(systemClassLoader = true)    // magic here
])
import groovy.sql.Sql;
import java.util.ServiceLoader;
import java.sql.Driver;
import java.sql.DriverManager;

ServiceLoader<Driver> loader = ServiceLoader.load(Driver.class);
print("Go Checkout")
def dbUrl = "jdbc:postgresql://10.10.100.86:5432/qa"
def dbUser = "myDB"
def dbPassword = "myDB"
def dbDriver = "org.postgresql.Driver"   
def sql = Sql.newInstance(dbUrl, dbUser, dbPassword, dbDriver)

运行结果:

Caused by: java.net.SocketTimeoutException: connect timed out

如果没有 systemClassLoader 属性,将找不到驱动程序。

关于java - 在 Jenkins 管道脚本中找不到适合抓取的类加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47785488/

相关文章:

java - 跳过列表搜索空指针异常

ios - Jenkins Pipeline 在多个模拟器和 sdk 版本上测试 iOS 应用程序

docker - 容器停止后Docker Compose保持网络正常运行

grails - Grails 中的错误 : Save the transient instance before flushing

grails - Grails没有从BuildConfig.groovy将jar添加到类路径

java - com.mysql.jdbc.exceptions.jdbc4.CommunicationsException MySQL + Apache Tomcat 7

java - 如何将 Collection<Set<String>> 转换为字符串数组

java - 将 Groovy Grails 服务注入(inject) Java 类

Java - 如何在事件监听器中更改 'local?' 变量

jenkins - Jenkins 多分支管道是否允许远程触发?