Skip to content
Skip to breadcrumbs
Skip to header menu
Skip to action menu
Skip to quick search
Quick Search
Browse
Pages
Blog
Labels
Attachments
Mail
Advanced
What’s New
Space Directory
Feed Builder
Keyboard Shortcuts
Confluence Gadgets
Log In
Sign Up
Dashboard
Groovy
Copy Page
You are not logged in. Any changes you make will be marked as
anonymous
. You may want to
Log In
if you already have an account. You can also
Sign Up
for a new account.
This page is being edited by
.
Paragraph
Paragraph
Heading 1
Heading 2
Heading 3
Heading 4
Heading 5
Heading 6
Preformatted
Quote
Bold
Italic
Underline
More colours
Strikethrough
Subscript
Superscript
Monospace
Clear Formatting
Bullet list
Numbered list
Outdent
Indent
Align left
Align center
Align right
Link
Table
Insert
Insert Content
Image
Link
Attachment
Symbol
Emoticon
Wiki Markup
Horizontal rule
tinymce.confluence.insert_menu.macro_desc
Info
JIRA Issue
Status
Gallery
Tasklist
Table of Contents
Other Macros
Page Layout
No Layout
Two column (simple)
Two column (simple, left sidebar)
Two column (simple, right sidebar)
Three column (simple)
Two column
Two column (left sidebar)
Two column (right sidebar)
Three column
Three column (left and right sidebars)
Undo
Redo
Find/Replace
Keyboard Shortcuts Help
<h1>Quick Start</h1><p>Grape lets you quickly add maven repository dependencies to your classpath. Here are the most common solutions:</p><h2>Add a Dependency</h2><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>@Grab(group='org.springframework', module='spring', version='2.5.6') import org.springframework.jdbc.core.JdbcTemplate </pre></td></tr></table><p>Yes, you can annotate an import in Groovy. You can also search for dependencies on <a href="http://mvnrepository.com">mvnrepository.com</a> and it will provide you the @Grab annotation form of the pom.xml entry.</p><h2>Specify Additional Repositories</h2><p>Not all dependencies are in maven central. You can add new ones like this:</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>@GrabResolver(name='restlet', root='http://maven.restlet.org/') @Grab(group='org.restlet', module='org.restlet', version='1.1.6') </pre></td></tr></table><h2>Maven Classifiers</h2><p>Some maven dependencies need classifiers in order to be able to resolve. You can fix that like this:</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>@Grab(group='net.sf.json-lib', module='json-lib', version='2.2.3', classifier='jdk15') </pre></td></tr></table><h2>Excluding Transitive Dependencies</h2><p>Sometimes you will want to exclude transitive dependencies as you might be already using a slightly different but compatible version of some artifact. You can do this as follows:</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>@Grab('net.sourceforge.htmlunit:htmlunit:2.8') @GrabExclude('xml-apis:xml-apis') </pre></td></tr></table><h2>JDBC Drivers</h2><p>Because of the way JDBC drivers are loaded, you'll need to configure Grape to attach JDBC driver dependencies to the system class loader. I.e:</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>@GrabConfig(systemClassLoader=true) @Grab(group='mysql', module='mysql-connector-java', version='5.1.6') </pre></td></tr></table><h2>Using Grape From the Groovy Shell</h2><p>From groovysh use the method call variant:</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>groovy.grape.Grape.grab([group:'org.springframework', module:'spring', version:'2.5.6']) </pre></td></tr></table><h2>Proxy settings</h2><p>If you are behind a firewall and/or need to use Groovy/Grape through a proxy server, you can specify those settings on the command like via the http.proxyHost and http.proxyPort system properties:</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>groovy -Dhttp.proxyHost=yourproxy -Dhttp.proxyPort=8080 yourscript.groovy </pre></td></tr></table><p>Or you can make this system wide by adding these properties to your JAVA_OPTS environment variable:</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>JAVA_OPTS = -Dhttp.proxyHost=yourproxy -Dhttp.proxyPort=8080 </pre></td></tr></table><h2>Logging</h2><p>If you want to see what Grape is doing set the system property "groovy.grape.report.downloads" to "true" (e.g. add "-Dgroovy.grape.report.downloads=true" to JAVA_OPTS) and Grape will print the following infos to System.error:</p><ul><li>Starting resolve of a dependency</li><li>Starting download of an artifact</li><li>Retrying download of an artifact</li><li>Download size and time for downloaded artifacts</li></ul><h1>Detail</h1><p>Grape (The Groovy Adaptable Packaging Engine or Groovy Advanced Packaging Engine) is the infrastructure enabling the grab() calls in Groovy, a set of classes leveraging Ivy to allow for a repository driven module system for Groovy. This allows a developer to write a script with an essentially arbitrary library requirement, and ship just the script. Grape will, at runtime, download as needed and link the named libraries and all dependencies forming a transitive closure when the script is run from existing repositories such as Ibiblio, Codehaus, and java.net.</p><p>Grape follows the Ivy conventions for module version identification, with naming change.</p><ul><li><code>group</code> - Which module group the module comes from. Translates directly to a Maven groupId or an Ivy Organization. Any group matching <code>/groovy[x][\..*]^/</code> is reserved and may have special meaning to the groovy endorsed modules.</li><li><code>module</code> - The name of the module to load. Translated directly to a Maven artifactId or an Ivy artifact.</li><li><code>version</code> - The version of the module to use. Either a literal version '1.1-RC3' or an Ivy Range '[2.2.1,)' meaning 2.2.1 or any greater version).</li></ul><p>The downloaded modules will be stored according to Ivy's standard mechanism with a cache root of <code>~/.groovy/grape</code></p><h1>Usage</h1><h2>Annotation</h2><p>One or more groovy.lang.Grab annotations can be added at any place that annotations are accepted to tell the compiler that this code relies on the specific library. This will have the effect of adding the library to the classloader of the groovy compiler. This annotation is detected and evaluated before any other resolution of classes in the script, so imported classes can be properly resolved by a @Grab annotation.</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>import com.jidesoft.swing.JideSplitButton @Grab(group='com.jidesoft', module='jide-oss', version='[2.2.1,2.3.0)') public class TestClassAnnotation { public static String testMethod () { return JideSplitButton.class.name } } </pre></td></tr></table><p>An appropriate <code>grab(...)</code> call will be added to the static initializer of the class of the containing class (or script class in the case of an annotated script element).</p><h2>Multiple Grape Annotations</h2><p>In order to use a Grape annotation multiple times you must use the Grapes annotation, e.g.:</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>@Grapes([ @Grab(group='commons-primitives', module='commons-primitives', version='1.0'), @Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='0.9.7')]) class Example { // ... } </pre></td></tr></table><p>Otherwise you'll encounter the following error:</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>Cannot specify duplicate annotation on the same member</pre></td></tr></table><p>.</p><h2>Method call</h2><p>Typically a call to grab will occur early in the script or in class initialization. This is to insure that the libraries are made available to the ClassLoader before the groovy code relies on the code. A couple of typical calls may appear as follows:</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>import groovy.grape.Grape // random maven library Grape.grab(group:'com.jidesoft', module:'jide-oss', version:'[2.2.0,)') Grape.grab([group:'org.apache.ivy', module:'ivy', version:'2.0.0-beta1', conf:['default', 'optional']], [group:'org.apache.ant', module:'ant', version:'1.7.0']) // endorsed Groovy Module // FUTURE grab('Scriptom') </pre></td></tr></table><p>* Multiple calls to grab in the same context with the same parameters should be idempotent. However, if the same code is called with a different ClassLoader context then resolution may be re-run.</p><ul><li><s><code>grab</code> is disabled by default. Starting calling <code>Grape.initGrape()</code> will enable grab. Any calls to grab before <code>initGrape()</code> is called will be ignored. Hence Grape managed classloading is opt in only. Multiple calls ti <code>Grape.initGrape()</code> after the first successful call are ignored.</s></li><li>If the <code>args</code> map passed into the <code>grab</code> call has an attribute <code>noExceptions</code> that evaluates true no exceptions will be thrown.</li><li><code>grab</code> requires that a RootLoader or GroovyClassLoader be specified or be in the ClassLoader chain of the calling class. By default failure to have such a ClassLoader available will result in module resolution and an exception being thrown<s> (if <code>initGrape()</code>has been called).</s><ul><li>The ClassLoader passed in via the <code>classLoader:</code> argument and it's parent classloaders.</li><li>The ClassLoader of the object passed in as the <code>referenceObject:</code> argument, and it's parent classloaders.</li><li>The ClassLoader of the class issuing the call to <code>grab</code></li></ul></li></ul><h3><code>grab(HashMap)</code> Parameters</h3><ul><li><code>group:</code> - <String> - Which module group the module comes from. Translates directly to a Maven groupId. Any group matching <code>/groovy(</code><code><sup>|\..</sup></code><code><strong><sup>|x</sup></strong></code><code><strong>|x\..</strong></code><code>)/</code> is reserved and may have special meaning to the groovy endorsed modules.</li><li><code>module:</code> - <String> - The name of the module to load. Translated directly to a Maven artifactId.</li><li><code>version:</code> - <String> and possibly <Range> - The version of the module to use. Either a literal version '1.1-RC3' or an Ivy Range '[2.2.1,)' meaning 2.2.1 or any greater version).</li><li><code>classifier:</code> - <String> - The Maven classifier to resolve by.</li><li><code>conf:</code> - <String>, default 'default' - The configuration or scope of the module to download. The default conf is <code>default:</code> which maps to the maven <code>runtime</code> and <code>master</code> scopes.</li><li><code>force:</code>- <boolean>, defaults true - Used to indicate that this revision must be used in case of conflicts, independently of</li><li>conflicts manager</li><li><code>changing:</code> - <boolean>, default false - Whether the artifact can change without it's version designation changing.</li><li><code>transitive:</code> - <boolean>, default true - Whether to resolve other dependencies this module has or not.</li></ul><p>There are two principal variants of <code>grab</code>, one with a single Map and one with an arguments Map and multiple dependencies map. A call to the single map grab is the same as calling grab with the same map passed in twice, so grab arguments and dependencies can be mixed in the same map, and grab can be called as a single method with named parameters.</p><p>There are synonyms for these parameters. Submitting more than one is a runtime exception.</p><ul><li><code>group:</code>, <code>groupId:</code>, <code>organisation:</code>, <code>organization:</code>, <code>org:</code></li><li><code>module:</code>, <code>artifactId:</code>, <code>artifact:</code></li><li><code>version:</code>, <code>revision:</code>, <code>rev:</code></li><li><code>conf:</code>, <code>scope:</code>, <code>configuration:</code></li></ul><h4>Arguments Map arguments</h4><ul><li><code>classLoader:</code> - <GroovyClassLaoder> or <RootClassLoader> - The ClassLoader to add resolved Jars to</li><li><code>refObject:</code> - <Object> - The closest parent ClassLoader for the object's class will be treated as though it were passed in as <code>classLoader:</code></li><li><code>validate:</code> - <boolean>, default false - Should poms or ivy files be validated (true), or should we trust the cache (false).</li><li><code>noExceptions:</code> - <boolean>, default false - If ClassLoader resolution or repository querying fails, should we throw an exception (false) or fail silently (true).</li></ul><h2>Command Line Tool</h2><p>Grape added a command line executable 'grape' that allows for the inspection and management of the local grape cache.</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>grape install <groupId> <artifactId> [<version>] </pre></td></tr></table><p>This installs the specified groovy module or maven artifact. If a version is specified that specific version will be installed, otherwise the most recent version will be used (as if '*' we passed in).</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>grape list </pre></td></tr></table><p>Lists locally installed modules (with their full maven name in the case of groovy modules) and versions.</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>grape resolve (<groupId> <artifactId> <version>)+ </pre></td></tr></table><p>This returns the file locations of the jars representing the artifcats for the specified module(s) and the respective transitive dependencies. You may optionally pass in -ant, -dos, or -shell to get the dependencies expressed in a format applicable for an ant script, windows batch file, or unix shell script respectively. -ivy may be passed to see the dependencies expressed in an ivy like format.</p><h1>Advanced configuration</h1><h2>Repository Directory</h2><p>If you need to change the directory grape uses for downloading libraries you can specify the grape.root system property to change the default (which is ~/.groovy/grape)</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>groovy -Dgrape.root=/repo/grape yourscript.groovy </pre></td></tr></table><h2>Customize Ivy settings</h2><p>//TODO expand on discussion of grapeConfig.xml</p><p>You can customize the ivy settings that Grape uses by creating a ~/.groovy/grapeConfig.xml file. If no such file exists, <a href="http://svn.codehaus.org/groovy/tags/GROOVY_1_6_0/src/main/groovy/grape/defaultGrapeConfig.xml">here</a> are the default settings used by Grape:</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre><ivysettings> <settings defaultResolver="downloadGrapes"/> <resolvers> <chain name="downloadGrapes"> <filesystem name="cachedGrapes"> <ivy pattern="${user.home}/.groovy/grapes/[organisation]/[module]/ivy-[revision].xml"/> <artifact pattern="${user.home}/.groovy/grapes/[organisation]/[module]/[type]s/[artifact]-[revision].[ext]"/> </filesystem> <!-- todo add 'endorsed groovy extensions' resolver here --> <ibiblio name="codehaus" root="http://repository.codehaus.org/" m2compatible="true"/> <ibiblio name="ibiblio" m2compatible="true"/> <ibiblio name="java.net2" root="http://download.java.net/maven/2/" m2compatible="true"/> </chain> </resolvers> </ivysettings> </pre></td></tr></table><p>For more information on how to customize these settings, please refer to the <a href="http://ant.apache.org/ivy/history/latest-release/settings.html">Ivy documentation</a>.</p><h3>Add your local Maven2 repository</h3><p>If you find yourself wanting to reuse artifacts that you already have locally in your Maven2 repository, then you can add this line to your ~/.groovy/grapeConfig.xml:</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre><ibiblio name="local" root="file:${user.home}/.m2/repository/" m2compatible="true"/></pre></td></tr></table><p>And further customize your Grape configuration:</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre><?xml version="1.0"?> <ivysettings> <settings defaultResolver="downloadGrapes"/> <resolvers> <chain name="downloadGrapes"> <!-- todo add 'endorsed groovy extensions' resolver here --> <ibiblio name="local" root="file:${user.home}/.m2/repository/" m2compatible="true"/> <filesystem name="cachedGrapes"> <ivy pattern="${user.home}/.groovy/grapes/[organisation]/[module]/ivy-[revision].xml"/> <artifact pattern="${user.home}/.groovy/grapes/[organisation]/[module]/[type]s/[artifact]-[revision].[ext]"/> </filesystem> <ibiblio name="codehaus" root="http://repository.codehaus.org/" m2compatible="true"/> <ibiblio name="ibiblio" m2compatible="true"/> <ibiblio name="java.net2" root="http://download.java.net/maven/2/" m2compatible="true"/> </chain> </resolvers> </ivysettings> </pre></td></tr></table><h1>More Examples</h1><p>Using Apache Commons Collections:</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>// create and use a primitive array import org.apache.commons.collections.primitives.ArrayIntList @Grab(group='commons-primitives', module='commons-primitives', version='1.0') def createEmptyInts() { new ArrayIntList() } def ints = createEmptyInts() ints.add(0, 42) assert ints.size() == 1 assert ints.get(0) == 42 </pre></td></tr></table><p>Using TagSoup:</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>// find the PDF links in the Java 1.5.0 documentation @Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='0.9.7') def getHtml() { def parser = new XmlParser(new org.ccil.cowan.tagsoup.Parser()) parser.parse("http://java.sun.com/j2se/1.5.0/download-pdf.html") } html.body.'**'.a.@href.grep(~/.*\.pdf/).each{ println it } </pre></td></tr></table><p>Using Google Collections:</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>// Google Collections example import com.google.common.collect.HashBiMap @Grab(group='com.google.code.google-collections', module='google-collect', version='snapshot-20080530') def getFruit() { [grape:'purple', lemon:'yellow', orange:'orange'] as HashBiMap } assert fruit.lemon == 'yellow' assert fruit.inverse().yellow == 'lemon' </pre></td></tr></table><p>Launching a Jetty server to serve Groovy templates:</p><table class="wysiwyg-macro" data-macro-name="code" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGV9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>@Grapes([ @Grab(group='org.eclipse.jetty.aggregate', module='jetty-server', version='8.1.7.v20120910'), @Grab(group='org.eclipse.jetty.aggregate', module='jetty-servlet', version='8.1.7.v20120910'), @Grab(group='javax.servlet', module='javax.servlet-api', version='3.0.1')]) import org.eclipse.jetty.server.Server import org.eclipse.jetty.servlet.* import groovy.servlet.* def runServer(duration) { def server = new Server(8080) def context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS); context.resourceBase = "." context.addServlet(TemplateServlet, "*.gsp") server.start() sleep duration server.stop() } runServer(10000) </pre></td></tr></table><p>Grape will download Jetty and its dependencies on first launch of this script, and cache them. We're creating a new Jetty Server on port 8080, then expose Groovy's TemplateServlet at the root of the context — Groovy comes with its own powerful template engine mechanism. We start the server and let it run for a certain duration. Each time someone will hit <a href="http://localhost:8080/somepage.gsp">http://localhost:8080/somepage.gsp</a>, it will display the somepage.gsp template to the user — those template pages should be situated in the same directory as this server script.</p><h3>See Also:</h3><p><a class="confluence-link" href="/display/GROOVY/Using+Hibernate+with+Groovy" data-linked-resource-id="115900424" data-linked-resource-type="page" data-linked-resource-default-alias="Using Hibernate with Groovy" data-base-url="http://docs.codehaus.org">Using Hibernate with Groovy</a><br /> <a href="http://stackoverflow.com/questions/192432/getting-groovys-grape-going">http://stackoverflow.com/questions/192432/getting-groovys-grape-going</a></p>
Please type the word appearing in the picture.
Attachments
Labels
Location
Watch this page
< Edit
Preview >
Loading…
Save
Cancel
Next hint
search
attachments
weblink
advanced