2016-11-22 50 views
2

首先,我刚刚接触Java,Groovy和Jenkins,请耐心等待;)如何在Groovy Jenkins管道中使用全局外部Java库中的方法?

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

我已经尝试了很多引用java lib到这个jenkins项目的方法,但都没有成功。 主要我已经使用https://github.com/jenkinsci/workflow-cps-global-lib-plugin的文档来实现这一点,但也尝试了几种搜索谷歌或计算器的方法。在文档之后,这应该是可能的。

为了测试目的,我减少了测试过程。

假设以下...

我在詹金斯一个多分支项目命名为“MultibranchTestProject01”。
的Jenkinsfile:

@Library('[email protected]') 

def runStageCollect = true 

if (runStageCollect) 
{ 
    stage("Collect") 
    { 
     helloWorld("Joe") 
    } 
} 

引用的库在全球范围内通过“全球管道图书馆在詹金斯设置引用但也明确这里澄清的事情。 它在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}" 
} 

我有所谓的Java LIB ScriptRunner-0.0.1-SNAPSHOT.jar。这个库有一个类:

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:\用户\ 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到本地的仓库,每个@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() 

结果总是像这样。

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。

我想避免将它作为插件写入,如果这是可能的话。

在此先感谢!

+0

我正在尝试这个'@ Grab' https://github.com/jenkinsci/workflow-cps-global-lib-plugin/blob/master/README.md#using-third-party-libraries,但它会'工作 – Joan

回答

4

我到目前为止发现的唯一方法是作品在管道运行此找出正在检查哪些目录:

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

而在我的情况下,一直在寻找在

/usr/java/packages/lib/ext 

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

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

似乎很hacky,可能被认为是一种错误,并在没有通知的情况下被移除。

0

如果您在流水线中使用外部库(@Library),则可以通过抓取来定义葡萄依赖关系。以下示例来自ciinabox-pipelines共享库。这将下载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.* 

什么是重要的,上面大概代码将无法正常工作在管道本身,但是当作为共享库的一部分加载,它应该与最新版本的插件。

相关问题