错误java.lang.NoSuchMethodError:在步骤之间找不到这样的DSL方法“ ***”
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了错误java.lang.NoSuchMethodError:在步骤之间找不到这样的DSL方法“ ***”,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3952字,纯文字阅读大概需要6分钟。
内容图文
我是Jenkins和Groovy的初学者.我正在研究管道库.
一个文件(version.groovy)定义如下:
def dateInternal = { new Date().format('yy.Mdd.Hmm') }.memoize()
def date() {
dateInternal()
}
在另一个文件中,我称为version.date().
当我这样做时,会遇到以下错误:
java.lang.NoSuchMethodError: No such DSL method 'dateInternal' found among steps [ansiColor, archive, bat, ...
这可能是一个菜鸟问题,但是直到现在我还没有找到解决这个问题的方法…
解决方法:
您必须注意两件事.当您在Groovy脚本中定义一个方法(如date()方法)时,它将被编译为类级别的方法(每个Groovy脚本都编译为扩展groovy.lang.Script类的类).另一方面,变量(例如您的dateInternal是持有闭包的变量)将被编译为run()方法内存在的局部变量.因此,当我们遵循编写的代码时,我们会发现,当您调用date()方法时,它将尝试调用存储在dateInternal变量中的闭包,并且此变量仅存在于run()方法内部.
如果您反编译已编译的version.groovy脚本,则会看到类似以下内容的内容:
import groovy.lang.Binding;
import groovy.lang.Closure;
import groovy.lang.Script;
import java.util.Date;
import org.codehaus.groovy.runtime.GeneratedClosure;
import org.codehaus.groovy.runtime.InvokerHelper;
import org.codehaus.groovy.runtime.callsite.CallSite;
public class version extends Script {
public version() {
CallSite[] var1 = $getCallSiteArray();
super();
}
public version(Binding context) {
CallSite[] var2 = $getCallSiteArray();
super(context);
}
public static void main(String... args) {
CallSite[] var1 = $getCallSiteArray();
var1[0].call(InvokerHelper.class, version.class, args);
}
public Object run() {
CallSite[] var1 = $getCallSiteArray();
final class _run_closure1 extends Closure implements GeneratedClosure {
public _run_closure1(Object _thisObject) {
CallSite[] var3 = $getCallSiteArray();
super(version.this, _thisObject);
}
public Object doCall(Object it) {
CallSite[] var2 = $getCallSiteArray();
return var2[0].call(var2[1].callConstructor(Date.class), "yy.Mdd.Hmm");
}
public Object doCall() {
CallSite[] var1 = $getCallSiteArray();
return this.doCall((Object)null);
}
}
Object dateInternal = var1[1].call(new _run_closure1(this));
return dateInternal;
}
public Object date() {
CallSite[] var1 = $getCallSiteArray();
return var1[2].callCurrent(this);
}
}
解
您可以通过将dateInternal提升为类级别字段而不是局部变量来解决该问题.您可以使用groovy.transform.Field批注对此:
import groovy.transform.Field
@Field
def dateInternal = { new Date().format('yy.Mdd.Hmm') }.memoize()
def date() {
dateInternal()
}
现在,当您查看编译后的version.groovy脚本的反编译版本时,您将看到类似以下内容:
import groovy.lang.Binding;
import groovy.lang.Closure;
import groovy.lang.Script;
import java.util.Date;
import org.codehaus.groovy.runtime.GeneratedClosure;
import org.codehaus.groovy.runtime.InvokerHelper;
import org.codehaus.groovy.runtime.ScriptBytecodeAdapter;
import org.codehaus.groovy.runtime.callsite.CallSite;
public class version extends Script {
Object dateInternal;
public version() {
CallSite[] var1 = $getCallSiteArray();
super();
Object var2 = var1[0].call(new version._closure1(this));
this.dateInternal = var2;
}
public version(Binding context) {
CallSite[] var2 = $getCallSiteArray();
super(context);
Object var3 = var2[1].call(new version._closure1(this));
this.dateInternal = var3;
}
public static void main(String... args) {
CallSite[] var1 = $getCallSiteArray();
var1[2].call(InvokerHelper.class, version.class, args);
}
public Object run() {
CallSite[] var1 = $getCallSiteArray();
return null;
}
public Object date() {
CallSite[] var1 = $getCallSiteArray();
return ScriptBytecodeAdapter.invokeClosure(this.dateInternal, new Object[0]);
}
public final class _closure1 extends Closure implements GeneratedClosure {
public _closure1(Object _thisObject) {
CallSite[] var3 = $getCallSiteArray();
super(version.this, _thisObject);
}
public Object doCall(Object it) {
CallSite[] var2 = $getCallSiteArray();
return var2[0].call(var2[1].callConstructor(Date.class), "yy.Mdd.Hmm");
}
public Object doCall() {
CallSite[] var1 = $getCallSiteArray();
return this.doCall((Object)null);
}
}
}
您可以看到dateInternal成为了一个类级别的字段,并且date()方法可以轻松访问它.
内容总结
以上是互联网集市为您收集整理的错误java.lang.NoSuchMethodError:在步骤之间找不到这样的DSL方法“ ***”全部内容,希望文章能够帮你解决错误java.lang.NoSuchMethodError:在步骤之间找不到这样的DSL方法“ ***”所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。