如何使用Groovy动态对象来调用需要具体类型的方法(不引用它们)

时间:2017-10-13 13:37:56

标签: jenkins groovy classloader

给出以下代码:

def model = readMavenPom file: 'pom.xml'
dep = [
   groupId : "org.foo",
   artifactId :  "bar",
   version : "1.0" ]

我想致电Model.addDependency

model.addDependency(dep)

这给出了错误

  

Caught:groovy.lang.MissingMethodException:没有方法签名:org.apache.maven.model.Model.addDependency()适用于参数类型:(java.util.LinkedHashMap)值:[[groupId:org。 foo,artifactId:bar,version:1.0]]

现在可以做到

model.addDependency(dep as Dependency)

引用课程时。它没有问题。本地。

不幸的是,我必须在Jenkins上执行它,我遇到了这个issue。所以基本上,如果我引用Dependency类,我会遇到一些类加载问题。建议使用"动态类型"。

因此可以在不引用该类的情况下调用addDependency吗?

1 个答案:

答案 0 :(得分:1)

问题是加载Model类的类加载器(让它调用它" A")与脚本在引用Dependency类时尝试使用的类加载器不同( " B&#34)。因此,您可以使用类加载器-B创建依赖关系-B,但模型-A需要依赖关系-A。

我们可以使用反射来获取对Dependency-A类的引用,然后使用相同的属性映射创建它的实例,如下所示:

def model = readMavenPom file: 'pom.xml'
dep = [
   groupId : "org.foo",
   artifactId :  "bar",
   version : "1.0" ]
model.addDependency(model.&addDependency.parameterTypes[0].n‌​ewInstance(dep))

在Groovy中,& addDependency是一个方法引用,反射样式。我们肯定知道只有一个方法只有一个参数,它只有一个参数,所以我们只取第一个参数的类并调用newInstance,它的工作方式与"相同。作为"关键字会有。