如何在Groovy Jenkins管道中使用全局外部java库中的方法?

如何在Groovy Jenkins管道中使用全局外部java库中的方法?,java,jenkins,groovy,jenkins-pipeline,Java,Jenkins,Groovy,Jenkins Pipeline,首先,我不熟悉Java、Groovy和Jenkins,所以请耐心等待我;) 我正在准备一个带有管道支持的Jenkins服务器,以备将来在构建环境中使用。 我们使用一种特殊的内部脚本语言,为此我必须用java编写一个包装器。只有在Groovy中才能完成这项工作,我们必须使用这种特殊的语言 我已经尝试了很多方法将java库引用到这个jenkins项目中,但都没有成功。 我主要使用了上的文档来实现这一点,但也尝试了几种搜索google或stackoverflow的方法。根据文档,这应该是可能的 为了测

首先,我不熟悉Java、Groovy和Jenkins,所以请耐心等待我;)

我正在准备一个带有管道支持的Jenkins服务器,以备将来在构建环境中使用。 我们使用一种特殊的内部脚本语言,为此我必须用java编写一个包装器。只有在Groovy中才能完成这项工作,我们必须使用这种特殊的语言

我已经尝试了很多方法将java库引用到这个jenkins项目中,但都没有成功。 我主要使用了上的文档来实现这一点,但也尝试了几种搜索google或stackoverflow的方法。根据文档,这应该是可能的

为了测试的目的,我将这个过程简化为一个测试设置

假设如下

我在詹金斯有一个名为“MultibranchTestProject01”的多分支项目。
Jenkins文件:

@Library('DeltaJenkinsScripts@develop')

def runStageCollect = true

if (runStageCollect)
{
    stage("Collect")
    {
        helloWorld("Joe")
    }
}
所引用的库通过Jenkins设置中的“全局管道库”进行全局引用,但此处也明确说明了问题。 它托管在git环境中,引用似乎可以工作。 此库的文件结构:

/vars/helloWorld.groovy

package de.dcomp.prod

def call(name) {
    def tt = new Test()
    tt.testText()
}
/src/de/dcomp/prod/Test.groovy

package de.dcomp.prod

import de.dcomp.ftel.*

def testText()
{
    def sRetVal = ""
    echo "testText - START"
    //sRetVal = ScriptRunner.GetStaticSampleText()
    def oSR = new ScriptRunner()
    sRetVal = oSR.GetInstanceSampleText()
    echo "ReturnValue: ${sRetVal}"
}
我有一个名为ScriptRunner-0.0.1-SNAPSHOT.jar的java库。此库只有一个类:

package de.dcomp.ftel;

public class ScriptRunner
{
    public String GetInstanceSampleText()
    {
        return "ScriptRunner.GetInstanceSampleText() called...";
    }
    public static String GetStaticSampleText()
    {
        return "ScriptRunner.GetStaticSampleText() called...";
    }
}
我在独立java项目中引用和使用这个库没有问题

我尝试了几种方法来包含它:

  • 将jar文件放在“C:\Users\cr.groovy\lib”中
  • 在测试linux环境中设置类路径
  • 使用插件“Pipeline:Classpath Steps”以不同的符号将库添加到类路径中,例如“C:\Users\cr.groovy\lib”,C:/Users/cr/.groovy/lib”,“C:\Users\cr.groovy\lib\ScriptRunner-0.0.1-SNAPSHOT.jar”,“C:/Users/cr/.groovy/lib/ScriptRunner-0.0.1-SNAPSHOT.jar”, 'file:///C:/Users/cr/.groovy/lib/ScriptRunner-0.0.1-SNAPSHOT.jar'
  • 将lib添加到本地maven存储库并引用@grabsolver和@Grab,尽管这不是我想要的解决方案
或动态加载:

this.class.classLoader.rootLoader.addURL(new URL("file:///C:/Users/cr/.groovy/lib/ScriptRunner-0.0.1-SNAPSHOT.jar"));
def srClass = Class.forName("de.dcomp.ftel.ScriptRunner")
def sr = srClass.newInstance()
结果总是这样

groovy.lang.MissingPropertyException: No such property: ScriptRunner for class: de.dcomp.prod.Test
或者这个:

de/dcomp/prod/Test.groovy: 10: unable to resolve class ScriptRunner 
 @ line 10, column 12.
    def oSR = new ScriptRunner()
错误消息总是指向进程找不到Java库的方向。如果我尝试使用其他库,例如来自ApacheCommons的库,也会发生同样的情况

如果可能的话,我想避免把它写成插件


提前谢谢

到目前为止,我发现唯一有效的方法是在管道中运行此命令,以了解正在检查哪些目录:

println System.getProperty("java.ext.dirs")
在我的情况下,它在看

/usr/java/packages/lib/ext
所以我把我想加载的jar放在那个位置(在创建目录之后),然后重新启动Jenkins

之后,我成功地导入了库并使用了它


看起来非常粗糙,这类东西可能会被视为一个bug,并且会在未经通知的情况下被删除。

如果您在管道中使用外部库(
@library
),您可以通过Grab定义grape依赖项。下面的示例来自共享库。这将下载JAR并在groovy脚本中自动加载它们

@Grab(group='com.amazonaws', module='aws-java-sdk-ec2', version='1.11.198')

import com.amazonaws.services.ec2.* import com.amazonaws.services.ec2.model.* import com.amazonaws.regions.*

重要的是,上面的代码可能不会在管道中工作,但当作为共享库的一部分加载时,应该使用最新的插件版本

我曾经尝试过这个
@Grab
,但它不仅仅是根据经验,而且由于grapes在解决/下载依赖库时遇到问题,所以多次失败(您的解决方案使我在与未加载odbjc驱动程序的情况下挣扎了2天后得以解脱