blob: 2ca3effa33c5148cfacccd05b2246ec1af0b0d4a [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<faqs title="Frequently Asked Questions">
<part id="general">
<title>General</title>
<faq id="whats-groovy">
<question>
What is Groovy?
</question>
<answer>
<p>
Groovy is a powerful high level language for the Java platform which compiles
down to Java bytecode.
</p>
<p>
Think of it as a Ruby or Python like language that is tightly integrated with
the Java platform - allowing you the same powerful and concise coding syntax as
Ruby or Pyton but allowing you to stay on the JVM and protect your investment in
J2SE, J2EE and all the plethora of great useful Java code out there.
</p>
</answer>
</faq>
<faq id="why-groovy">
<question>
Why Groovy? Why don't you just use Jython, JRuby, bsh, rhino, pnuts, ...
</question>
<answer>
<p>
Firstly ports of existing languages like Python, Ruby, Smalltalk and JavaScript to the JVM
are a good thing and we welcome them. If you already use and/or are fond of these languages
please be our guests to use the Java-port of them.
</p>
<p>
One of the main design goals of Groovy is to be a scripting language for Java developers to use.
So we wanted to reuse both Java's semantics and the whole set of J2SE APIs rather than introduce
a port of a different language with different semantics and APIs to learn and implement/maintain.
</p>
<p>
e.g. in Groovy, java.lang.Object is the root of the object hierarchy,
Object.equals(), Object.hashCode() and Comparable are used for comparions
and lookups of objects, that java.util.List and java.util.Map are used for collections,
Java Beans are fully supported and that Java and Groovy classes are interchangable
inside the JVM.
Groovy is built on top of the J2SE APIs, rather than having 2 parallel platforms etc.
</p>
<p>
In other words we wanted the Groovy language to be very easy to pick up if you're already a Java developer
and for there to be a very small number of new APIs to learn.
By this statement we're not implying that Python / Ruby / JavaScript are hard to learn per se - its just
there's more to know, things are more different and there's more APIs to learn.
</p>
<p>
Think of Groovy as a Ruby or Python like language that is tightly integrated with
the Java platform (as opposed to the Unix/Posix command shell and C-libraries)
- allowing you the same powerful and concise coding syntax as
Ruby or Pyton but allowing you to stay on the JVM and protect your investment in
J2SE, J2EE and all the plethora of great useful Java code out there without any adapter layers or
parallel API sets etc.
</p>
<p>
There is a more detailed set of comparisions to other languages
<a href="http://wiki.codehaus.org/groovy/ComparisonToOtherLanguages">here</a>
</p>
</answer>
</faq>
<faq id="dependencies">
<question>
What are the dependencies for Groovy?
</question>
<answer>
<p>As well as Java 1.4 and the Groovy jar we also depend at runtime on the ASM library</p>
</answer>
</faq>
<faq id="licence">
<question>
What is the licence for Groovy?
</question>
<answer>
<p>Groovy is open source using a BSD / Apache style <a href="http://cvs.groovy.codehaus.org/viewcvs.cgi/groovy/groovy-core/LICENSE.txt?rev=HEAD&amp;view=auto">licence</a></p>
</answer>
</faq>
<faq id="contribute">
<question>
How can I contribute to Groovy?
</question>
<answer>
<p>
There are many ways you can help and contribute to Groovy.
Please read the <a href="contribute.html">contributing guide</a>
</p>
</answer>
</faq>
</part>
<part id="using">
<title>Using Groovy</title>
<faq id="how-embed">
<question>
How can I embed Groovy into my Java application
</question>
<answer>
<p>
Please see this description of <a href="embedding.html">embedding Groovy</a>
</p>
</answer>
</faq>
<faq id="how-compile">
<question>
How can I compile Groovy to bytecode either at runtime or build time?
</question>
<answer>
<p>
Please see this description of <a href="compiling.html">compiling Groovy</a>
</p>
</answer>
</faq>
<faq id="how-run">
<question>
How can I run Groovy scripts?
</question>
<answer>
<p>
Please see this description of <a href="running.html">running Groovy code</a>
</p>
</answer>
</faq>
<faq id="problems">
<question>
I get errors when trying to run groovy, groovysh or groovyConsole. Whats wrong?
</question>
<answer>
<p>
Groovy depends on JDK 1.4 or later. Common errors people have when trying to run
Groovy is that there's an old groovy jar on the CLASSPATH somewhere (have you
checked in java/lib/ext?) or that JAVA_HOME points to an old JDK before JDK 1.4.x.
</p>
<p>
For more help please see this description of <a href="running.html">running Groovy code</a>
</p>
</answer>
</faq>
<faq id="classpath">
<question>
How can I add stuff to the classpath when running things in groovysh or groovy?
</question>
<answer>
<p>
You can add things to your $CLASSPATH environment variable. Another popular option
is to create a .groovy/lib directory in your home directory and add whatever jars you
want to be available by default.
</p>
<p>
e.g. if you wish to connect to your favourite JDBC database and do some scripting with it
then add your JDBC driver to ~/.groovy/lib.
</p>
</answer>
</faq>
</part>
<part id="language">
<title>Questions about the Groovy language</title>
<faq id="newline-before-brace">
<question>
Things work if I use Suns conventions and put { on the same line, but if I add a new line things break?
</question>
<answer>
<p>
When using closures with method calls we have some syntax sugar in Groovy which is sensitive to whitespace (newlines to be preceise).
Please see this description in <a href="javadiff.html">common gotchas</a> for a full description
</p>
</answer>
</faq>
</part>
<part id="gdk">
<title>GDK (Groovy Development Kit)</title>
<faq id="groovy-jgk">
<question>
What new methods are available on standard JDK classes?
</question>
<answer>
<p>
Please see this description of the <a href="groovy-jdk.html">Groovy JDK</a>
</p>
</answer>
</faq>
<faq id="what-closure">
<question>
What are Closures?
</question>
<answer>
<p>
Please see this description of <a href="closures.html">closures</a>
</p>
</answer>
</faq>
<faq id="operators">
<question>
How does operator overloading work?
</question>
<answer>
<p>
Please see this description of <a href="operators.html">operator overloading</a>
</p>
</answer>
</faq>
</part>
<part id="developer">
<title>Groovy Developers FAQ</title>
<faq id="build">
<question>
How do I build Groovy from the source code?
</question>
<answer>
<p>
We use <a href="">Maven</a> as the build tool for Groovy.
From a source distribution, or <a href="cvs-usage.html">CVS checkout</a>
you need to install Maven as per the instructions on Maven's website.
</p>
<p>
Basically this involves setting the JAVA_HOME and MAVEN_HOME environment
variables and adding JAVA_HOME/bin and MAVEN_HOME/bin to your path.
Once you have installed Maven you can build Groovy and run all the unit tests
by typing the following in a command line shell
</p>
<source>
maven
</source>
</answer>
</faq>
<faq id="quick-build">
<question>
All the unit test cases take a while to run. Can I do a quicker build?
</question>
<answer>
<p>
You can do a full clean binary build without running the unit tests via..
</p>
<source>
maven rebuild
</source>
<p>
If you want to run all the unit test cases inside the same JVM, which saves quite a bit of time
although the output isn't as nice, you can use this command.
</p>
<source>
maven groovy:test-quick
</source>
</answer>
</faq>
<faq id="some-tests">
<question>
All the unit test cases take a while to run. Can I run just some of the tests?
</question>
<answer>
<p>
Or to run a specific test case you can do
</p>
<source>
maven test:single -Dtestcase=CharsetToolkitTest
</source>
<p>
Where you pass in the name of a test case. If you want to run a single unit test case
written in Groovy in a slightly faster way you can try this...
</p>
<source>
maven groovy:test-single -Dtest=src/test/groovy/SomeTest.groovy
</source>
<p>
or to run tests matching a certain pattern...
</p>
<source>
maven test:match -Dtestmatch=Foo*Test.*
</source>
<p>
There is more details on unit testing groovy scripts <a href="unitTesting.html">here</a>
</p>
</answer>
</faq>
</part>
<!-- More faqs or parts here -->
<part id="committer">
<title>Groovy Committers FAQ</title>
<faq id="start">
<question>
I've just been given CVS commit access; what should I do now?
</question>
<answer>
<p>
If you've just been given CVS commit access see if you can do a commit.
You'll need to do an SSH based CVS checkout. Once you've done this
you should be able to edit the project.xml file and change yourself
from being a committer to being a developer. Then try commit that
and see if it works.
If you need more help, please ask on IRC or email.
</p>
</answer>
</faq>
<faq id="rules">
<question>
What are the development rules?
</question>
<answer>
<p>
Please try and write unit test cases for all new features, patches or fixes.
</p>
<p>
Its considered very bad form to commit code that doesn't compile or breaks the unit tests.
We run a continuous integration build (using DamageControl) to ensure that the build in CVS
works and the tests pass.
</p>
<p>
Its useful to subscribe to all 3 mail lists, especially groovy-scm which shows all CVS commits
along with any continuous integration build failures and JIRA issue changes.
</p>
</answer>
</faq>
<faq id="dc">
<question>
Where is the continuous integration build?
</question>
<answer>
<p>
We run DamageControl at codehaus. If a build fails a nag mail is sent to the groovy-scm mail list.
You can watch DC do its stuff using your IRC client and joining
<a href="irc://irc.codehaus.org/damagecontrol">#damagecontrol</a>.
</p>
<p>
You can also view the latest DC <a href="http://builds.codehaus.org/log/groovy-core/">build logs</a>
or see the <a href="http://builds.codehaus.org/checkout/groovy-core/target/test-reports/">test case results</a>
</p>
</answer>
</faq>
<faq id="cvs">
<question>
How do I use codehaus's CVS?
</question>
<answer>
<p>
Codehaus uses SSH for CVS access. So from the command line you'd type
</p>
<source>
export CVS_RSH=ssh
</source>
<p>
Or if you're using eclipse you might find
<a href="http://www.jcraft.com/eclipse-cvsssh2/">this plugin</a>
handy.
I use it with extssh2 and it works great!
</p>
</answer>
</faq>
</part>
</faqs>