---
layout: default
title: More Stuff
---

h2(#shell).  Interactive Shells (REPLs)

Many languages (including Scala and Groovy) provide an interactive shell tool which allows developers to run arbitrary expressions and see the results immediately:

<pre>$ scala
Welcome to Scala version 2.7.4.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_03-p3).
Type in expressions to have them evaluated.
Type :help for more information.

scala> 6 * 7
res0: Int = 42

scala> </pre>

These tools are alternatively known as "REPLs" (Read, Eval, Print Loop), a term which originally comes from Lisp.  This sort of interactive shell can be an invaluable asset when developing frameworks or other non-UI-oriented modules.  A common use-case is running a quick, manual test to make sure that the framework is functioning properly.  It is faster and easier to do this in a shell, and also averts the need for extra test cases to be developed just to check simple things during development.

Unfortunately, for such a tool to be useful in Java, Scala or Groovy development, it must have access to the @CLASSPATH@, not only the compiled project binaries, but also its full list of dependencies.  While it is usually possible with such tools to specify the classpath upon startup (e.g. the @-cp@ switch for the Scala shell), this can get extremely tedious for project's with more dependencies, especially when some of these dependencies are defined using @transitive@ artifacts.

Buildr is capable of easing this workflow by providing full support for the configuration and launch of interactive shells, the relevant shell may be launched simply by invoking the @shell@ task:

{% highlight sh %}
$ buildr shell
{% endhighlight %}

The @shell@ task depends upon @compile@, meaning that any changed source files will be recompiled prior to the shell's launch.  Tests will not be run, nor will test files be recompiled.  From within the shell itself, you should have access to your project's compilation classpath (anything specified using @compile.with@) as well as the compiled sources for your project.

The project classpath is determined by checking the current working directory of your system shell (the path from which the @buildr shell@ command was invoked) and recursively finding the relevant project for that directory.  Thus, if you have a parent project @foo@ which has sub-projects @bar@ and @baz@, you may invoke an interactive shell for the @baz@ project simply by @cd@-ing into its project directory (or any of its sub-directories) and invoking the @shell@ task. You may also invoke a shell against a specific project by giving its fully-qualified descriptor as a prefix to the @shell@ task:

{% highlight sh %}
$ buildr foo:bar:shell
{% endhighlight %}

h3. Supported Shells

By default, Buildr will open the interactive shell which corresponds to your project's language.  Thus, if your project is using Groovy, it will invoke the @groovysh@ command, configured with the appropriate classpath.  If your project is using Scala, then the @shell@ task will invoke the @scala@ command.  Unfortunately, the Java language does not define an interactive shell of any kind, however for those projects using exclusively the Java language, Buildr will use the "BeanShell":http://www.beanshell.org/manual/quickstart.html#The_BeanShell_GUI console.

However, you may still wish to exploit the advantages of an interactive shell from some other JVM language even while working in Java.  Alternatively, you may want to use some shell other than the default even when working in a language which has its own.  There are two ways to acheive this aim.  The quickest way is to explicitly specify the relevant shell at the call-site:

{% highlight sh %}
$ buildr foo:shell:jirb
{% endhighlight %}

This will open the JIRB shell (the JRuby REPL) for the @foo@ project.  Whenever you are specifying a shell explicitly in this fashion, you *must* fully-qualify the project name:

{% highlight sh %}
$ buildr shell:jirb     # wrong!!
{% endhighlight %}

The above will fail because of the way that Rake tasks are dispatched.

Obviously, this explicit specification is a little bit clunky.  It would be much easier if we could simply say that we *always* want to use the JIRB shell for this particular project.  This can be done by using the @shell.using@ directive within your project definition:

{% highlight ruby %}
define 'foo' do
  shell.using :jirb
end
{% endhighlight %}

With this project definition, we can now invoke the @shell@ task and JIRB will be launched, regardless of the default for our project's language:

{% highlight sh %}
$ buildr shell
{% endhighlight %}

Buildr supports several different shell providers, and the framework is flexible enough that additional support can be added almost trivially.  The following table gives the complete list of supported shells, their corresponding @shell.using@ descriptor and the language for which they are the default (if applicable):

|_. Shell Name        |_. Descriptor       |_. Language       |
| BeanShell Console   | @:bsh@             | Java             |
| Clojure REPL        | @:clj@             | *N/A*            |
| GroovySH            | @:groovysh@        | Groovy           |
| JRuby IRB           | @:jirb@            | *N/A*            |
| Scala Interpreter   | @:scala@           | Scala            |

Note that some of these shells impose certain requirements to enable use.  The Groovy shell requires the @GROOVY_HOME@ environment variable to point to the Groovy install path.  The Clojure REPL makes a similar requirement of @CLOJURE_HOME@.  The JRuby and Scala shells will use @JRUBY_HOME@ and @SCALA_HOME@ respectively if they are defined.  However, if these environment variables are not defined, the relevant JAR files will be automatically downloaded from the appropriate Maven2 repository.

h3. Verbosity and Tracing

By default, Buildr is moderately verbose, meaning that it attempts to give you enough context into what's happening during the build.

It's possible to silence Buildr if you're inconvenienced by its default verbosity by issuing,

{% highlight sh %}
$ buildr --silent
{% endhighlight %}

On the other hand, if you want Buildr to give you more context in order to trace what's happening, you can use the @-t@ options:

{% highlight sh %}
$ buildr -t
{% endhighlight %}

Using @-t@ will also display backtraces if and when they occur.

Many components can be individually configured to display more output if you're debugging a specific area of your build.  For instance, you could use @--trace=javac,groovyc@ to enable tracing of the Java and Groovy compilers:

{% highlight sh %}
$ buildr --trace=javac,groovyc
{% endhighlight %}

If you don't know which tracing category you need to enable or if you want a full firehose worth of traces, you can enable all traces:

{% highlight sh %}
$ buildr --trace=all
{% endhighlight %}

h3(#javarebel). JavaRebel Integration

"JavaRebel":http://www.zeroturnaround.com/javarebel is a live bytecode reloading solution by Zero Turnaround.  It's a lot like the hot code reload feature found in many Java IDE debuggers (like Eclipse and IntelliJ), but capable of handling things like member addition or removal and new class definition.  The tool itself is commercial and works with any JVM language, but they do offer a free license for use with Scala classes only.

If available, Buildr will use JavaRebel when configuring the launch for each interactive shell.  Shells launched with JavaRebel integration will automatically receive recompiled changes on the fly without any need to restart the shell.  There are some limitations to this which are specific to the shell in question, but for the most part, things Just Work.

JavaRebel auto-magical integration is done by searching for a valid JavaRebel install path in the following list of environment variables (in order):

* @REBEL_HOME@
* @JAVA_REBEL@
* @JAVAREBEL@
* @JAVAREBEL_HOME@

These environment variables may point to either the JavaRebel install directory (e.g. @~/javarebel-2.0.1@), or the JAR file itself (e.g. @~/javarebel-2.0.1/javarebel.jar@).  If the path is valid, Buildr will automatically append the appropriate JVM switches to the launch configurations of each shell:

<pre>$ buildr shell
(in ~/foo, development)
Compiling foo into ~/foo/target/classes
Running java scala.tools.nsc.MainGenericRunner

#############################################################

 ZeroTurnaround JavaRebel 2.0.1 (200905251513)
 (c) Copyright Webmedia, Ltd, 2007-2009. All rights reserved.

 This product is licensed to Daniel Spiewak
 for personal use only.

#############################################################

Welcome to Scala version 2.7.4.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_03-p3).
Type in expressions to have them evaluated.
Type :help for more information.

scala> </pre>

Note that Buildr does *not* check to make sure that you have a valid JavaRebel license, so you may end up launching with JavaRebel configured but without the ability to use it (in which case, JavaRebel will print a notification).

h2(#run). Running Your Application

The @run@ task lets you easily run programs from your buildfile, such as launching your own application.

In its simplest form, you simply define the main class of your Java application,

{% highlight ruby %}
define 'my-project' do
  compile.with COMMONS_IO, HTTPCLIENT
  run.using :main => "org.example.Main"
end
{% endhighlight %}

And then run,

{% highlight ruby %}
~/my-project$ buildr run
{% endhighlight %}

which would launch your application using the project's compile classpath.

It's also possible to pass arguments to the JVM using the @:java_args@ option:

{% highlight ruby %}
  run.using :main => "org.example.Main",
            :java_args => ["-server"]
{% endhighlight %}

If your application requires arguments, you can pass in an array of values for the @:main@ option, or provide a set of system properties using @:properties@.

{% highlight ruby %}
  run.using :main => ["org.example.Main", "-t", "input.txt"],
            :properties => { :debug => "true" }
{% endhighlight %}

The @run@ task is a local task, which means that Buildr will automatically pick the @run@ task matching the project in the current directory.  Executing the following command:

{% highlight ruby %}
~/my-project/subproject$ buildr run
{% endhighlight %}

will run the @my-project:subproject:run@ task, assuming @my-project@ is your top-level project.

Here is a summary of @run.using@ options,

|_. Option |_. Description ... |
| @:main@   | The java main class, e.g. "com.example.Main". Can also be an array if the main class requires arguments. |
| @:properties@   | A hash of system properties to be passed to java. |
| @:java_args@ | An array of additional parameters to pass to java |
| @:classpath@   | An array of additional classpath elements (i.e. artifacts, files, etc.). By default, the @run@ task automatically uses the @compile.dependencies@, @test.dependencies@ and @test.compile.target@ of your project. |

p(note). The @run@ task also detects and uses JavaRebel if it's available.  See the "JavaRebel":#javarebel section for details.

h2(#gems).  Using Gems

The purpose of the buildfile is to define your projects, and the various tasks and functions used for building them.  Some of these are specific to your projects, others are more general in nature, and you may want to share them across projects.

There are several mechanisms for developing extensions and build features across projects which we cover in more details in the section "Extending Buildr":extending.html.  Here we will talk about using extensions that are distributed in the form of RubyGems.

"RubyGems":http://rubygems.org provides the @gem@ command line tool that you can use to search, install, upgrade, package and distribute gems. It installs all gems into a local repository that is shared across your builds and all other Ruby applications you may have running.  You can install a gem from a local file, or download and install it from any number of remote repositories.

RubyGems is preconfigured to use the "RubyForge":http://rubygems.org repository.  You'll find a large number of open source Ruby libraries there, including Buildr itself and all its dependencies.

You can also set up your own private repository and use it instead or in addition to RubyForge.  Use the @gem sources@ command to add repositories, and the @gem server@ command to run a remote repository.  You can see all available options by running @gem help@.

If your build depends on other gems, you will want to specify these dependencies as part of your build and check that configuration into source control.  That way you can have a specific environment that will guarantee repeatable builds, whether you're building a particular version, moving between branches, or joining an existing project.  Buildr will take care of installing all the necessary dependencies, which you can then manage with the @gem@ command.

Use the @build.yaml@ file to specify these dependencies (see "Build Settings":settings_profiles.html#build for more information), for example:

{% highlight yaml %}
# This project requires the following gems
gems:
  # Suppose we want to notify developers when testcases fail.
  - buildr-twitter-notifier-addon >=1
  # we test with ruby mock objects
  - mocha
  - ci_reporter
{% endhighlight %}

Gems contain executable code, and for that reason Buildr will not install gems without your permission.  When you run a build that includes any dependencies that are not already installed on your machine, Buildr will ask for permission before installing them.  On Unix-based operating systems, you will also need sudo privileges and will be asked for your password before proceeding.

Since this step requires your input, it will only happen when running Buildr interactively from the command line.  In all other cases, Buildr will fail and report the missing dependencies.  If you have an automated build environment, make sure to run the build once manually to install all the necessary dependencies.

When installing a gem for the first time, Buildr will automatically look for the latest available version.  You can specify a particular version number, or a set of version numbers known to work with that build.  You can use equality operations to specify a range of versions, for example, @1.2.3@ to install only version 1.2.3, and @=> 1.2.3@ to install version 1.2.3 or later.

You can also specify a range up to one version bump, for example, @~> 1.2.3@ is the same as @>= 1.2.3 < 1.3.0@, and @~> 1.2@ is the same as @>= 1.2.0 < 2.0.0@. If necessary, you can exclude a particular version number, for example, @~> 1.2.3 != 1.2.7@.

Buildr will install the latest version that matches the version requirement. To keep up with newer versions, execute the @gem update@ command periodically. You can also use @gem outdated@ to determine which new versions are available.

Most gems include documentation that you can access in several forms.  You can use the @ri@ command line tool to find out more about a class, module or specific method.  For example:

{% highlight sh %}
$ ri Buildr::Jetty
$ ri Buildr::Jetty.start
{% endhighlight %}

You can also access documentation from a Web browser by running @gem server@ and pointing your browser to "http://localhost:8808":http://localhost:8808. Note that after installing a new gem, you will need to restart the gem server to see its documentation.


h2(#java).  Using Java Libraries

Buildr runs along side a JVM, using either RJB or JRuby.  The Java module allows you to access Java classes and create Java objects.

Java classes are accessed as static methods on the @Java@ module, for example:

{% highlight ruby %}
str = Java.java.lang.String.new('hai!')
str.toUpperCase
=> 'HAI!'
Java.java.lang.String.isInstance(str)
=> true
Java.com.sun.tools.javac.Main.compile(args)
{% endhighlight %}

The @classpath@ attribute allows Buildr to add JARs and directories to the classpath, for example, we use it to load Ant and various Ant tasks, code generators, test frameworks, and so forth.

When using an artifact specification, Buildr will automatically download and install the artifact before adding it to the classpath.

For example, Ant is loaded as follows:

{% highlight ruby %}
Java.classpath << 'org.apache.ant:ant:jar:1.7.0'
{% endhighlight %}

Artifacts can only be downloaded after the Buildfile has loaded, giving it a chance to specify which remote repositories to use, so adding to classpath does not by itself load any libraries.  You must call @Java.load@ before accessing any Java classes to give Buildr a chance to load the libraries specified in the classpath.

When building an extension, make sure to follow these rules:

# Add to the @classpath@ when the extension is loaded (i.e. in module or class definition), so the first call to @Java.load@ anywhere in the code will include the libraries you specify.
# Call @Java.load@ once before accessing any Java classes, allowing Buildr to set up the classpath.
# Only call @Java.load@ when invoked, otherwise you may end up loading the JVM with a partial classpath, or before all remote repositories are listed.
# Check on a clean build with empty local repository.


h2(#buildr-server). BuildrServer

Buildr provides an addon that allows you start a "dRuby":http://www.ruby-doc.org/stdlib/libdoc/drb/rdoc/index.html server hosting a buildfile, so that you can later invoke tasks on it without having to load the complete buildr runtime again.

Usage:

{% highlight sh %}
buildr -r buildr/drb drb:start
{% endhighlight %}

To stop the BuildrServer simply use Ctrl+C or kill the process.

Once the server has been started you can invoke tasks using a simple script:

{% highlight ruby %}
#!/usr/bin/env ruby
require 'rubygems'
require 'buildr/drb'
Buildr::DRbApplication.run
{% endhighlight %}

Save this script as @dbuildr@, make it executable and use it to invoke tasks.

<notextile>
{% highlight sh %}
$ dbuildr clean compile
{% endhighlight %}
</notextile>

The @dbuildr@ command will start the BuildrServer if there isn't one already running.  Subsequent calls to dbuildr will act as the client and invoke the tasks you provide to the server.  If the buildfile has been modified it will be reloaded on the BuildrServer.

h2(#notifications). Notifications: Growl, Libnotify, Qube

Buildr support sending notifications when the build completes or fails, such as displaying the outcome message in an overlaid window on top of other applications.

For OS X users, Buildr supports "Growl":http://growl.info/ out of the box by using the Ruby Cocoa bindings.

For Debian-based Linux users, Buildr supports notifications via the "notify-send":http://manpages.ubuntu.com/manpages/gutsy/man1/notify-send.1.html command which is part of the "libnotify-bin":"http://packages.debian.org/search?keywords=libnotify-bin" package.  Just make sure `notify-send` is installed and on your path is on your `PATH`.

For other platforms or if you want to notify the user differently, Buildr offers two extension points:

* @Buildr.application.on_completion@
* @Buildr.application.on_failure@

Here is an example using these extension points to send notifications using "Qube":http://launchpad.net/qube:

{% highlight ruby %}
# Send notifications using Qube
notify = lambda do |type, title, message|
  param = case type
    when 'completed'; '-i'
    when 'failed'; '-e'
    else '-i'
  end
  system "qube #{param} #{title.inspect} #{message.inspect}"
end

Buildr.application.on_completion do |title, message|
  notify['completed', title, message]
end
Buildr.application.on_failure do |title, message, ex|
  notify['failed', title, message]
end
{% endhighlight %}

You can place this code inside @buildr.rb@ in the @.buildr@ directory under your home directory.

h2(#eclipse). Eclipse

h3. Use Apache Buildr to create Eclipse projects

If you're using Eclipse, you can generate @.classpath@ and @.project@ from your Buildfile and use them to create a project in your workspace:

{% highlight sh %}
$ buildr eclipse
{% endhighlight %}

The @eclipse@ task will generate a @.classpath@ and @.project@ file for each of projects (and sub-project) that compiles source code.  It will not generate files for other projects, for examples, projects you use strictly for packaging a distribution, or creating command line scripts, etc.

If you add a new project, change the dependencies, or make any other change to your Buildfile, just run the @eclipse@ task again to re-generate the Eclipse project files.  To have your libraries' source code available in Eclipse, run the @artifacts:sources@ task.

You may explicitly specify the nature of your project, for example if you are developing an Eclipse plugin:

{% highlight ruby %}
define 'my-plugin' do
  eclipse.natures :plugin
end
{% endhighlight %}

The currently supported natures are @:java@, @:scala@ and @:plugin@.  Buildr will attempts to auto-detect your project type and apply the most relevant settings by default.   If it doesn't or you need something special, you may also explicitly set the nature, container and builders of your project by doing:

{% highlight ruby %}
define 'custom-plugin' do
  eclipse.natures 'org.eclipse.pde.PluginNature'
  eclipse.classpath_containers 'org.eclipse.pde.core.requiredPlugins'
  eclipse.builders ['org.eclipse.pde.ManifestBuilder', 'org.eclipse.pde.SchemaBuilder']
end
{% endhighlight %}

One more thing; these settings are inherited hierarchically so you may set them on a parent project if you want to share them across different projects.

h3. Use Apache Buildr to create a buildfile from an Eclipse workspace

If you're using Eclipse, you can generate a @buildfile@ from a directory which contains one (or more) Eclipse projects somewhere in its sub-directories.

{% highlight sh %}
$ buildr --generate /path/to/my_project
{% endhighlight %}

This creates a basic buildfile with a main project called 'my_project'. The buildfile contains a skeleton for compiling the Eclipse projects. If you want to automate dependency tracking via OSGi have a look at the "buildr4osgi":http://oss.intalio.com/buildr4osgi/ project. Support for building Eclipse RCP applications, running PDE tests and P2-sites is currently lacking in Buildr.

h2(#maven_central). Releasing to Maven Central

Many opensource projects release their artifacts to Maven Central. To release a library to Maven Central, the project needs to provide several elements for each library;

* the jar artifact,
* the sources artifact,
* the javadocs artifact,
* a pom that supplies fields required by Maven Central, and
* gpg signatures for every file supplied.

Buildr has built-in support for the artifacts and can easily sign the artifacts using the 'buildr/gpg' addon. However it has not always been easy to generate a pom in the required format until the 'buildr/custom_pom' became available.

Below is an extremely verbose example of a project that provides all the elements required to publish to Maven Central.

{% highlight sh %}
# Include addon to generate GPG Signatures
require 'buildr/gpg'
# Include addon to generate custom pom
require 'buildr/custom_pom'

define 'myproject' do
  project.group = 'org.myproject'
  project.version = '1.0'

  pom.licenses['The Apache Software License, Version 2.0'] = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
  pom.scm_connection = pom.scm_developer_connection = 'scm:git:git@github.com:jbloggs/myproject'
  pom.scm_url = 'git@github.com:jbloggs/myproject'
  pom.url = 'https://github.com/jbloggs/myproject'
  pom.issues_url = 'https://github.com/jbloggs/myproject/issues'
  pom.issues_system = 'GitHub Issues'
  pom.add_developer('jbloggs', 'Joe Bloggs', 'jbloggs@example.com', ['Project Lead'])
  pom.provided_dependencies.concat [:javax_servlet]
  pom.optional_dependencies.concat [:optional_api]

  compile.with :javax_servlet, :some_api, :optional_api

  test.with :mockito

  package(:jar)
  package(:sources)
  package(:javadoc)
end
{% endhighlight %}

That example is however, extremely verbose and there is a number of helper methods been added to the 'buildr/custom_pom' addon to simplify common scenarios. It would be more common to see the addon used in the following manner;

{% highlight sh %}
require 'buildr/gpg'
require 'buildr/custom_pom'

define 'myproject' do
  project.group = 'org.myproject'
  project.version = '1.0'

  pom.add_apache_v2_license
  pom.add_github_project('jbloggs/myproject')
  pom.add_developer('jbloggs', 'Joe Bloggs')
  pom.provided_dependencies.concat [:javax_servlet]
  pom.optional_dependencies.concat [:optional_api]

  compile.with :javax_servlet, :optional_api

  test.with :mockito

  package(:jar)
  package(:sources)
  package(:javadoc)
end
{% endhighlight %}

If there are other common scenarios useful for opensource developers, feel free to make a request on buildr mailing list to provide simplified helper methods.

h2(#idea). IntelliJ IDEA

If you use IntelliJ IDEA, you can generate project files by issuing:

{% highlight sh %}
$ buildr idea
{% endhighlight %}

This task will generate a @.iml@ file for every project (or subproject) and a @.ipr@ that you can directly open for the root project.

The generated project files can be removed by issuing:

{% highlight sh %}
$ buildr idea:clean
{% endhighlight %}

The idea task generates the project files based on the settings of each project and idea extension specific settings. The main and test source trees are added to the @.iml@ file for each project as are the respective resource directories. The target and report directories are excluded from the project. If the project files exist on the file system the extension will replace specific component sections in the xml with the generated component configurations.

Dependencies come in two forms. Dependencies on other projects and dependencies on external jars. Dependencies on other projects are added as module dependencies in the @.iml@ while jars are added as regular file dependencies. Dependencies are exported from the @.iml@ file if they are compile dependencies. If a artifact that matches dependency but has a classifier of 'sources' is present then it is configured as the source for the dependency. Note: Use "buildr artifacts:sources" to download the source for dependencies.

h3. Idea Specific Directives

The extension specific settings of sub-projects inherit the parent projects settings unless overwritten.

h4. Project file naming

The extension will use the last element of the projects name when generating the @.ipr@ and @.iml@ files. i.e. A project named "foo" will generate "foo.iml" and "foo.ipr" while a project named "foo:bar" will generate "bar/bar.iml" and no ipr. (The @.ipr@ project files are only generated for the base project). The name can be modified by setting the "ipr.suffix" or "iml.suffix" settings which specifies the suffix appended to the file names. The user can also override the name completely by setting "ipr.id" or "iml.id".

h5. Example: Setting id

{% highlight ruby %}
define "foo" do
  ipr.id = "beep"
  define "bar" do
    iml.id = "baz"
  end
end
{% endhighlight %}

Will generate:

<pre>
beep.ipr
foo.iml
bar/baz.iml
</pre>

h5. Example: Setting suffix

{% highlight ruby %}
define "foo" do
  ipr.suffix = "-suffix1"
  iml.suffix = "-suffix2"
  define "bar"
end
{% endhighlight %}

Will generate:

<pre>
foo-suffix1.ipr
foo-suffix2.iml
bar/bar-suffix2.iml
</pre>

h5. Example: Setting prefix

{% highlight ruby %}
define "foo" do
  ipr.prefix = "prefix1-"
  iml.prefix = "prefix2-"
  define "bar"
end
{% endhighlight %}

Will generate:

<pre>
prefix1-foo.ipr
prefix2-foo.iml
bar/prefix2-bar.iml
</pre>

h4. Disabling project file generation

The extension will not generate an iml file for a project if the "project.no_iml" method is invoked. Generation of ipr files can be disabled by invoking the method "project.no_ipr".

h5. Example

{% highlight ruby %}
define "foo" do
  project.no_ipr
  define "bar" do
    project.no_iml
  end
end
{% endhighlight %}

Will generate:

<pre>
foo.iml
</pre>

h4. Disabling generation of content section in .iml file

The extension will not generate a content section in an iml file if the "iml.skip_content!" method is invoked. This can be useful if a project is just exporting dependencies and has no associated source code. This may also be of use in scenarios where the build is repackaging an existing jar with more meta-data or the project is just a container for other projects.

h5. Example

{% highlight ruby %}
define "foo" do
  iml.skip_content!
end
{% endhighlight %}

h4. VCS Integration

The extension will attempt to guess the VCS type of the project by looking for a @.svn@ or @.git@ directory in the base projects directory. If either of these are set it will configure the component as appropriate. Otherwise the user will need to manually specify the project to one of either 'Git' or 'svn' using the ipr.vcs setting.

h5. Example

{% highlight ruby %}
define "foo" do
  ipr.vcs = 'Git'
end
{% endhighlight %}

h4. Adding main, test or exclude paths to the .iml file

The extension allows you to add source paths, test source paths or add paths to the excluded set by modifying the "iml.main_source_directories", "iml.test_source_directories" or "iml.excluded_directories" settings respectively. This is only needed when the defaults inherited from project.compile or project.test are not sufficient.

h5. Example

{% highlight ruby %}
define "foo" do
  # Add path for generated resources to .iml file
  iml.main_source_directories << _("generated/main/resources")

  # Add path for generated test resources to .iml file
  iml.test_source_directories << _("generated/test/resources")

  # Exclude the temp directory created during testing
  iml.excluded_directories << _("tmp")

  ...
end
{% endhighlight %}

h4. Adding main or test dependencies to the .iml file

The extension allows you to add main or test dependencies by modifying the "iml.main_dependencies" or "iml.test_dependencies" settings respectively. This is only needed when the defaults inherited from project.compile or project.test are not sufficient. Note: These dependencies are not included on compile path when running buildr.

h5. Example

{% highlight ruby %}
define "foo" do
  # Add idea specific jar dependency to .iml file
  iml.main_dependencies << 'group:id:jar:1.0'

  # Add idea specific test jar dependency to .iml file
  iml.test_dependencies << 'group:id:jar:1.0'
  ...
end
{% endhighlight %}

h4. Dependency generation

A file dependency that exists in the local maven 2 repository is stored in the IML file relative to the @$MAVEN_REPOSITORY$@ environment variable (that defaults to @~/.m2/repository@). The user can override the environment variable by setting the "iml.local_repository_env_override" setting. If the dependency does not exist in to maven repository or the "iml.local_repository_env_override" setting is set to nil, then the path stored in the IML is relative to the IML file.

h5. Example: Setting local_repository_env_override

{% highlight ruby %}
define "foo" do
  iml.local_repository_env_override = nil
  compile.with 'group:id:jar:1.0'
end
{% endhighlight %}

Will generate a dependency with a path like:

<pre>
jar:///home/peter/.m2/repository/group/id/1.0/id-1.0.jar!/
</pre>

rather than the default

<pre>
jar://$MAVEN_REPOSITORY$/group/id/1.0/id-1.0.jar!/
</pre>

h5. Example: A dependency outside the maven repository

{% highlight ruby %}
define "foo" do
  compile.with _("foos-dep.jar")
end
{% endhighlight %}

Will generate a dependency with a path like:

<pre>
jar://$MODULE_DIR$/foo-dep.jar!/
</pre>

h4. Module Facets

Facets are IDEAs mechanism for adding support for languages, tools and frameworks other than core java. A facet can be added to a project so that it can be deployed as a web application or a hibernate application. A facet can also be used t provide support for other languages such as ruby and scala. The extension makes it possible to generate @.iml@ with the appropriate facets via the "iml.add_facet" method. It should be noted that facets are NOT inherited by sub-projects.

h5. Example

This example adds the web facet to a project.

{% highlight ruby %}
define "foo" do
  iml.add_facet("Web","web") do |facet|
    facet.configuration do |conf|
      conf.descriptors do |desc|
        desc.deploymentDescriptor :name => 'web.xml',
          :url => "file://$MODULE_DIR$/src/main/webapp/WEB-INF/web.xml",
          :optional => "false", :version => "2.4"
      end
      conf.webroots do |webroots|
        webroots.root :url => "file://$MODULE_DIR$/src/main/webapp", :relative => "/"
      end
    end
  end
end
{% endhighlight %}

h4. Project Configurations

Configurations are IDEAs mechanism for running or debugging the project. Shared configurations are stored in the project file. The extension makes it possible to generate an @.ipr@ with specific configurations via the "ipr.add_configuration" method.

h5. Example

This example adds a configuration to invoke a GWT application.

{% highlight ruby %}
define "foo" do
  ...
  ipr.add_configuration("Run Contacts.html", "GWT.ConfigurationType", "GWT Configuration") do |xml|
    xml.module(:name => project.iml.id)
    xml.option(:name => "RUN_PAGE", :value => "Contacts.html")
    xml.option(:name => "compilerParameters", :value => "-draftCompile -localWorkers 2")
    xml.option(:name => "compilerMaxHeapSize", :value => "512")

    xml.RunnerSettings(:RunnerId => "Run")
    xml.ConfigurationWrapper(:RunnerId => "Run")
    xml.method()
  end
end
{% endhighlight %}

h4. Project Artifacts

IDEA can build artifacts such as jars and wars. The artifact configuration is stored in the project file. The extension makes it possible to generate an @.ipr@ with specific artifacts via the "ipr.add_artifact" method.

h5. Example

This example adds a jar artifact to the project.

{% highlight ruby %}
define "foo" do
  ...
  ipr.add_artifact("MyFancy.jar", "jar") do |xml|
    xml.tag!('output-path', project._(:artifacts, "MyFancy.jar"))
    xml.element :id => "module-output", :name => "foo"
  end
end
{% endhighlight %}

h4. Custom Component Sections

If the extension does not provide capability to generate configuration for a particular IDEA plugin the user can provide their own configuration data via the "ipr.add_component" or "iml.add_component" methods.

h5. Example: Adding .ipr specific component

This example changes the compiler configuration for project.

{% highlight ruby %}
define "foo" do
  ipr.add_component("CompilerConfiguration") do |component|
    component.option :name => 'DEFAULT_COMPILER', :value => 'Javac'
    component.option :name => 'DEPLOY_AFTER_MAKE', :value => '0'
    component.resourceExtensions do |xml|
      xml.entry :name => '.+\.nonexistent'
    end
    component.wildcardResourceExtensions do |xml|
      xml.entry :name => '?*.nonexistent'
    end
  end
end
{% endhighlight %}

h5. Example: Adding .iml specific component

This example adds the web facet to a project. Note: This overrides the facets defined by the "iml.add_facet" method.

{% highlight ruby %}
define "foo" do
  iml.add_component("FacetManager") do |component|
    component.facet :type => 'web', :name => 'Web' do |facet|
      facet.configuration do |conf|
        conf.descriptors do |desc|
          desc.deploymentDescriptor :name => 'web.xml',
            :url => "file://$MODULE_DIR$/src/main/webapp/WEB-INF/web.xml",
            :optional => "false", :version => "2.4"
        end
        conf.webroots do |webroots|
          webroots.root :url => "file://$MODULE_DIR$/src/main/webapp", :relative => "/"
        end
      end
    end
  end
end
{% endhighlight %}

h4. Templates

The underlying project files are xml the contain elements for a number of "components". The extension will load any existing project files and replace or add any component elements that are generated by the extension. The extension also allows the user to specify a template with either "ipr.template" or "iml.template" settings. If a template is specified it will be loaded and any component elements in these documents will be merged into the base document prior to merging in generated sections. Templates are useful if you want to enforce certain configuration options (i.e. project specific code style).

h5. Example

{% highlight ruby %}
define "foo" do
  ipr.template = 'project.ipr.template'
  iml.template = 'module.iml.template'
end
{% endhighlight %}

h4. Groups

IDEA provides the facility to organise modules into groups. By default the extension does not do this but it can be enabled by "iml.group" setting. If that setting is set to true then the @.iml@ file will be placed in a group based on the parent projects name. If the setting is a string then that is used as the name of the group.

h5. Example

{% highlight ruby %}
define "foo" do
  iml.group = true
  define 'bar' do
    define 'baz'
  end
  define 'rab' do
    iml.group = "MyGroup"
  end
end
{% endhighlight %}

Will place the generated .imls in the following groups:

<pre>
foo.iml                => ''
bar/bar.iml            => 'foo'
bar/baz/baz.iml        => 'foo/bar'
rab/rab.iml            => 'MyGroup'
</pre>

h4. Add Extra .iml files to .ipr

The 'ipr.extra_modules' setting makes it possible to add extra modules to the generated iml file. The setting is an array of file names relative to the base project directory.

h5. Example

{% highlight ruby %}
define "foo" do
  ipr.extra_modules << 'other.iml'
  ipr.extra_modules << 'other_other.iml'
end
{% endhighlight %}

Will add the 'other.iml' and 'other_other.iml' files to the @.ipr@ project files.

h4. Buildr plugin for IDEA

Also, check out the "Buildr plugin for IDEA":http://www.digitalsanctum.com/buildr-plug-in/ (IDEA 7 and later).  Once installed, open your project with IDEA.  If IDEA finds that you have Buildr installed and finds a buildfile in the project's directory, it will show all the tasks available for that project.  To run a task, double-click it.  When the task completes, IDEA will show the results in the Buildr Output window.

h2(#cobertura_emma). Cobertura, Emma

You can use "Cobertura":http://cobertura.sourceforge.net/ or "Emma":http://emma.sourceforge.net/ to instrument your code, run the tests and create a test coverage report in either HTML or XML format.

There are two main tasks for each tool, both of which generate a test coverage report in the @reports/cobertura@ (respectively @reports/emma@) directory.  For example:

{% highlight sh %}
$ buildr test cobertura:html
{% endhighlight %}

As you can guess, the other tasks are @cobertura:xml@, @emma:html@ and @emma:xml@.

If you want to generate a test coverage report only for a specific project, you can do so by using the project name as prefix to the tasks.

{% highlight sh %}
$ buildr subModule:cobertura:html
{% endhighlight %}

Each project can specify which classes to include or exclude from cobertura instrumentation by giving a class-name regexp to the @cobertura.include@ or @cobertura.exclude@ methods:

{% highlight ruby %}
define 'someModule' do
  cobertura.include 'some.package.==*=='
  cobertura.include /some.(foo|bar).==*==/
  cobertura.exclude 'some.foo.util.SimpleUtil'
  cobertura.exclude /==*==.Const(ants)?/i
end
{% endhighlight %}

Emma has @include@ and @exclude@ methods too, but they take glob patterns instead of regexps.

Cobertura also provides a @cobertura:check@ task.  This task is intended to be used as a dependency for other tasks (such as @deploy@) which might wish to fail if coverage is unacceptable.  The respective thresholds for task failure may be defined using the @cobertura.check@ configuration namespace.  For example:

{% highlight ruby %}
define 'someModule' do
  cobertura.check.branch_rate = 75
  cobertura.check.line_rate = 100
  cobertura.check.total_line_rate = 98

  task(:deploy).enhance 'cobertura:check'
end
{% endhighlight %}

The @cobertura:check@ task supports all of the configuration parameters allowed by the @cobertura-check@ Ant task (as "documented here":http://cobertura.sourceforge.net/anttaskreference.html).  Configuration parameters are "Ruby-ized" (as demonstrated in the example above).

We want Buildr to load fast, and not everyone cares for these tasks, so we don't include them by default.  If you want to use one of them, you need to require it explicitly.  The proper way to do it in Ruby:

{% highlight ruby %}
require 'buildr/java/cobertura'
require 'buildr/java/emma'
{% endhighlight %}

You may want to add those to the Buildfile.  Alternatively, you can use these tasks for all your projects without modifying the Buildfile.  One convenient method is to add these lines to the @buildr.rb@ file in the @.buildr@ directory under your home directory.

Another option is to require it from the command line (@--require@ or @-r@), for example:

{% highlight sh %}
$ buildr -rbuildr/java/cobertura cobertura:html
{% endhighlight %}

h2(#checkstyle). Checkstyle

Checkstyle is integrated into Buildr through an extension. The extension adds the "checkstyle:xml" task that generates an xml report listing checkstyle violations and a "checkstyle:html" task to generate the html variant. A typical project that uses the extension may look something like;

{% highlight ruby %}
require 'buildr/checkstyle'

define "foo" do
  project.version = "1.0.0"

  define "bar" do ... end

  checkstyle.config_directory = _('etc/checkstyle')
  checkstyle.source_paths << project('bar')._(:source, :main, :java)
  checkstyle.extra_dependencies << :javax_servlet

end
{% endhighlight %}

By default checkstyle will look for all configuration files in the src/main/etc/checkstyle directory but this can be overriden by the setting the "checkstyle.config_directory" parameter. The "checkstyle:xml" task will be defined if the checkstyle rules file is found. The rules file is typically named "checks.xml" but can be overridden by setting the "checkstyle.configuration_file" parameter. If a suppressions file or import control file is included in the directory, these will also be used by the extension. These names of these files will default to "suppressions.xml" and "import-control.xml" but these can be overriden by the parameters "checkstyle.suppressions_file" and "checkstyle.import_control_file".

The extension will include the source and test directories of the project aswell as the compile and test dependencies when invoking the checkstyle tool. These can be added to by the parameters "checkstyle.source_paths" and "checkstyle.extra_dependencies" as appropriate.

If the xsl file named "checkstyle-report.xsl" is present in the configuration directory then it will be used to generate the html report, otherwise a xsl file that comes with buildr will be used. The name of the xsl file can be overridden by the parameter "checkstyle.style_file".

h2(#findbugs). FindBugs

FindBugs is integrated into Buildr through an extension. The extension adds the "findbugs:xml" task that generates an xml report listing findbugs violations and may add a "findbugs:html" task if an appropriate xsl is present. A typical project that uses the extension may look something like;

{% highlight ruby %}
require 'buildr/findbugs'

define "foo" do
  project.version = "1.0.0"

  define "bar" do ... end

  findbugs.config_directory = _('etc/findbugs')
  findbugs.source_paths << project('bar')._(:source, :main, :java)
  findbugs.analyze_paths << project('bar').compile.target
  findbugs.extra_dependencies << project('bar').compile.dependencies

end
{% endhighlight %}

By default findbugs will look for all configuration files in the src/main/etc/findbugs directory but this can be overriden by the setting the "findbugs.config_directory" parameter. The "findbugs:xml" task will past FindBugs a filter xml if a file named "filter.xml" is present in the configuration directory. This can be overridden by setting the "findbugs.filter_file" parameter.

The extension will include the source and test directories of the project aswell as the compile and test dependencies when invoking the findbugs tool. These can be added to by the parameters "findbugs.source_paths" and "findbugs.extra_dependencies" as appropriate. The actual analysis is run across compiled artifacts ad this will default to the target directory of the project but this can be overriden by the "findbugs.analyze_paths" parameter.

If the xsl file named "findbugs-report.xsl" is present in the configuration directory then a "findbugs:html" task will be defined. The name of the xsl file can be overridden by the parameter "findbugs.style_file".

h2(#javancss). JavaNCSS

JavaNCSS is integrated into Buildr through an extension. The extension adds the "javancss:xml" task that generates an xml report and may add a "javancss:html" task if an appropriate xsl is present. A typical project that uses the extension may look something like;

{% highlight ruby %}
require 'buildr/javancss'

define "foo" do
  project.version = "1.0.0"

  define "bar" do ... end

  javancss.enabled = true
  javancss.config_directory = _('etc/javancss')
  javancss.source_paths << project('bar')._(:source, :main, :java)

end
{% endhighlight %}

The extension will include the source and test directories of the project when invoking the javancss tool. These can be added to by the parameters "javancss.source_paths".

By default javancss will look for all configuration files in the src/main/etc/javancss directory but this can be overriden by the setting the "javancss.config_directory" parameter. The "javancss:xml" task will be defined if the "javancss.enabled" property is set to true. If the xsl file named "javancss2html.xsl" is present in the configuration directory then a "javancss:html" task will be defined. The name of the xsl file can be overridden by the parameter "javancss.style_file".

h2(#jdepend). JDepend

"JDepend":http://clarkware.com/software/JDepend.html is integrated into Buildr through an extension. The extension adds the "jdepend:xml" task that generates an xml report, "jdepend:swing" that shows a Swing UI, and may add a "jdepend:html" task if an appropriate xsl is present. A typical project that uses the extension may look something like;

{% highlight ruby %}
require 'buildr/jdepend'

define "foo" do
  project.version = "1.0.0"

  define "bar" do ... end

  jdepend.enabled = true
  jdepend.config_directory = _('etc/jdepend')
  jdepend.target_paths << project('bar').compile.target

end
{% endhighlight %}

The extension will include the compiled source and test directories of the project when invoking the JDepend tool. These can be added to by the parameters "jdepend.target_paths".

By default JDepend will look for all configuration files in the src/main/etc/jdepend directory but this can be overriden by the setting the "jdepend.config_directory" parameter. The "jdepend:xml" and "jdepend:swing" task will be defined if the "jdepend.enabled" property is set to true. If a "jdepend.properties" is included in the configuration directory then jdepend will load it during the analysis. If the xsl file named "jdepend.xsl" is present in the configuration directory then a "jdepend:html" task will be defined. The name of the xsl file can be overridden by the parameter "jdepend.style_file".

h2(#pmd). PMD

PMD is integrated into Buildr through an extension. The extension adds the "pmd:rule:xml" and "pmd:rule:html" tasks. A typical project that uses the extension may look something like;


{% highlight ruby %}
require 'buildr/javancss'

define "foo" do
  project.version = "1.0.0"

  define "bar" do ... end

  pmd.enabled = true
  pmd.rule_set_paths = _('etc/pmd') + "/"
  pmd.source_paths << project('bar')._(:source, :main, :java)
  pmd.rule_set_files = ['basic','imports','unusedcode','logging-java','finalizers']

end
{% endhighlight %}

The "pmd:rule:xml" task will be defined if the "pmd.enabled" property is set to true.

The extension will include the source and test directories of the project when invoking the pmd tool. These can be added to by the parameters "pmd.source_paths".

By default the pmd rule files 'basic','imports' and 'unusedcode' will be evaluated but this can be overriden by the "pmd.rule_set_files" parameter. The rule sets will be loaded from the classpath and this can be added to by modifying the "pmd.rule_set_paths" parameter.

h2(#sonar). Sonar

"Sonar":http://www.sonarsource.org/ is "an open platform to manage code quality". It is integrated into Buildr through an extension. The extension adds the "sonar" task. A typical project that uses the extension may look something like;

{% highlight ruby %}
require 'buildr/sonar'

define "foo" do
  project.version = "1.0.0"

  define "bar" do ... end

  sonar.enabled = true
  sonar.project_name = 'Foo-Project'
  sonar.key = 'foo:project'
  sonar.jdbc_url = 'jdbc:jtds:sqlserver://example.org/SONAR;instance=MyInstance;SelectMethod=Cursor'
  sonar.jdbc_driver_class_name = 'net.sourceforge.jtds.jdbc.Driver'
  sonar.jdbc_username = 'sonar'
  sonar.jdbc_password = 'secret'
  sonar.host_url = 'http://127.0.0.1:9000'
  sonar.sources << project('foo:bar')._(:source, :main, :java)
  sonar.binaries << project('foo:bar').compile.target
  sonar.libraries << project('foo:bar').compile.dependencies

end
{% endhighlight %}

The "sonar" task will be defined if the "sonar.enabled" property is set to true.

Defaults exist for the "project_name", "key", "sources", "binaries" and "libraries" parameters but the others should be set explicitly. The extension will include the source and test directories of the project as sources by default, the target directory as a binary and the dependencies as libraries.

h2(#jaxb_xjc). JAXB Xjc Compiler

Buildr includes an extension that provides the ability to invoke jaxb xjc binding compiler. A typical project that uses the extension may look something like;

{% highlight ruby %}
require 'buildr/jaxb_xjc'

define "foo" do
  project.version = "1.0.0"
  compile.from compile_jaxb(_('src/schemas/wildfire-1.3.xsd'),
                            "-quiet",
                            :package => "org.foo.api")
  package :jar
end
{% endhighlight %}

The method compile_jaxb accepts either an array of files or a single file as the first parameter. It then accepts 0 or more arguments that are passed to the underlying XJC compiler. The arguments are documented on the "jaxb site":https://jaxb.dev.java.net/nonav/2.2.1/docs/xjc.html. If the last argument is an options hash then the extension handles the options hash specially. The supported options include:

* <tt>:directory</tt>: The directory to which source is generated. Defaults to <tt>_(:target, :generated, :jaxb)</tt>
* <tt>:keep_content</tt>: By default the generated directory will be deleted. If <tt>true</tt> is specified for this parameter the directory will not be deleted.
* <tt>:package</tt>: The package in which the source is generated.

h2(#css_lint). CssLint

"CssLint":https://github.com/CSSLint/csslint is integrated into Buildr through an extension. The extension adds the "css_lint:xml" task to generate an xml report listing css lint violations and a "css_lint:html" task for a html variant of the same data. It is expected that a project that makes use of css linting will have installed the csslint using node. A typical project that uses the extension may look something like;

{% highlight ruby %}
require 'buildr/css_lint'

define "foo" do
  project.version = "1.0.0"

  define "bar" do ... end

  css_lint.source_paths.concat([some_generated_dir])
  css_lint.ignore.concat(%w(box-sizing font-sizes adjoining-classes))
end
{% endhighlight %}

By default css_lint will look for the xsl file in the src/main/etc/css_lint directory but this can be overriden by the setting the "css_lint.config_directory" parameter. The "css_lint:xml" task will be defined if the source_paths is not empty. The rules can be passed to the task using the 'ignores', 'errors' and 'warnings' parameters.

The extension will lint the css files in the "_(:source, :main, :webapp, :css)" directory by default. The set of source directories linted can be controlled by the "css_lint.source_paths" parameter.

If the xsl file named "css_lint-report.xsl" is present in the configuration directory then that will be used in the "css_lint:html" task otherwise a default xsl included with buildr will be used. The name of the xsl file can be overridden by the parameter "css_lint.style_file".

h2(#scss_lint). ScssLint

"ScssLint":https://github.com/causes/scss-lint is integrated into Buildr through an extension. The extension adds the "scss_lint:xml" task to generate an xml report listing scss lint violations and a "scss_lint:html" task for a html variant of the same data. A buildr project that makes uses of the extension is expected to have added 'scss_lint' gem to the projects Gemfile by adding a line such as;

{% highlight ruby %}
gem 'scss-lint', '= 0.24.0'
{% endhighlight %}

A typical project that uses the extension may look something like;

{% highlight ruby %}
require 'buildr/scss_lint'

define "foo" do
  project.version = "1.0.0"

  define "bar" do ... end

  scss_lint.configuration_file = _('etc/scss_lint/checks.yml')
  scss_lint.source_paths << project('web')._(:source, :main, :webapp, 'sass')
  scss_lint.file_excludes = FileList["#{project('web')._(:source, :main, :webapp, 'sass')}/vendor/**/*"]
end
{% endhighlight %}

By default scss_lint will look for all configuration files in the src/main/etc/scss_lint directory but this can be overriden by the setting the "scss_lint.config_directory" parameter. The "scss_lint:xml" task will be defined if the scss_lint rules file is found. The rules file is named "checks.yml" by default but can be overridden by setting the "scss_lint.configuration_file" parameter.

The extension will lint the sass files in the "_(:source, :main, :webapp, :sass)" directory by default. The set of source directories linted can be controlled by the "scss_lint.source_paths" parameter.

If the xsl file named "scss_lint-report.xsl" is present in the configuration directory then that will be used in the "scss_lint:html" task otherwise a default xsl included with buildr will be used. The name of the xsl file can be overridden by the parameter "scss_lint.style_file".

h2(#anything_ruby). Anything Ruby Can Do

Buildr is Ruby code.  That's an implementation detail for some, but a useful features for others.  You can use Ruby to keep your build scripts simple and DRY, tackle ad hoc tasks and write reusable features without the complexity of "plugins".

We already showed you one example where Ruby could help.  You can use Ruby to manage dependency by setting constants and reusing them, grouping related dependencies into arrays and structures.

You can use Ruby to perform ad hoc tasks.  For example, Buildr doesn't have any pre-canned task for setting file permissions.  But Ruby has a method for that, so it's just a matter of writing a task:

{% highlight ruby %}
bins = file('target/bin'=>FileList[_('src/main/dist/bin/==*==')]) do |task|
  mkpath task.name
  cp task.prerequisites, task.name
  chmod 0755, FileList[task.name + '/==*==.sh'], :verbose=>false
end
{% endhighlight %}

You can use functions to keep your code simple.  For example, in the ODE project we create two binary distributions, both of which contain a common set of files, and one additional file unique to each distribution.  We use a method to define the common distribution:

{% highlight ruby %}
def distro(project, id)
  project.package(:zip, :id=>id).path("#{id}-#{version}").tap do |zip|
    zip.include meta_inf + ['RELEASE_NOTES', 'README'].map { |f| path_to(f) }
    zip.path('examples').include project.path_to('src/examples'), :as=>'.'
    zip.merge project('ode:tools-bin').package(:zip)
    zip.path('lib').include artifacts(COMMONS.logging, COMMONS.codec,
      COMMONS.httpclient, COMMONS.pool, COMMONS.collections, JAXEN, SAXON,
      LOG4J, WSDL4J, XALAN, XERCES)
    project('ode').projects('utils', 'tools', 'bpel-compiler', 'bpel-api',
      'bpel-obj', 'bpel-schemas').map(&:packages).flatten.each do |pkg|
        zip.include(pkg.to_s, :as=>"#{pkg.id}.#{pkg.type}", :path=>'lib')
      end
    yield zip
  end
end
{% endhighlight %}

And then use it in the project definition:

{% highlight ruby %}
define 'distro-axis2' do
  parent.distro(self, "#{parent.id}-war") { |zip|
    zip.include project('ode:axis2-war').package(:war), :as=>'ode.war' }
end
{% endhighlight %}

Ruby's functional style and blocks make some task extremely easy.  For example, let's say we wanted to count how many source files we have, and total number of lines:

{% highlight ruby %}
sources = projects.map { |prj| prj.compile.sources.
  map { |src| FileList["#{src}/**/*.java"] } }.flatten
puts "There are #{source.size} source files"
lines = sources.inject(0) { |lines, src| lines += File.readlines(src).size }
puts "That contain #{lines} lines"
{% endhighlight %}
