如何在Groovy Jenkins Pipeline中使用全局外部Java库中的方法?

Chr*_*off 2 java groovy jenkins jenkins-pipeline

首先,我是Java,Groovy和Jenkins的新手,所以请耐心等待我;)

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

我尝试了许多将Java库引用到此jenkins项目的方法,但均无济于事。主要是我使用了https://github.com/jenkinsci/workflow-cps-global-lib-plugin上的文档来实现此目的,但是还尝试了几种搜索google或stackoverflow的方法。根据文档,应该可以包括在内。

我已将过程简化为用于测试目的的测试设置。

假设以下...

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

@Library('DeltaJenkinsScripts@develop')

def runStageCollect = true

if (runStageCollect)
{
    stage("Collect")
    {
        helloWorld("Joe")
    }
}
Run Code Online (Sandbox Code Playgroud)

被引用的库通过Jenkins设置中的“全局管道库”进行全局引用,但在此也进行了明确说明。它托管在git环境中,引用似乎可以正常工作。该库的文件结构:

/vars/helloWorld.groovy

package de.dcomp.prod

def call(name) {
    def tt = new Test()
    tt.testText()
}
Run Code Online (Sandbox Code Playgroud)

/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}"
}
Run Code Online (Sandbox Code Playgroud)

我有一个名为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...";
    }
}
Run Code Online (Sandbox Code Playgroud)

我在独立的Java项目中引用和使用此库没有问题。

我尝试了几种方法将其包括在内:

  • 将jar文件放入“ C:\ Users \ cr.groovy \ lib”
  • 在测试Linux环境中设置类路径。
  • 使用插件“ Pipeline:类路径步骤”以不同的符号将库添加到类路径,例如“ 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'
  • 将库添加到本地Maven存储库并通过@GrabResolver和@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()
Run Code Online (Sandbox Code Playgroud)

结果总是这样。

groovy.lang.MissingPropertyException: No such property: ScriptRunner for class: de.dcomp.prod.Test
Run Code Online (Sandbox Code Playgroud)

或这个:

de/dcomp/prod/Test.groovy: 10: unable to resolve class ScriptRunner 
 @ line 10, column 12.
    def oSR = new ScriptRunner()
Run Code Online (Sandbox Code Playgroud)

错误消息始终指向该进程找不到Java库的方向。如果我尝试使用其他库(例如来自Apache Commons的库),也会发生同样的事情。

如果可能的话,我想避免将其写为插件。

提前致谢!

Pet*_*Nab 5

到目前为止,我找到的唯一可行的方法是在管道中运行此方法,以找出要检查的目录:

println System.getProperty("java.ext.dirs")
Run Code Online (Sandbox Code Playgroud)

就我而言,它正在寻找

/usr/java/packages/lib/ext
Run Code Online (Sandbox Code Playgroud)

因此,我将要加载的jar放在该位置(必须创建目录之后),然后重新启动Jenkins。

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

似乎很hacky,并且这类东西可能被认为是错误并且已删除,恕不另行通知。