I have my small program.jar that uses a small part of huge library.jar.
Is there a tool to repackage several jars into one so it can be run stand-alone and is as small as possible?
Update: size matters.
I have my small program.jar that uses a small part of huge library.jar.
Is there a tool to repackage several jars into one so it can be run stand-alone and is as small as possible?
Update: size matters.
JarJar is an ant based solution:
http://code.google.com/p/jarjar/
Or if you use maven, there's the shade plugin:
There is proguard, with ant and maven plugins. It removes unused code, optionally obfuscates and compresses to a single jar.
Proguard reduces the size on two fronts
Determining whether a class is used in java is a bit tricky. Static code analysis can get you so far, but you need to be a bit careful code accessed via reflection, since the tool may not be able to detect that. It handles Class.forName("x.y.z.Foo") but anything more complex and you'll need to add it to a config file of classes to include, It's possible to have a classloader generate a list of classes that are used at runtime, so this doesn't have to be arduous.
You might also want to investigate the pack200 compression scheme, as this can also bring a significant reduction in size of the jar.