GroovyShell - 将脚本分成两部分时出错 (MissingMethodExceptionNoStack)
GroovyShell - Error when splitting a script in two parts (MissingMethodExceptionNoStack)
我是 Groovy 的新手,所以我希望答案不是很明显...
假设我有一个脚本 "Test.groovy":
class A {
def greet() {println "Hey there!"}
}
new A().greet()
然后我用 GroovyShell
(来自 Java)评估这个脚本:
new GroovyShell().evaluate(new File("Test.groovy"));
我得到了预期的输出:
Hey there!
现在,我从脚本中删除了最后一行,而是在对 evaluate()
的单独调用中对其求值,我得到了一个非常模糊的异常。
"Test.groovy":
class A {
def greet() {println "Hey there!"}
}
Java:
GroovyShell shell = new GroovyShell();
shell.evaluate(new File("Test.groovy"));
shell.evaluate("new A().greet()");
org.codehaus.groovy.runtime.metaclass.MissingMethodExceptionNoStack: No signature of method: A.main() is applicable for argument types: ([Ljava.lang.String;) values: [[]]
Possible solutions: wait(), wait(long), any(), find(), wait(long, int), each(groovy.lang.Closure)
更有趣的是,如果我让脚本保持原样并仅更改 Java 部分,它会完美运行(我得到两个 "Hey there!")
这应该有助于解释您所看到的内容:http://www.groovy-lang.org/structure.html#_script_class
Groovy 将您的第一个 .groovy 文件视为脚本,因为最后一行存在于 class 声明之外。 Groovy编译成Java字节码,Java要求所有代码都定义在一个class内。为了遵守,Groovy 做了一些魔术,并使用 main
方法将您的脚本动态转换为 Java class——类似于此:
public class script1440427072752 extends groovy.lang.Script {
public script1440427072752() {
}
public script1440427072752(groovy.lang.Binding context) {
super(context)
}
public static void main(java.lang.String[] args) {
org.codehaus.groovy.runtime.InvokerHelper.runScript(script1440427072752, args)
}
public java.lang.Object run() {
new A().greet()
}
}
public class A extends java.lang.Object {
public java.lang.Object greet() {
this.println('Hey there!')
}
}
当您删除该行时,Groovy 将您的 .groovy 文件视为典型的 Java class 文件 A
。不需要动态转换为 groovy.lang.Script
。
当您尝试执行 A
时,GroovyShell 查找了 main
方法,找不到,并抛出该错误。
我是 Groovy 的新手,所以我希望答案不是很明显...
假设我有一个脚本 "Test.groovy":
class A {
def greet() {println "Hey there!"}
}
new A().greet()
然后我用 GroovyShell
(来自 Java)评估这个脚本:
new GroovyShell().evaluate(new File("Test.groovy"));
我得到了预期的输出:
Hey there!
现在,我从脚本中删除了最后一行,而是在对 evaluate()
的单独调用中对其求值,我得到了一个非常模糊的异常。
"Test.groovy":
class A {
def greet() {println "Hey there!"}
}
Java:
GroovyShell shell = new GroovyShell();
shell.evaluate(new File("Test.groovy"));
shell.evaluate("new A().greet()");
org.codehaus.groovy.runtime.metaclass.MissingMethodExceptionNoStack: No signature of method: A.main() is applicable for argument types: ([Ljava.lang.String;) values: [[]] Possible solutions: wait(), wait(long), any(), find(), wait(long, int), each(groovy.lang.Closure)
更有趣的是,如果我让脚本保持原样并仅更改 Java 部分,它会完美运行(我得到两个 "Hey there!")
这应该有助于解释您所看到的内容:http://www.groovy-lang.org/structure.html#_script_class
Groovy 将您的第一个 .groovy 文件视为脚本,因为最后一行存在于 class 声明之外。 Groovy编译成Java字节码,Java要求所有代码都定义在一个class内。为了遵守,Groovy 做了一些魔术,并使用 main
方法将您的脚本动态转换为 Java class——类似于此:
public class script1440427072752 extends groovy.lang.Script {
public script1440427072752() {
}
public script1440427072752(groovy.lang.Binding context) {
super(context)
}
public static void main(java.lang.String[] args) {
org.codehaus.groovy.runtime.InvokerHelper.runScript(script1440427072752, args)
}
public java.lang.Object run() {
new A().greet()
}
}
public class A extends java.lang.Object {
public java.lang.Object greet() {
this.println('Hey there!')
}
}
当您删除该行时,Groovy 将您的 .groovy 文件视为典型的 Java class 文件 A
。不需要动态转换为 groovy.lang.Script
。
当您尝试执行 A
时,GroovyShell 查找了 main
方法,找不到,并抛出该错误。