Maven Uberjarring

Pete Kazmier has written the uberjar plugin for maven.

Simply set (in your project.properties) the maven.uberjar.main property to the name of your "main" class, and type:

maven uberjar

An uberjar containing your project's jar and all dependencies will be created for you.

Manual Uberjarring

classworlds allows the creation of a single standalone jar for your project which may internally include any other additional jars that are required for your application. This allows for easy java -jar myapp.jar type of execution.

To create a standalone jar (aka, an uberjar), simply build your application's jar as normal. Gather up all dependent jars and create a classworlds.conf for your application. Similar to other jar formats, a meta-directory is created within the uberjar, named WORLDS-INF/. It contains two directories:

  • WORLDS-INF/lib/

    to contain all jars required by your application.

  • WORLDS-INF/conf/

    to hold your classworld.conf file.

The classworlds.conf should be created as normal, with the special exception that the property ${classworlds.lib} points to the internal library directory WORLDS-INF/lib/ so that jars can be loaded from within the uberjar:

[app]
  ${classworlds.lib}/myApp.jar
  ${classworlds.lib}/someDependency.jar

The core classworlds jar needs to be placed at the root of the WORLDS-INF directory, named exactly classworlds.jar

Create the required directory structure, and populate it with the appropriate files. For example:

./assembly-dir/
              WORLDS-INF/
                        classworlds.jar
                        lib/
                           myApp.jar
                           someDependency.jar
                           anotherDependency.jar
                        conf/
                           classworlds.conf

All that remains is unjaring the classes from classworlds-boot.jar into your assembly directory and creating your final jar. The final layout should appear like:

./assembly-dir/
              WORLDS-INF/
                        classworlds.jar
                        lib/
                           myApp.jar
                           someDependency.jar
                           anotherDependency.jar
                        conf/
                           classworlds.conf
              com/
                 werken/
                       classworlds/
                                   boot/
                                       Bootstrapper.class
                                       InitialClassLoader.class
                                   protocol/
                                           jar/
                                              Handler.class
                                              JarUrlConnection.class

Now, simply create and distribute your standalone uberjar:

  cd assembly-dir/
  jar cvf myapp-standalone.jar .
  java -jar myapp-standalone.jar