2016-05-25 2 views
1

Ist es möglich, Klassendefinitionen innerhalb eines groovigen Skripts zu erstellen?Klassendefinition in groovigem Skript

Ich habe ein einfaches Skript Beispiel

class HelloWorld {  
    def name  

    def greet() { 
     "Hello ${name}" 
    } 
}  

def helloWorld = new HelloWorld() 
helloWorld.name = "Groovy" 

println helloWorld.greet() 

aber ich bekomme Fehler wie diese

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

vielleicht http://stackoverflow.com/q/19002910/217324 –

Antwort

1

Ja, im Allgemeinen ist es normal, Klassendefinitionen innerhalb eines Skripts zu erstellen.

Ich kann Ihren Fehler nicht reproduzieren, und Sie sagen nicht, wie Sie diesen Code ausführen. Ich schätze, Sie versuchen, ein Groovy-Skript zu verwenden, um ein Produkt zu konfigurieren (Mule hat diese Funktion zum Beispiel). Ihr Problem scheint spezifisch für das zu sein, was Sie konfigurieren möchten.

Wenn ich versuche, das Skript in groovysh auszuführen, bekomme ich "Unbekannte Eigenschaft", wenn es versucht, die HelloWorld-Variable mit def zu definieren.

In groovyconsole funktioniert es gut, wie Dónal sagt.

Wenn ich den Code nehmen und es in einer gerufenen HelloWorld.groovy Datei abgelegt und ausgeführt, dass von der Kommandozeile:

groovy HelloWorld.groovy 

dann bekomme ich

C: \ Users \ NDH \ HelloWorld.groovy: 1: Ungültige doppelte Klassendefinition der Klasse HelloWorld: Die Quelle C: \ Benutzer \ ndh \ HelloWorld.groovy enthält mindestens zwei Definitionen der Klasse HelloWorld. Eine der Klassen ist eine explizit generierte Klasse, die die Klassenanweisung verwendet, die andere ist eine Klasse, die anhand des Dateinamens aus dem Skriptkörper generiert wird. Lösungen sollen den Dateinamen ändern oder den Klassennamen ändern. @ Zeile 1, Spalte 1. Hello World Klasse { ^

1 Fehler

den Namen der Datei, in notHelloWorld.groovy Ändern funktioniert:

c:\Users\ndh>groovy notHelloWorld.groovy 
Hello Groovy 

aber das ist nicht Ihre Problem, da der Stacktrace Ihren Dateinamen als Script1 anzeigt.

Wenn ich ein Skript schreibe, lege ich die Hauptlogik an die Spitze und setze Hilfsfunktionen und Klassendefinitionen nach unten. Nur so ordne ich den Code für die Lesbarkeit ein.