使用@GrabConfig时,找不到合适的ClassLoader

问题描述 投票:14回答:2

我正在尝试编写一个使用groovy.sql.SQL的全局函数脚本。

添加注释@GrabConfig(systemClassLoader=true)时,在Jenkinsfile中使用全局函数时会出现异常。

这是一个例外:

hudson.remoting.ProxyException: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
General error during conversion: No suitable ClassLoader found for grab

这是我的代码:

@GrabResolver(name='nexus',    root='http://internal.repo.com')
@GrabConfig(systemClassLoader=true)
@Grab('com.microsoft.sqlserver:sqljdbc4:4.0')
import groovy.sql.Sql
import com.microsoft.sqlserver.jdbc.SQLServerDriver

def call(name) {
  echo "Hello world, ${name}"

  Sql.newInstance("jdbc:sqlserver://ipaddress/dbname", "username","password", "com.microsoft.sqlserver.jdbc.SQLServerDriver")
  //  sql.execute "select count(*) from TableName"
}
jenkins groovy jenkins-pipeline
2个回答
4
投票

确保未使用“使用groovy沙箱”复选框(它位于管道脚本文本框下方)。


1
投票

正如here所解释的那样,Pipeline“脚本”不是简单的Groovy脚本,它们在运行之前经过了大量的转换,主机上的某些部分,从机上的某些部分,其状态(变量值)被序列化并传递到下一步。因此,并非每个Groovy功能都受支持。

我不确定@Grab的支持。它在JENKINS-26192中被讨论(它被声明为已解决,因此可能现在可以正常工作)。

摘自一个非常有趣的comment

如果您需要执行一些复杂或昂贵的任务,并且在从属设备上物理运行不受限制的Groovy,那么在工作区中的* .groovy文件中简单地编写该代码可能是最简单和最有效的(例如,在SCM结账中)然后使用工具和sh / bat作为外部进程运行Groovy;甚至将这些东西放入Gradle脚本,Groovy Maven插件执行等。工作流脚本本身应限于简单且极其轻量级的逻辑操作,专注于编排整体控制流程并与其他Jenkins功能 - 从属分配,用户交互输入等。

简而言之,如果您可以将需要SQL的自定义部件移动到外部脚本并在单独的进程中执行(从管道脚本调用),那应该可行。但是在Pipeline脚本中执行此操作会更复杂。

© www.soinside.com 2019 - 2024. All rights reserved.