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