---
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_apache2_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>

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 %}
