# Mac OS X JarBundler ANT Task

# Version 1.9

How many times has this happened to you? You've written a little Java utility, or maybe even a more complex application, and you want to create Mac OS X application bundle for easy distribution.

You'd like to be able to do it automatically from your build process, but you're forced to go run the Apple Jar Bundler and tweak all the settings manually every time you build.

Well no more! JarBundler is a feature-rich Ant task which will create a Mac OS X application bundle from a list of Jar files and a main class name. You can add an Icon resource, set various Mac OS X native look-and-feel bells and whistles, and maintain your application bundles as part of your normal build and release cycle. It is free software licensed under the GNU General Public License.

This release is based on the earlier work of Seth Morabito.

## What's New

- Deprecated `chmod` attribute. Using the ANT task "Chmod" internally.
- Using the ANT task "Delete" internally to delete any pre-existing ".app" file
- Added the <service> nested task. This matches a task used in the JEdit branch of JarBundler. Thanks to Björn "Vampire" Kautler for providing source code.
- Add UTI specifier to document types. Thanks to Deerwood McCord Jr. for the implementation.

## Download

Source and binary, all platforms (ZIP): | jarbundler.zip
Source and binary, all platforms (TAR): | jarbundler.tar.gz

## Installation

Move the file `jarbundler-1.9.jar` into `/Developer/Java/Ant/lib` or into your local ANT lib directory. Remove any older versions at this time.

## Using in the Build file

To use the Jar Bundler Ant Task, create a task definition in your ANT `build.xml` file like this:

    <taskdef name="jarbundler"
             classname="net.sourceforge.jarbundler.JarBundler" />

Now, from a target, you can add the "jarbundler" task.

    <jarbundler dir="release"
                name="MyApp"
                mainclass="org.foo.myapp.Main"
                jar="myapp.jar" />

## Task Attributes, required

Attribute | Description
--- | ---
dir | The directory in which your application bundle will be created.
name | The name of your application bundle (minus the ".app" extension).
mainclass | The name of the main class to run when the application bundle is launched. The corresponding bundle variable is MainClass
jar | A single jar file to be used in your application. Not Required if there are nested `<jarfileset>` or `<jarfilelist>` nested tasks. Can be used with nested `<jarfileset>` and/or `<jarfilelist>` tasks i.e. all jar files will be added to the class path.

## Task Attributes, optional

Attribute | Description
--- | ---
arguments | Extra command-line arguments for the Java application. The corresponding bundle variable is Arguments
build | Application build number. This string is used in the default "About..." box along with the 'version' number. This default About Box format is "version (build)" i.e. "4.3.1 (231)". Also see `version` and `infostring` attributes. The corresponding bundle variable is CFBundleVersion Default: the value of the `version` attribute
bundleid | Unique identifier string for the bundle. This string should be in the form of a java package name, for example com.apple.myapp. The corresponding bundle variable is CFBundleIdentifier
developmentregion | The development region of the bundle. The corresponding bundle variable is CFBundleDevelopmentRegion Default: `English`
extraclasspath | A list of files or patternsets (space or comma seperated) to add to the bundle's classpath. The files referenced by this property will not be copied into the bundle, so the resulting .app may only work on systems that have these external resources available.
helpbookfolder | Specify the directory name of the Help Book in the "resources" directory. When this name must match the directory name when using the `<resourcefileset>` task to copy the Help Book HTML files into the bundle. The corresponding bundle variable is CFBundleHelpBookFolder
helpbookname | Specify the name of the Help Book. This is string is also used as the META tag to designate the initial HTML file to be loaded into the Help Viewer application. `<meta name="AppleTitle" content="Hello World Help"/>` NB: The Apple Help Book system does not open the file `index.html` by default. Although it is a good practice to use this filename with the embedded META tag shown above. The corresponding bundle variable is CFBundleHelpBookName
icon | File reference to a Mac OS X icon file. This file is created with the Mac OS application located at "`/Developer/Applications/Utilites/Icon Composer`"
infostring | A string for display in the Finder's Get Info panel. Also see `version` and `build` attributes. The corresponding bundle variable is CFBundleGetInfoString Default: the value of the `version` attribute
jvmversion | The version of the JVM required to run the application. Typically a string in the form "1.3", "1.3+", "1.4", "1.4+", etc. The corresponding bundle variable is JVMVersion ADC: Specifing the Java Version ADC: Specifing the Java Version after installing J2SE 5.0 Default: `1.3+`
shortname | The string used in the application menu. This string is often shorter than the application's name. For example, "`Microsoft Word`" displays "`Word`".. Apple recommends that this string be limited to 16 characters. JarBuilder enforces this limit silently by truncating `shortname`. If the `shortname` is not specified then the application's name will be used with no truncation.

showplist If true, display the contents of the `Info.plist` file
Default: `false`
signature The four-letter code identifying the bundle.
The corresponding bundle variable is CFBundleSignature
Default: `????`
stubfile If set, the location of a Mac OS X Java Application Stub file to use for this application bundle. See the section "Specifying the Java Launching Stub File" below.
Required for Windows or Linux
Under MacOS, if the referenced file does not exist, then the file name will be used in the bundle to reference a copy of the `JavaApplicationStub`. This usage provides a way for each Java application to have a uniquely named executable file name. This is useful when using the UNIX 'top' command to distinguish applications.
verbose If true, output more verbose information to Ant while the task is running.
Default: `false`
version Version number displayed in Finder, this version number can be though of as the "Marketing" version without distracting build information. The marketing version is a string that usually displays the major and minor version of the bundle. This string is usually of the form n.n.n where n is a number. Also see `build` and `infostring` attributes.
The corresponding bundle variable is CFBundleShortVersionString
Default: `1.0`
vmoptions Command line options to pass the JVM at startup.
The corresponding bundle variable is VMOptions
workingdirectory The working directory for the Java application.
The corresponding bundle variable is WorkingDirectory

## Task Attributes, deprecated

Attribute | Description
--- | ---
aboutmenuname | The string to display in the "About" menu of the running application. (Deprecated under JVM 1.4.1) Use JarBunler attribute `shortname` instead
antialiasedgraphics | If set to true, use anti-aliasing when rendering graphics. Use `<javaproperty name="apple.awt.antialiasing" .../>`
antialiasedtext | If set to true, use anti-aliasing when rendering text. Use `<javaproperty name="apple.awt.textantialiasing" .../>`
chmod | The full path to the BSD 'chmod' command. Using the ANT task "Chmod" internally.
execs | A list of files or patternsets (space or comma seperated) to place into the "Resources/MacOS" directory and set executable. Usage Warning: Filenames and directory paths can sometimes contain spaces and commas. If these characters are present the build will fail mysteriously when using this attribute. Use `<execfileset/>` or `<execfilelist/>` nested tasks instead.
growbox | Show the Aqua resize (grow) box. Use `<javaproperty name="apple.awt.showGrowBox" .../>`
growboxintrudes | Resizable window's growbox (resize control) intrudes into AWT content. If turned off, the bottom of the window is pushed down 15 pixels. (Deprecated under JVM 1.4.1)
jars | A list of jar files or patternsets (space or comma seperated) to be used in your application. Usage Warning: Filenames and directory paths can sometimes contain spaces and commas. If these characters are present the build will fail mysteriously when using this attribute. Use `<jarfileset>` and/or `<jarfilelist>` nested tasks instead.
type | The Mac OS type of the bundle. This attribute is redundant with the implied behavior this ANT task i.e. `CFBundlePackageType` should always be set to `APPL` for applications.
shortinfostring | Use `infostring` attribute instead.
smalltabs | If set to true, tab controls in Swing applications more closely resemble the Metal look and feel. If set to false, the tabs assume a larger size more similar to the default Aqua controls. (Deprecated under JVM 1.4.1)
liveresize | If set to true, enable live-resizing of windows. (Deprecated under JVM 1.4.1)
screenmenu | If set to true, puts Swing menus in the Mac OS X menu bar if using the Aqua look and feel. Set the `apple.laf.useScreenMenuBar` property instead: `<javaproperty name="apple.laf.useScreenMenuBar" value="true"/>`

## Nested DataType Task

### <jarfileset>

The nested `jarfileset` element specifies a FileSet. All files included in this fileset will be included in the application bundle and added to the app bundle classpath. Only required if the `jars` attribute is not set.

### <jarfilelist>

The nested `jarfilelist` element specifies a FileList. All files included in this filelist will be included in the application bundle and added to the app bundle classpath. Only required if the `jars` attribute is not set.

### <javaproperty ...>

This ANT DataType element allows developers to specify java properties for the info.plist. This DataType repalces many `jarbundler` tag attributes. However, if a deprecated attribute is used it will take precedent over a `javaproperty`. This was done to maintain backward compatibility with earlier versions of `jarbundler`.

This task takes name/value pairs:

    <javaproperty name="apple.awt.showGrowBox" value="true"/>

Additional Java Properites can be found in the Apple Developer Connection document: Apple Java Properties for JDK 1.4+

### <execfileset>

The nested `execfileset` element specifies a FileSet. All files included in this fileset will be added to the application bundle's "Contents/MacOS" directory and set executable. Optional.

### <execfilelist>

The nested `execfilelist` element specifies a FileList. All files included in this filelist will be added to the application bundle's "Contents/MacOS" directory and set executable. Optional.

### <resourcefileset>

The nested `resourcefileset` element specifies a FileSet. All files included in this fileset will be added to the application bundle's "Contents/Resources" directory. Optional.

### <resourcefilelist>

The nested `resourcefilelist` element specifies a FileList. All files included in this filelist will be added to the application bundle's "Contents/Resources" directory. Optional.

### <javafileset>

The nested `javafileset` element specifies a FileSet. All files included in this fileset will be added to the application bundle's "Contents/Resources/Java" directory. Optional.

### <javafilelist>

The nested `javafilelist` element specifies a FileList. All files included in this filelist will be added to the application bundle's "Contents/Resources/Java" directory. Optional.

### <extraclasspathfileset>

The nested `extraclasspathfileset` element specifies a FileSet. All files included in this fileset will be added to the application bundle's classpath, but the files will not be copied into the bundle itself. This allows you to specify external system classpath dependencies without bundling the resources. Resources can be files or directories. Optional.

### <extraclasspathfilelist>

The nested `extraclasspathfilelist` element specifies a FileList. All files included in this filelist will be added to the application bundle's classpath, but the files will not be copied into the bundle itself. This allows you to specify external system classpath dependencies without bundling the resources. Resources can be files or directories. Optional.

### Note on FileList and FileSet target locations

Note that in fact the files are installed in locations which have the same relation to either `Contents/MacOS` or `Contents/Resources` directories as the files in the FileSet or FileList have to the '`dir`' attribute. Thus in the case:

     <resourcefileset dir="builddir/architectures" includes="ppc/*.jnilib"/>

the `*.jnilib` files will be installed in `Contents/Resources/ppc`

## Examples

A minimal example might look like this

     <jarbundler dir="release"
                 name="MyApp"
                 mainclass="org.foo.myapp.Main"
                 jar="build/myapp.jar" />

This will create a Mac OS X application bundle called "MyApp.app" in the directory "release" using a JAR file which was created in the "build" directory.

You can use FileSets or FileLists for more complex builds. For example:

    <jarbundler dir="release"
                name="MyApp 1.0"
                mainclass="org.foo.myapp.Main" >

      <jarfileset dir="build">
        <include name="**/*.jar" />
        <exclude name="**/CVS" />
      </jarfileset>

      <jarfilelist dir="lib" file="GUI.jar, Utils.jar" />

    </jarbundler>

## Advanced JarBundler Tasks

Associating Documents with your Application

Including an Apple Help Book

Apple System Service Property

Java Launching Stub File

Advanced Example

## History

### April 12, 2006 (version 1.8.1)

Fix bug when using localized Help Books, the menu application would appears as `(null)`

Corrected the encoding for the `Info.plist` XML file so that the copyright character, amongst others, are processed correctly. Thanks to Christian Roth for both pointing out the encoding problem and providing a one line solution!

### April 11, 2006 (version 1.8)

Added `bundle` attribute to `documenttype` task in order to specify documents which are in reality directory trees, yet treated as a single entity by the Finder. Thanks to Deerwood McCord Jr. for the implementation.

Added `mimetypes` attribute to `documenttype` task in order to specify Multipurpose Internet Mail Extensions (MIME) types for the document. Thanks to Deerwood McCord Jr. for the implementation.

No longer required to delete the existing application bundle, i.e. `.app` directory, before invoking the `jarbundler` task. This is now done by the task itself.

The filename of the `stubfile` attribute will be used as the Java Application Stub filename within the bundle and for the value of the `CFBundleExecutable` key in the `Info.plist`. This usage provides a way for each Java application to have a uniquely named executable filename. This is useful when using the UNIX 'top' command to distinguish applications. Thanks to Deerwood McCord Jr. for the this idea.

`Info.plist` is built internally as a DOM tree instead of concatenating strings. This resulting DOM tree is serialized into the file using two space indentation and one tag per line.

Improved readablity of the verbose output. The contents of the `Info.plist` file is controlled by the `showPlist` attribute.

Reorganize JarBundler documentation by splitting out advanced features

### March 22, 2006 (version 1.7)

Added `<documenttype>` nested task so that file associations can be set up for the application. Thanks to Dan Stowell a sample "`Info.plist`" file containing document type entries.

Added `<javafileset>` and `<javafilelist>` nested tasks, which mirror `<resourcefileset>` and `<resourcefilelist>`, in order to add files to the `Contents/Resources/Java` directory

Added Apple Help Book support by...

- Adding `helpbookfolder` attribute to the `jarbundler` task
- Adding `helpbookname` attribute to the `jarbundler` task
- Adding `javafilelist` nested task to assist in moving the Help Book JNI library to the correct location. (see above)

Thanks to Will Lowe for an example Help Book project with JNI code.

Split the "Hello, World" example into a complex build which associates document types and uses a Help Book, and a simple minimal build

Reorganize 'example' source directory to include Objective-C JNI code and use package structure for "Hello, World" application rather than putting everything

### March 2, 2006 (version 1.6)

Added `<resourcefileset>` and `<resourcefilelist>` nested elements, which mirror `<execfileset>` and `<execfilelist>`, and add files to the `Contents/Resources` directory.

Added `build` attribute to `jarbundler` task. See also `version` and `infostring` for usage.

Added `jar` attribute to `jarbundler` task.

Added `shortname` attribute to `jarbundler` task. See also `name` for usage.

JarBundler is now a SourceForge project!

Changed task package to `net.sourceforge.jarbundler`

### February 2006 (version 1.5)

Changed the package from 'com.loomcom.ant.tasks.jarbundler' to 'com.informagen.ant.tasks.jarbundler' so that version 1.4 can remain installed without conflict

Added a nested DataType called "javaproperty" so that new properties can be added by end users and deprecated properties can be removed. Former jarbundler tag atributes are still available but have been deprecated in favor of their 'javaproperty' equivalents.

Currently, a jarbundler tag attribute overrides a javaproperty tag. This was done to maintain backward compatibility with version 1.4

### 13 November 2004 (version 1.4):

Fixed a bug that was causing application arguments not to be set.

### 23 October 2004 (version 1.3):

Added "extraclasspath" attribute, and "extraclasspathfileset" and "extraclasspathfilelist" nested elements, allowing users to optionally add external resources to the runtime classpath which will not be copied into the application bundle at build time. Removed some Java 1.4 requirements to allow building the sources under Java 1.3. Clarified the documentation.

### 26 July 2004 (version 1.2):

Added Ant property setters for "bundleid" and "developmentregion". Bundleid has no default, and is optional. Developmentregion defaults to "English", and is also optional. Fixed documentation on the website.

### 26 July 2004 (version 1.1):

Fixed several minor bugs, and improved BuildException messages. Jarfilesets and execfilesets now preserve directory structure when copying. Thanks to Trevor Harmon for pointing out bugs and enhancements.

### 25 July 2004 (version 1.0):

"execs" and "jars" can now be set using embedded FileSets or FileLists. Added a "verbose" flag, which currently sees limited use. Added "chmod" attribute, which can be used to point to a non-standard 'chmod' command (not normally needed!) Increased error checking. Hopefully, the code is now robust enough for widespread production use!

### 28 Dec 2003 (version 0.5):

Added setter for "execs" attribute. Added setter for "workingdirectory" attribute. Fixed missing setter for "arguments" attribute. Added alternate Java runtime parameter names for Mac OS X Java VM version 1.4.1. Included change submitted by Pierre-Luc Paour. Thanks also to Dante Briones and Graham Perks for pointing out bugs and enhancements.

### 12 October 2003 (Version 0.2:)

Added setter to properly support the "vmoptions" parameter. (Change submitted by Alok Saldanha)

## Contact

Please contact Will Gilbert if you have bugs to report, patches to the code, ideas for enhancements, or any other suggestions! I can be reached at gilbert@informagen.com

## Acknowledgments

Thanks to Dan Stowell for suggesting the "`documenttype`" task and supplying and example `Info.plist` file.

Thanks to Will Lowe for providing an example project which implemented "Apple Help Book" support for Java.

## License

The Jar Bundler Ant Task is Copyright © 2002 - 2006, Seth J. Morabito. All rights reserved.

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.