---
layout: default
title: Packaging
---

For our next trick, we're going to try and create an artifact ourselves.  We're going to start with:

{% highlight ruby %}
package :jar
{% endhighlight %}

We just told the project to create a JAR file in the @target@ directory, including all the classes (and resources) that we previously compiled into @target/classes@.  Or we can create a WAR file:

{% highlight ruby %}
package :war
{% endhighlight %}

The easy case is always easy, but sometimes we have more complicated use cases which we'll address through the rest of this section.

Now let's run the build, test cases and create these packages:

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

The @package@ task runs the @build@ task (remember: @compile@ and @test@) and then runs each of the packaging tasks, creating packages in the projects' target directories.

p(tip). The @package@ task and @package@ methods are related, but that relation is different from other task/method pairs.  The @package@ method creates a file task that points to the package in the @target@ directory and knows how to create it.  It then adds itself as a prerequisite to the @package@ task. Translation: you can create multiple packages from the same project.


h2(#referencing). Specifying And Referencing Packages

Buildr supports several packaging types, and so when dealing with packages, you have to indicate the desired package type.  The packaging type can be the first argument, or the value of the @:type@ argument.  The following two are equivalent:

{% highlight ruby %}
package :jar
package :type=>:jar
{% endhighlight %}

If you do not specify a package type, Buildr will attempt to infer one.

In the documentation you will find a number of tasks dealing with specific packaging types (@ZipTask@, @JarTask@, etc).  The @package@ method is a convenience mechanism that sets up the package for you associates it with various project life cycle tasks.

To package a particular file, use the @:file@ argument, for example:

{% highlight ruby %}
package :zip, :file=>_('target/interesting.zip')
{% endhighlight %}

This returns a file task that will run as part of the project's @package@ task (generating all packages).  It will invoke the @build@ task to generate any necessary prerequisites, before creating the specified file.

The package type does not have to be the same as the file name extension, but if you don't specify the package type, it will be inferred from the extension.

Most often you will want to use the second form to generate packages that are also artifacts.  These packages have an artifact specification, which you can use to reference them from other projects (and buildfiles).  They are also easier to share across projects: artifacts install themselves in the local repository when running the @install@ task, and upload to the remote repository when running the @upload@ task (see "Installing and Uploading":#install_upload).

The artifact specification is based on the project name (using dashes instead of colons), group identifier and version number, all three obtained from the project definition.  You can specify different values using the @:id@, @:group@, @:version@ and @:classifier@ arguments.  For example:

{% highlight ruby %}
define 'killer-app', :version=>'1.0' do
  # Generates silly-1.0.jar
  package :jar, :id=>'silly'

  # Generates killer-app-la-web-1.x.war
  project 'la-web' do
    package :war, :version=>'1.x'
  end

  # Generates killer-app-the-api-1.0-sources.zip
  project 'teh-api' do
    package :zip, :classifier=>'sources'
  end
end
{% endhighlight %}

The file name is determined from the identifier, version number, classifier and extension associated with that packaging type.

If you do not specify the packaging type, Buildr attempt to infer it from the project definition.  In the general case it will use the default packaging type, ZIP.  A project that compiles Java classes will default to JAR packaging; for other languages, consult the specific documentation.

A single project can create multiple packages.  For example, a Java project may generate a JAR package for the runtime library and another JAR containing just the API; a ZIP file for the source code and another ZIP for the documentation. Make sure to always call @package@ with enough information to identify the specific package you are referencing.  Even if the project only defines a single package, calling the @package@ method with no arguments does not necessarily refer to that one.

You can use the @packages@ method to obtain a list of all packages defined in the project, for example:

{% highlight ruby %}
project('killer-app:teh-impl').packages.first
project('killer-app:teh-impl').packages.select { |pkg| pkg.type == :zip }
{% endhighlight %}


h2(#zip). Packaging ZIPs

ZIP is the most common form of packaging, used by default when no other packaging type applies.  It also forms the basis for many other packaging types (e.g. JAR and WAR).  Most of what you'll find here applies to other packaging types.

Let's start by including additional files in the ZIP package.  We're going to include the @target/docs@ directory and @README@ file:

{% highlight ruby %}
package(:zip).include _('target/docs'), 'README'
{% endhighlight %}

The @include@ method accepts files, directories and file tasks.  You can also use file pattern to match multiple files and directories.  File patterns include asterisk (@*@) to match any file name or part of a file name, double asterisk (@**@) to match directories recursively, question mark (@?@) to match any character, square braces (@[]@) to match a set of characters, and curly braces (@{}@) to match one of several names.

And the same way you @include@, you can also @exclude@ specific files you don't want showing up in the ZIP.  For example, to exclude @.draft@ and @.raw@ files:

{% highlight ruby %}
package(:zip).include(_('target/docs')).exclude('*.draft', '*.raw')
{% endhighlight %}

So far we've included files under the root of the ZIP.  Let's include some files under a given path using the @:path@ option:

{% highlight ruby %}
package(:zip).include _('target/docs'), :path=>"#{id}-#{version}"
{% endhighlight %}

If you need to use the @:path@ option repeatedly, consider using the @tap@ method instead.  For example:

{% highlight ruby %}
package(:zip).path("#{id}-#{version}").tap do |path|
  path.include _('target/docs')
  path.include _('README')
end
{% endhighlight %}

p(tip). The @tap@ method is not part of the core library, but a very useful extension.  It takes an object, yields to the block with that object, and then returns that object.

p(note). To allow you to spread files across different paths, the include/exclude patterns are specific to a path.  So in the above example, if you want to exclude some files from the "target/docs" directory, make sure to call @exclude@ on the path, not on the ZIP task itself.

If you need to include a file or directory under a different name, use the @:as@ option.  For example:

{% highlight ruby %}
package(:zip).include(_('corporate-logo-350x240.png'), :as=>'logo.png')
{% endhighlight %}

You can also use @:as=>'.'@ to include all files from the given directory.  For example:

{% highlight ruby %}
package(:zip).include _('target/docs/*')
package(:zip).include _('target/docs'), :as=>'.'
{% endhighlight %}

These two perform identically.  They both include all the files from the @target/docs@ directory, but not the directory itself, and they are both lazy, meaning that the files can be created later and they will still get packaged into the zip package.

For example, when you use @package :jar@, under the hood it specifies to include all the files from @target/classes@ with @:as=>'.'@.  Even though this happens during project definition and nothing has been compiled yet (and in fact @target/classes@ may not even exist yet), the .class files generated during compilation are still packaged in the .jar file, as expected.

If you need to get rid of all the included files, call the @clean@ method. Some packaging types default to adding various files and directories, for example, JAR packaging will include all the compiled classes and resources.

h2(#merging). Merging archives

You can also merge two ZIP files together, expanding the content of one ZIP into the other.  For example:

{% highlight ruby %}
package(:zip).merge _('part1.zip'), _('part2.zip')
{% endhighlight %}

If you need to be more selective, you can apply the include/exclude pattern to the expanded ZIP.  For example:

{% highlight ruby %}
# Everything but the libs
package(:zip).merge(_('bigbad.war')).exclude('libs/**/*')
{% endhighlight %}

h3(#transforming). Transforming files while merging them

You may need to have special treatment for files that you are merging from multiple locations.

If you wish to concatenate the file contents, you can perform the following:

{% highlight ruby %}
package(:zip).merge(_('part1.zip'), _('part2.zip')).concatenate('META-INF/services/spring.providers')
{% endhighlight %}

If you need to transform the file contents to assemble the final output, you can work with the @transform@ method.
The transform method takes a block to process the contents of all the matching paths, as the zip file is assembled.

{% highlight ruby %}
package(:zip).merge(_('part1.zip'), _('part2.zip')).transform('plugin.xml') do |plugin_xml_files|
  return "<plugin>#{plugin_xml_files.map {|xml| xml.match('<plugin>(.*)</plugin>')[1]}}</plugin>"
end
{% endhighlight %}


h2(#jar). Packaging JARs

JAR packages extend ZIP packages with support for Manifest files and the META-INF directory.  They also default to include the class files found in the @target/classes@ directory.

You can tell the JAR package to include a particular Manifest file:

{% highlight ruby %}
package(:jar).with :manifest=>_('src/main/MANIFEST.MF')
{% endhighlight %}

Or generate a manifest from a hash:

{% highlight ruby %}
package(:jar).with :manifest=>{ 'Copyright'=>'Acme Inc (C) 2007' }
{% endhighlight %}

You can also generate a JAR with no manifest with the value @false@, create a manifest with several sections using an array of hashes, or create it from a proc.

In large projects, where all the packages use the same manifest, it's easier to set it once on the top project using the @manifest@ project property. Sub-projects inherit the property from their parents, and the @package@ method uses that property if you don't override it, as we do above.

For example, we can get the same result by specifying this at the top project:

{% highlight ruby %}
manifest['Copyright'] = 'Acme Inc (C) 2007'
{% endhighlight %}

If you need to mix-in the project's manifest with values that only one package uses, you can do so easily:

{% highlight ruby %}
package(:jar).with :manifest=>manifest.merge('Main-Class'=>'com.acme.Main')
{% endhighlight %}

If you need to include more files in the @META-INF@ directory, you can use the @:meta_inf@ option.  You can give it a file, or array of files.  And yes, there is a @meta_inf@ project property you can set once to include the same set of file in all the JARs.  It works like this:

{% highlight ruby %}
meta_inf << file('DISCLAIMER') << file('NOTICE')
{% endhighlight %}

If you have a @LICENSE@ file, it's already included in the @meta_inf@ list of files.

Other than that, @package :jar@ includes the contents of the compiler's target directory and resources, which most often is exactly what you intend it to do. If you want to include other files in the JAR, instead or in addition, you can do so using the @include@ and @exclude@ methods.  If you do not want the target directory included in your JAR, simply call the @clean@ method on it:

{% highlight ruby %}
package(:jar).clean.include( only_these_files )
{% endhighlight %}


h2(#war). Packaging WARs

Pretty much everything you know about JARs works the same way for WARs, so let's just look at the differences.

Without much prompting, @package :war@ picks the contents of the @src/main/webapp@ directory and places it at the root of the WAR, copies the compiler target directory into the @WEB-INF/classes@ path, and copies any compiled dependencies into the @WEB-INF/libs@ paths.

Again, you can use the @include@ and @exclude@ methods to change the contents of the WAR.  There are two convenience options you can use to make the more common changes.  If you need to include a classes directory other than the default:

{% highlight ruby %}
package(:war).with :classes=>_('target/additional')
{% endhighlight %}

If you want to include a different set of libraries other than the default:

{% highlight ruby %}
package(:war).with :libs=>MYSQL_JDBC
{% endhighlight %}

Both options accept a single value or an array.  The @:classes@ option accepts the name of a directory containing class files, initially set to @compile.target@ and @resources.target@.  The @:libs@ option accepts artifact specifications, file names and tasks, initially set to include everything in @compile.dependencies@.

As you can guess, the package task has two attributes called @classes@ and @libs@; the @with@ method merely sets their value.  If you need more precise control over these arrays, you can always work with them directly, for example:

{% highlight ruby %}
# Add an artifact to the existing set:
package(:war).libs += artifacts(MYSQL_JDBC)
# Remove an artifact from the existing set:
package(:war).libs -= artifacts(LOG4J)
# List all the artifacts:
puts 'Artifacts included in WAR package:'
puts package(:war).libs.map(&:to_spec)
{% endhighlight %}

h3(#war_extra_assets). Compiling Assets

In modern web applications, it is common to use tools that compile and compress assets. i.e. "Coffeescript":http://coffeescript.org/ is compiled into javascript and "Sass":http://sass-lang.com/ compiles into CSS. Buildr provides support using a simple @assets@ abstraction. Directory or file tasks can be added to the @assets.paths@ configuration variable for a project and the contents will be included in the package.

h4(#coffeescript). Integrating CoffeeScript

{% highlight ruby %}
target_dir = _(:target, :generated, "coffee/main/webapp")
source_dir = _(:source, :main, :coffee)

assets.paths << file(target_dir => [FileList["#{source_dir}/**/*.coffee"]]) do
  puts "Compiling coffeescript"
  sh "coffee --bare --compile --output #{target_dir} #{source_dir}"
  touch target_dir
end
{% endhighlight %}

h4(#sass). Integrating Sass

{% highlight ruby %}
target_dir = _(:target, :generated, "sass/main/webapp")
source_dir = _(:source, :main, :sass)

assets.paths << file(target_dir => [FileList["#{source_dir}/**/*.scss"]]) do
  puts "Compiling scss"
  sh "scss -q --update #{source_dir}:#{target_dir}"
  touch target_dir
end
{% endhighlight %}

h2(#aar). Packaging AARs

Axis2 service archives are similar to JAR's (compiled classes go into the root of the archive) but they can embed additional libraries under /lib and include @services.xml@ and WSDL files.

{% highlight ruby %}
package(:aar).with(:libs=>'log4j:log4j:jar:1.1')
package(:aar).with(:services_xml=>_('target/services.xml'),
                   :wsdls=>_('target/*.wsdl'))
{% endhighlight %}

The @libs@ attribute is a list of .jar artifacts to be included in the archive under /lib.  The default is no artifacts; compile dependencies are not included by default.

The @services_xml@ attribute points to an Axis2 services configuration file called @services.xml@ that will be placed in the @META-INF@ directory inside the archive.  The default behavior is to point to the @services.xml@ file in the project's @src/main/axis2@ directory.  In the second example above we set it explicitly.

The @wsdls@ attribute is a collection of file names or glob patterns for WSDL files that get included in the @META-INF@ directory.  In the second example we include WSDL files from the @target@ directory, presumably created by an earlier build task.  In addition, AAR packaging will include all files ending with @.wsdl@ from the @src/main/axis2@ directory.

If you already have WSDL files in the @src/main/axis2@ directory but would like to perform some filtering, for example, to set the HTTP port number, consider ignoring the originals and including only the filtered files, for example:

{% highlight ruby %}
# Host name depends on environment.
host = ENV['ENV'] == 'test' ? 'test.host' : 'ws.example.com'
filter.from(_('src/main/axis2')).into(_(:target)).
  include('services.xml', '==*==.wsdl').using('http_port'=>'8080',
                                              'http_host'=>host)
package(:aar).wsdls.clear
package(:aar).with(:services_xml=>_('target/services.xml'),
                   :wsdls=>_('target/==*==.wsdl'))
{% endhighlight %}


h2(#ear).  Packaging EARs

EAR packaging is slightly different from JAR/WAR packaging.  It's main purpose is to package components together, and so it includes special methods for handling component inclusion that take care to update application.xml and the component's classpath.

EAR packages support four component types:

|_. Argument  |_. Component                     |
| @:war@      | J2EE Web Application (WAR).     |
| @:ejb@      | Enterprise Java Bean (JAR).     |
| @:jar@      | J2EE Application Client (JAR).  |
| @:lib@      | Shared library (JAR).           |

This example shows two ways for adding components built by other projects:

{% highlight ruby %}
package(:ear) << project('coolWebService').package(:war)
package(:ear).add project('commonLib') # By default, the JAR package
{% endhighlight %}

Adding a WAR package assumes it's a WAR component and treats it as such, but JAR packages can be any of three component types, so by default they are all treated as shared libraries.  If you want to add an EJB or Application Client component, you need to say so explicitly, either passing @:type=>package@, or by passing the component type in the @:type@ option.

Here are three examples:

{% highlight ruby %}
# Assumed to be a shared library.
package(:ear).add 'org.springframework:spring:jar:2.6'
# Component type mapped to package.
package(:ear).add :ejb=>project('beanery')
# Adding component with specific package type.
package(:ear).add project('client'), :type=>:jar
{% endhighlight %}

By default, WAR components are all added under the @/war@ path, and likewise, EJB components are added under the @/ejb@ path, shared libraries under @/lib@ and Application Client components under @/jar@.

If you want to place components in different locations you can do so using the @:path@ option, or by specifying a different mapping between component types and their destination directory.  The following two examples are equivalent:

{% highlight ruby %}
# Specify once per component.
package(:ear).add project('coolWebService').package(:war), :path=>'coolServices'
# Configure once and apply to all added components.
package(:ear).dirs[:war] = 'coolServices'
package(:ear) << project('coolWebService').package(:war)
{% endhighlight %}

EAR packages include an @application.xml@ file in the @META-INF@ directory that describes the application and its components.  This file is created for you during packaging, by referencing all the components added to the EAR.  There are a couple of things you will typically want to change.

* *display-name* -- The application's display name defaults to the project's identifier.  You can change that by setting the @display_name@ attribute.

* *description* -- The application's description defaults to the project's comment.  You can change that by setting the @description@ attribute.

* *context-root* -- WAR components specify a context root, based on the package identifier, for example, "cool-web-1.0.war" will have the context root "cool-web".  To specify a different context root, add the WAR package with the @context_root@ option.

Again, by example:

{% highlight ruby %}
package(:ear).display_name = 'MyCoolWebService'
package(:ear).description = 'MyCoolWebService: Making coolness kool again'
package(:ear).add project('coolWebService').package(:war), :context_root=>'coolness'
{% endhighlight %}

If you need to disable the context root (e.g. for Portlets), set @context_root@ to @false@.

It is also possible to add @security-role@ tags to the @application.xml@ file by appending a hash with @:id@, @:description@ and @:name@ to the @security_role@ array, like so:

{% highlight ruby %}
package(:ear).security_roles << {:id=>'SecurityRole_123',
		:description=>'Read only user', :name=>'coolUser'}
package(:ear).security_roles << {:id=>'SecurityRole_456',
		:description=>'Super user', :name=>'superCoolUser'}
{% endhighlight %}

h2(#bundle).  Packaging OSGi Bundles

OSGi bundles are jar files with additional metadata stored in the manifest. Buildr uses an external tool "Bnd":http://www.aqute.biz/Code/Bnd to create the package. Directives and properties can be explicitly passed to the build tool and buildr will provide reasonable defaults for properties that can be derived from the project model. Please see the bnd tool for documentation on the available properties.

The bundle packaging format is included as an addon so the build file must explicitly require the addon using using <code>require "buildr/bnd"</code> and must add a remote repository from which the bnd can be downloaded. A typical project that uses the bundle packaging addon may look something like;

{% highlight ruby %}
require "buildr/bnd"

repositories.remote << "http://central.maven.org/maven2"
# uncomment the next version to override the version of bnd
# Buildr::Bnd.version = '0.0.384'

define 'myProject' do
  ...
  package(:bundle).tap do |bnd|
    bnd['Import-Package'] = "*;resolution:=optional"
    bnd['Export-Package'] = "*;version=#{version}"
  end
  ...
end
{% endhighlight %}

The @[]@ method on the bundle package is used to provide directives to the bnd tool that are not inherited by sub-projects while the standard 'manifest' setting is used to define properties that inherited by sub-projects.

h3. Defaults

The addon sets the following bnd parameters;

* <tt>"Bundle-Version"</tt> defaults to the project version.
* <tt>"Bundle-SymbolicName"</tt> defaults to the concatenation of the project group and project id, replacing ':' characters with '.'.
* <tt>"Bundle-Name"</tt> defaults to the project description if present else the project name
* <tt>"Bundle-Description"</tt> defaults to the project description.
* <tt>"-classpath"</tt> is set to the compile target directory and any compile time dependencies.
* <tt>"Include-Resource"</tt> defaults to the dir project.resources.target if it exists.

h3. Parameters

h4. classpath_element

The user can also specify additional elements that are added to the classpath using the 'classpath_element' method. If the parameter to this element is a task, artifact, artifact namespace etc. then it will be resolved prior to invoking bnd.

{% highlight ruby %}
...
define 'foo' do
  ...
  package(:bundle).tap do |bnd|
    # This dependency will be added to classpath
    bnd.classpath_element 'someOtherExistingFile.zip'
    # All of these dependencies will be invoked and added to classpath
    bnd.classpath_element artifact('com.sun.messaging.mq:imq:jar:4.4')
    bnd.classpath_element project('bar') # Adds all the packages
    bnd.classpath_element 'org.apache.ant:ant:jar:1.8.0'
    bnd.classpath_element file('myLocalFile.jar')
    ...
  end

  project 'bar' do
    ...
  end
end
{% endhighlight %}

h4. classpath

The user can specify the complete classpath using the 'classpath' method. The classpath should be an array of elements. If the element is a task, artifact, artifact namespace etc. then it will be resolved prior to invoking bnd.

{% highlight ruby %}
...
define 'foo' do
  ...
  package(:bundle).tap do |bnd|
    bnd.classpath [ project.compile.target,
                    'someOtherExistingFile.zip',
                    artifact('com.sun.messaging.mq:imq:jar:4.4'),
                    project('bar'),
                    'org.apache.ant:ant:jar:1.8.0',
                    file('myLocalFile.jar') ]
    ...
  end

  project 'bar' do
    ...
  end
end
{% endhighlight %}

h3. Examples

h4. Including non-class resources in a bundle

Bnd can be used to include non-class resources in a bundle. The following example includes all resources in 'src/etc' into the bundle.

{% highlight ruby %}
define 'myproject' do
  ...
  package(:bundle).tap do |bnd|
    bnd['Include-Resource'] = project._('src/etc') + '/'
    ...
  end
end
{% endhighlight %}

h4. Using bnd to wrap an existing jar

Bnd can be used to wrap an existing jar as an OSGi bundle. The following example wraps the OpenMQ JMS provider as an OSGi bundle.

{% highlight ruby %}
...
# Add repository for OpenMQ
repositories.remote << 'http://download.java.net/maven/2'

desc 'OSGi bundle for OpenMQ JMS provider client library'
define 'com.sun.messaging.mq.imq' do
  project.version = '4.4'
  project.group = 'iris'
  package(:bundle).tap do |bnd|
    bnd['Import-Package'] = "*;resolution:=optional"
    bnd['Export-Package'] = "com.sun.messaging.*;version=#{version}"
    bnd.classpath_element 'com.sun.messaging.mq:imq:jar:4.4'
  end
end
{% endhighlight %}

h4. Create an OSGi bundle with an Activator

The following example presents a basic buildfile for building an OSGi bundle with an activator.

{% highlight ruby %}
...
# repository for OSGi core bundle
repositories.remote << 'https://repository.apache.org/content/repositories/releases'

desc 'Hello World bundle'
define 'helloworld' do
  project.version = '1.0'
  project.group = 'org.example'
  compile.with 'org.apache.felix:org.osgi.core:jar:1.4.0'
  package(:bundle).tap do |bnd|
    bnd['Export-Package'] = "org.example.helloworld.api.*;version=#{version}"
    bnd['Bundle-Activator'] = "org.example.helloworld.Activator"
  end
end
{% endhighlight %}

h4. Inheriting parameters for bnd tool

The following example shows how you can use 'manifest' to define a bnd parameter that is inherited by all child sub-projects. The "Bundle-License" defined in the top level project is passed to the bnd tool when generating both the 'fe' and 'fi' sub-projects but the 'fo' sub-project overrides this parameter with a local value.

{% highlight ruby %}
...
define 'myproject' do
  manifest['Bundle-License'] = "http://www.apache.org/licenses/LICENSE-2.0"
  ...
  define 'fe' do
    ...
    package(:bundle).tap do |bnd|
      ...
    end
  end

  define 'fi' do
    ...
    package(:bundle).tap do |bnd|
      ...
    end
  end

  define 'fo' do
    ...
    package(:bundle).tap do |bnd|
      bnd['Bundle-License'] = "http://www.apache.org/licenses/LICENSE-1.1"
    end
  end
end
{% endhighlight %}

h2(#tar).  Packaging Tars and GZipped Tars

Everything you know about working with ZIP files translates to Tar files, the two tasks are identical in more respect, so here we'll just go over the differences.

{% highlight ruby %}
package(:tar).include _('target/docs'), 'README'
package(:tgz).include _('target/docs'), 'README'
{% endhighlight %}

The first line creates a Tar archive with the extension @.tar@, the second creates a GZipped Tar archive with the extension @.tgz@.

In addition to packaging that includes the archive in the list of installed/released files, you can use the method @tar@ to create a @TarTask@. This task is similar to @ZipTask@, and introduces the @gzip@ attribute, which you can use to tell it whether to create a regular file, or GZip it.  By default the attribute it set to true (GZip) if the file name ends with either @.gz@ or @.tgz@.


h2(#install_upload). Installing and Uploading

You can bring in the artifacts you need from remote repositories and install them in the local repositories.  Other projects have the same expectation, that your packages be their artifacts.

So let's create these packages and install them in the local repository where other projects can access them:

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

If you changes your mind you can always:

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

That works between projects you build on the same machine.  Now let's share these artifacts with other developers through a remote repository:

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

Of course, you'll need to tell Buildr about the release server:

{% highlight ruby %}
repositories.release_to = 'sftp://john:secret@release/usr/share/repo'
{% endhighlight %}

If you have separate repositories for releases and snapshots, you can specify them accordingly. Buildr takes care of picking the correct one.

{% highlight ruby %}
repositories.release_to = 'sftp://john:secret@release/usr/share/repo/releases'
repositories.snapshot_to = 'sftp://john:secret@release/usr/share/repo/snapshots'
{% endhighlight %}


This example uses the SFTP protocol.  In addition, you can use the HTTP protocol -- Buildr supports HTTP and HTTPS, Basic Authentication and uploads using PUT -- or point to a directory on your file system.

The URL in this example contains the release server ("release"), path to repository ("user/share/repo") and username/password for access.  The way SFTP works, you specify the path on the release server, and give the user permissions to create directories and files inside the repository.  The file system path is different from the path you use to download these artifacts through an HTTP server, and starts at the root, not the user's home directory.

Of course, you'll want to specify the release server URL in the Buildfile, but leave the username/password settings private in your local @buildr.rb@ file. Let's break up the release server settings:

{% highlight ruby %}
# build.rb, loaded first
repositories.release_to[:username] = 'john'
repositories.release_to[:password] = 'secret'

# Buildfile, loaded next
repositories.release_to[:url] = 'sftp://release/usr/share/repo'
{% endhighlight %}

The @upload@ task takes care of uploading all the packages created by your project, along with their associated POM files and MD5/SHA1 signatures (Buildr creates these for you).

If you need to upload other files, you can always extend the @upload@ task and use @repositories.release_to@ in combination with @URI.upload@.  You can also extend it to upload to different servers, for example, to publish the documentation and test coverage reports to your site:

{% highlight ruby %}
# We'll let some other task decide how to create 'docs'
task 'upload'=>'docs' do
  uri = URI("sftp://#{username}:#{password}@var/www/docs")
  uri.upload file('docs')
end
{% endhighlight %}

h3(#uploading-options). Uploading Options

For convenience, you can also pass "any option of Net::SSH":http://net-ssh.github.com/ssh/v2/api/classes/Net/SSH.html#M000002 when configuring the remote repository.

If you need to enforce to use password-only authentication for example, you can set this option:

{% highlight ruby %}
# Set password authentication only
repositories.release_to[:options] = {:ssh_options=>{:auth_methods=> 'password'}}
{% endhighlight %}

h2(#source_javadoc). Packaging Sources and JavaDocs

IDEs can take advantage of source packages to help you debug and trace through compiled code.  We'll start with a simple example:

{% highlight ruby %}
package :sources
{% endhighlight %}

This one creates a ZIP package with the classifier "sources" that will contain all the source directories in that project, typically @src/main/java@, but also other sources generated from Apt, JavaCC, XMLBeans and friends.

You can also generate a ZIP package with the classifier "javadoc" that contains the JavaDoc documentation for the project.  It uses the same set of documentation files generated by the project's @doc@ task, so you can use it in combination with the @doc@ method.  For example:

{% highlight ruby %}
package :javadoc
doc :windowtitle=>'Buggy but Works'
{% endhighlight %}

By default Buildr picks the project's description for the window title.

You can also tell Buildr to automatically create sources and JavaDoc packages in all the sub-projects that have any source files to package or document. Just add either or both of these methods in the top-level project:

{% highlight ruby %}
package_with_sources
package_with_javadoc
{% endhighlight %}

You can also tell it to be selective using the @:only@ and @:except@ options.
For example:

{% highlight ruby %}
package_with_javadoc :except=>'la-web'
{% endhighlight %}

We packaged the code, but will it actually work? Let's see "what the tests say":testing.html.
