Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
becki:linux:groovy [2009-10-30 07:29] becki |
becki:linux:groovy [2010-03-15 09:57] (aktuell) becki |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Groovy == | ====== Groovy == | ||
- | ===== Useful Links == | + | ===== Getting Help == |
+ | * Indexes: [[groovy>Documentation|Groovy Documentation Home]] - [[ibm>views/java/libraryview.jsp?search_by=practically+groovy|IBM Practically Groovy]] | ||
+ | * Tutorials: | ||
+ | * APIs: [[groovy>gapi/|Groovy API]] FIXME add description - [[groovy>groovy-jdk]] Groovy methods added to standard Java SE classes | ||
- | [[groovy>Documentation|Groovy Documentation]] [[ibm>views/java/libraryview.jsp?search_by=practically+groovy|IBM Practically Groovy]] | + | ===== Install == |
- | ===== Script Files == | + | [[groovy>Download]] the binary and unpack it to ''/usr/local'' and make a symlink: ''/usr/local# ln -s groovy-1.6.5 groovy'' |
- | Shebang: | + | [[groovy>Installing+Groovy|Add]] groovy bin directory to your invironment variables: |
+ | <code bash> | ||
+ | # /etc/profile.d/jdk.sh | ||
+ | ... | ||
+ | export GROOVY_HOME=/usr/local/groovy | ||
+ | export PATH="$PATH:$GROOVY_HOME/bin" | ||
+ | </code> | ||
+ | |||
+ | ===== Tools == | ||
+ | |||
+ | [[groovy>Groovy+Console|groovyConsole]] is a GUI app for evaluating Groovy scripts and [[groovy>Groovy+Shell|groovysh]] is an interactiove CLI app for evaluating Groovy expressions. | ||
+ | |||
+ | [[groovy>Groovy+CLI|groovy]] ist the interpreter for Groovy scripts (see below) and ''groovyc'' is the compiler which compiles Groovy scripts to java classes (see below) | ||
+ | |||
+ | ===== Script Files == | ||
+ | ==== Shebang == | ||
<code groovy> | <code groovy> | ||
Zeile 12: | Zeile 30: | ||
println "Hallo Sandy!" | println "Hallo Sandy!" | ||
</code> | </code> | ||
+ | |||
+ | ==== Command Line Arguments == | ||
+ | |||
+ | <code groovy> | ||
+ | // file: test.groovy | ||
+ | println args[0]+ ' '+ args[1]+ ' '+ args[2]+ ' '+ args.length | ||
+ | </code> | ||
+ | |||
+ | Invoking the script with ''test.groovy one two three'' prints ''one two three 3''. | ||
+ | |||
+ | See also [[groovy>Groovy+CLI]] | ||
+ | |||
+ | ==== Stdin stdout stderr == | ||
+ | |||
+ | FIXME ''System.in.text'' | ||
+ | |||
+ | ==== Behind the Scenes == | ||
A script automatically creates a class which has the same name as the filename of the script: | A script automatically creates a class which has the same name as the filename of the script: | ||
Zeile 23: | Zeile 58: | ||
</code> | </code> | ||
- | The first version is a [[javaref>api/java/lang/Class.html|class literal]]. ''println'' seems to call implizitely ''toString()'' on any object. (This is the same as ''System.out.println()'' in standard java.): | + | The first version is a [[javaref>api/java/lang/Class.html|class literal]] and seems to be a shortcut for calling getClass(). |
+ | |||
+ | ''println'' seems to call implizitely ''toString()'' on any object. (This is the same as ''System.out.println()'' in standard java.): | ||
<code groovy> | <code groovy> | ||
Zeile 41: | Zeile 78: | ||
// Filename: groovytest | // Filename: groovytest | ||
println 0,0 | println 0,0 | ||
+ | </code> | ||
+ | |||
+ | ===== Compile Groovy Scripts == | ||
+ | |||
+ | Groovy scripts can be [[groovy>Compiling+Groovy|compiled]] to java class files with ''groovyc''. In order to run those classes with the normal ''java'' command, you either have to [[groovy>Running|include]] ''/usr/local/groovy/embeddable/goovy-all-1.6.5.jar'' to the ''CLASSPATH'' variable or better :?:((to be tested!)) make a symlink in the [[javatut>ext/basics/install.html|Java Installed Extensions]] directory: | ||
+ | |||
+ | cd /usr/lib/java/jre/lib/ext | ||
+ | ln -s /usr/local/groovy/embeddable/goovy-all-1.6.5.jar | ||
+ | |||
+ | Note that this would have to be done on every system which wants to run a compiled script. Therefore it is better to create a jar file wich already includes the necessary depcendencies. This is described [[groovy>WrappingGroovyScript|here]]. | ||
+ | |||
+ | ===== Java Web Start == | ||
+ | |||
+ | FIXME Add Groovy specific infos about Java Web Start here. | ||
+ | |||
+ | See also [[java#java_web_start|generic Java Web Start]] | ||
+ | |||
+ | ===== Apache Pivot == | ||
+ | |||
+ | FIXME Add Groovy specific infos about Pivot here. http://www.ibm.com/developerworks/xml/tutorials/x-pivottut/ | ||
+ | |||
+ | See also generic [[Apache Pivot]] | ||
+ | |||
+ | ==== Java Web Start == | ||
+ | |||
+ | FIXME Add Groovy / Pivot specific infos about Java Web Start here. | ||
+ | |||
+ | See also [[Apache Pivot#java_web_start|general pivot specific things about Java Web Start]] | ||
+ | |||
+ | ===== Dynamic Typing == | ||
+ | |||
+ | ''def'' is a replacement for a type name e.g. in method signatures. It is used to indicate that you don't care about the type. You can omit ''def'' in global variables of a script: | ||
+ | |||
+ | <code groovy> | ||
+ | def seven=7; println "seven.class: "+ seven.class // -> class java.lang.Integer | ||
+ | int eight=8; println "eight.class: "+ eight.class // -> class java.lang.Integer | ||
+ | nine=9; println "nine.class: " + nine.class // -> class java.lang.Integer | ||
+ | |||
+ | seven="seven"; println "seven.class: "+ seven.class // -> class java.lang.String | ||
+ | //eight="eight"; println "eight.class: "+ eight.class // GroovyCastException!!! | ||
+ | nine="nine"; println "nine.class: " + nine.class // -> class java.lang.String | ||
</code> | </code> | ||
===== Collections: Lists, Ranges and Maps == | ===== Collections: Lists, Ranges and Maps == | ||
+ | ==== Lists == | ||
<code groovy> | <code groovy> | ||
Zeile 53: | Zeile 132: | ||
println myList[3] // => null | println myList[3] // => null | ||
println myList.size // => 3 | println myList.size // => 3 | ||
- | println myList.class // => class java.util.ArrayList | + | </code> |
+ | |||
+ | Iterate over the list by calling the ''each()'' method on the list and pass in a closure: | ||
+ | |||
+ | <code groovy> | ||
+ | myList.each{ print "$it " } // => 1976 1969 2010 | ||
+ | myList.eachWithIndex{ v, k -> print "$k:$v " } // => 0:1976 1:1969 2:2010 | ||
</code> | </code> | ||
Zeile 59: | Zeile 144: | ||
<code groovy> | <code groovy> | ||
+ | println myList.class // => class java.util.ArrayList | ||
println myList.get(0) // => 1976 | println myList.get(0) // => 1976 | ||
println myList.size() // => 2 | println myList.size() // => 2 | ||
</code> | </code> | ||
- | More on lists: [[groovy>JN1015-Collections|usage examples]], [[groovy>groovy-jdk/java/util/List.html|added methods to the standard List interface]] | + | More on lists: [[groovy>JN1015-Collections|usage examples]], [[groovy>groovy-jdk/java/util/List.html|added methods to the standard List interface]], [[ibm>java/library/j-pg04149.html|Reaching for each]] |
+ | |||
+ | ==== Maps == | ||
+ | |||
+ | <code groovy> | ||
+ | myMap = ["Sandy":1976, "Becki":1969] | ||
+ | println myMap.Sandy // => 1976 | ||
+ | println myMap.get("Sandy") // => 1976 | ||
+ | println myMap.class // => null (default getter is overwritten !!!) | ||
+ | println myMap.getClass() // => class java.util.LinkedHashMap | ||
+ | myMap.Junior="2010?" // Add a new value | ||
+ | myMap.each{ print "$it " } // => Sandy=1976 Becki=1969 Junior=2010? | ||
+ | myMap.each{ print "$it.key=$it.value "} // => Sandy=1976 Becki=1969 Junior=2010? | ||
+ | myMap.each{ k, v -> print "$k=$v " } // => Sandy=1976 Becki=1969 Junior=2010? | ||
+ | </code> | ||
+ | |||
+ | More on maps: [[ibm>java/library/j-pg04149.html|Reaching for each]], [[groovy>JN1035-Maps|Maps]] | ||
===== Unsorted == | ===== Unsorted == | ||
Zeile 71: | Zeile 173: | ||
* Everything can be [[ibm>java/library/j-pg04149.html|traversed]] using ''each'' | * Everything can be [[ibm>java/library/j-pg04149.html|traversed]] using ''each'' | ||
* Getters and setters are [[ibm>java/library/j-pg02179.html#N10203|autogenerated]] | * Getters and setters are [[ibm>java/library/j-pg02179.html#N10203|autogenerated]] | ||
+ | * ''def'' is used for dynamically typed variables. See [[groovy>Scoping+and+the+Semantics+of+"def"]] -> What is this "def" I heard of? | ||
===== Open Questions / To do == | ===== Open Questions / To do == | ||
+ | * Grails: http://grails.org/doc/latest/guide/17.%20Deployment.html http://grails.org/Deployment | ||
+ | * [[http://www.ibm.com/developerworks/java/library/j-pg03155/|GroovyServer Pages]] | ||
+ | * [[http://docs.codehaus.org/display/GROOVY/Extended+Guide+to+Method+Signatures|Named arguments]] are possible. Are they useful? | ||
* Final classes can be [[ibm>java/library/j-pg06239.html|extended]] | * Final classes can be [[ibm>java/library/j-pg06239.html|extended]] | ||
- | * When to use ''def''? | ||