当前位置: 首页 > 知识库问答 >
问题:

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

濮波
2023-03-14

首先,我是新来的Java,Groovy和Jenkins,所以请对我有耐心;)

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

我尝试过很多方法将java库引用到这个jenkins项目中,但都没有成功。我主要是在https://github.com/jenkinsci/workflow-cps-global-lib-plugin为了实现这一点,他还尝试了几种搜索google或stackoverflow的方法。根据文档,这应该是可能的。

为了测试目的,我已经将该过程简化为测试设置。

假设如下。。。

我在Jenkins中有一个多分支项目,名为“多分支测试项目01”。
Jenkinsfile:

@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。棒极了

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的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”中

或动态加载:

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库的方向。如果我尝试使用其他库,例如来自Apache Commons的库,也会发生同样的事情。

如果可能的话,我想避免把它作为插件。

提前谢谢!

共有2个答案

咸琪
2023-03-14

如果在管道中使用外部库(@library),则可以通过Grab定义grape依赖项。下面是ciinabox管道共享库中的示例。这将下载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.*

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

元英朗
2023-03-14

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

println System.getProperty("java.ext.dirs")

而在我的情况下,它正在往里看

/usr/java/packages/lib/ext

所以我把我想加载的jar放在那个位置(在必须创建目录之后),然后重新启动Jenkins。

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

看起来非常古怪,这种事情可能会被认为是一个错误,并在没有通知的情况下被删除。

 类似资料:
  • 可以在jenkins管道共享库中导入和使用常规java库吗?我想导入AWS SDK for java,并在管道代码中直接使用它。我必须将其添加到共享库的src dir中吗?

  • 由于我无法访问组织中的“管理Jenkins”菜单,我无法在“管理Jenkins”中的“全局管道库”中配置共享库。 没有在Manage Jenkins中进行配置,是否有其他方法实现此功能? (或) 是否可以通过管道脚本配置“全球管道库”部分,而不管访问权限如何? 如果可能,请您在答案中共享一些代码片段。

  • 问题内容: 我尝试了各种方式,但似乎没有任何效果。这是我的詹金文件。 阶段脚本的输出(“初始化变量”)没有任何作用,它没有设置全局变量ZIP_NODE的值: 然后我们进入阶段(代码-Build),我们没有得到ZIP_NODE的值。请参阅22:34:17的echo声明 感谢@awefsome,我有一些观察,我想补充一下细节:当我使用下面的代码时,我得到了想要的输出,即ZIP_NODE的正确值: 但是

  • 问题内容: 先前曾问过一个有关如何覆盖环境指令中定义的变量的问题,看来这是不可能的。 我想在一个阶段中设置一个变量,并使其可用于其他阶段。在声明性管道中,似乎唯一的方法是在script {}块中。 例如,我需要在结帐后设置一些变量。因此,在结帐阶段结束时,我有一个script {}块来设置这些var,并且可以在其他阶段访问它们。 这可行,但感觉不对。并且出于可读性考虑,我更愿意在管道的顶部声明这些

  • 我想使用这个java库[1]enj-library 我将这个库编译成jar,然后在eclipse下创建了一个新的插件项目“来自现有JAR档案的插件” 然后我试着将它添加到我的包,但它没有 2.我需要它作为添加包,但我得到了 3.我添加了类路径,我的包开始了,但我得到了类未找到异常 [1]https://github.com/dog 网关/enj-library 我在OSGI捆绑包包含这个库如何?

  • 我正在尝试设置JavaFX环境,因此我引用了相应的jar。为了运行代码,我需要在launch.json中使用一些VM参数(“vmArgs”:--module path/Users/adrif/Downloads/javafx-sdk-14.0.2.1/lib--add modules javafx.controls,javafx.fxml”)。我在一个多项目文件夹中工作,因此每次创建一个新项目时,