是否可以在groovy脚本中创建类定义?
我有一个简单的脚本示例
class HelloWorld {
def name
def greet() {
"Hello ${name}"
}
}
def helloWorld = new HelloWorld()
helloWorld.name = "Groovy"
println helloWorld.greet()
但我得到这样的错误
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Script1.groovy: 1: Class definition not expected here. Please define the class at an appropriate place or perhaps try using a block/Closure instead. at line: 1 column: 1. File: Script1.groovy @ line 1, column 1.
class HelloWorld {
^
1 error
at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:309) ~[groovy-all-2.4.3.jar:2.4.3]
at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:943) ~[groovy-all-2.4.3.jar:2.4.3]
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:590) ~[groovy-all-2.4.3.jar:2.4.3]
at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:566) ~[groovy-all-2.4.3.jar:2.4.3]
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:543) ~[groovy-all-2.4.3.jar:2.4.3]
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:297) ~[groovy-all-2.4.3.jar:2.4.3]
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:267) ~[groovy-all-2.4.3.jar:2.4.3]
at groovy.lang.GroovyShell.parseClass(GroovyShell.java:692) ~[groovy-all-2.4.3.jar:2.4.3]
at groovy.lang.GroovyShell.parse(GroovyShell.java:704) ~[groovy-all-2.4.3.jar:2.4.3]
at groovy.lang.GroovyShell.parse(GroovyShell.java:740) ~[groovy-all-2.4.3.jar:2.4.3]
at groovy.lang.GroovyShell.parse(GroovyShell.java:731) ~[groovy-all-2.4.3.jar:2.4.3
答案 0 :(得分:2)
此代码工作正常。你可以see for yourself here。
答案 1 :(得分:1)
是的,一般来说,在脚本中创建类定义是正常的。
我无法重现您的错误,而且您也没有说明您是如何运行此代码的。我猜测你正在尝试使用Groovy脚本来配置某些产品(例如,Mule具有此功能)。您的问题似乎与您尝试配置的内容有关。
如果我尝试在groovysh中运行脚本,我会得到"未知属性"当它尝试使用def
定义helloWorld变量时。
在groovyconsole中,它正常工作,正如Dónal所说。
如果我把你的代码放在一个名为HelloWorld.groovy的文件中并从命令行运行它:
groovy HelloWorld.groovy
然后我得到
C:\ Users \ ndh \ HelloWorld.groovy:1:类HelloWorld的重复类定义无效:源C:\ Users \ ndh \ HelloWorld.groovy包含至少两个HelloWorld类的定义。 其中一个类是使用class语句的显式生成类,另一个是基于文件名从脚本体生成的类。解决方案是更改文件名或更改类名。 @第1行,第1列。 class HelloWorld { ^
1错误
将文件名更改为notHelloWorld.groovy:
c:\Users\ndh>groovy notHelloWorld.groovy
Hello Groovy
但这不是你的问题,因为stacktrace将你的文件名显示为Script1。
当我编写脚本时,我将主逻辑放在顶部,并将辅助函数和类定义放在底部。这就是我如何组织代码以提高可读性。