groovy脚本中的类定义

时间:2016-05-25 10:01:07

标签: groovy

是否可以在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

2 个答案:

答案 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。

当我编写脚本时,我将主逻辑放在顶部,并将辅助函数和类定义放在底部。这就是我如何组织代码以提高可读性。