An open source tool for tracking Java dependencies. It builds jar
files that automatically contain all the classes used directly or
indirectly by the classes you explicitly include. You need this because
jar.exe is not clever enough to do this on its
own. GenJar runs only as an ant
task. It is a complex tool controlled with an
XML (extensible Markup Language)
script. It will also build an extended manifest describing all the
elements. Of course it has no way of knowing about dynamically loaded
classes or resources. The latest version is Genjar2 1.4
Last revised/verified: 2010-11-10
GenJar stopped working properly with the
release of Ant 9.0. It works for 90% of my apps. For the rest I must revert to jar.exe.
I have not yet been able to get GenJar2
working at all. My questions to the author were ignored. I think he has lost interest in the project.
Don’t use the genjar destdir option. It
does not produce a simple list of dependencies to feed to jar.exe
but rather a copy of the entire directory tree of classes that would go
inside the jar.
- Install Mercurial (e.g. Tortoise HG) so you can access the Google
- Clone the server repository (check out the project) on your local
hard drive with a Mercurial command: hg clone
- Read the manual embedded in the repository, now copied to your
local hard disk.
- rebuild genjar.jar with build.xml.
- Copy genjar.jar and genjar.properties
to J:\Program Files (x86)\apache-ant-1.9.0\lib.
Everything so far you need do only once.
- Compose your <genjar
ANT (A Neat Tool) script and or incorporate it into an ant build.xml
in the project directory with the class files where you want the jar
- CD (Change Directory)
to that project directory.
- Then run your script with:
GenJar error messages are misleading. It will
complain about the main class when the real problem is some totally
When genjar says Unable
to resolve: null, it means it could not find some class file
it needs to include in the jar, or a file it wanted was in use by
another program. Try a reboot. You might have some old *.java or
*.class files lying about confusing it. Especially check anything with
an old date to make sure it should be included. Ahem. It is considered
polite when a program complains about being unable to find something
to divulge what it is.
- It is very quick.
- It comes with source code.
- It solves the problem of jar building, saving you untold time
manually building them.
- There has not been an update since 2010.
- There are a large number of bugs reported on the SourceForge
website. The author appears to have totally ignored them.
- The error messages give you no clue as to what the real problem
What Classes Get Included?
GenJar scans the classpath looking recursively for classes to include
in the jar. These it includes in the jar. Classes in the ext
directory, by default, it leaves out of the jar.
You can force it to include certain classes or tell it not to include
certain classes because they will be supplied at run time in an
Real Life Build Script
This build script builds Biorhythms,
a signed Applet. You make genjar known to the script with: <taskdef
Oddly there are no properties to speak of in genjar.properties,
just the name of the Java class that extends Task
to implement GenJar.
Here is how you would include a whole
directory full of *.png resource images in
You can use the <library command to
unpack and include some other library jar inside your jar.
Unfortunately, the <classfilter
command has no effect on just what is included with the <library
command. Everything is included, needed or not! You
have to set up the jar to be included on the classpath, then use the <classfilter. You can use the <class
command to include just the stuff from a library needed to support a
given class. You can use the <classpath
command if GenJar seems to be having trouble finding some auxiliary
In this example we persuade GenJar to include just the classes used
by the TrueZIP library jar and bundle them in
You might want to recompile GenJar to fix
bugs, to figure out how it works etc. You will have to add the Ant
jars to the project. GenJar.jar does not
have a main-class in the manifest. Ant
learns about the genjar.properties file
from the taskdef statement in the ant script. It reads it and
discovers the class org.apache.tools.ant.taskdefs.optional.genjar.GenJar which extends the abstract
Ant Task class. Ant can dynamically load Genjar with Class.forName.asSubClass
.newInstance. Ant can then call GenJar’s
methods as needed.