Selective jar packaging
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 possib开发者_如何学Pythonle?
Update: size matters.
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
- only the classes that are actually used are stored in the final jar.
- Long names, e.g. all the long package names, class names, are renamed to much shorter names, saving quite a bit of space.
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.
JarJar is an ant based solution:
http://code.google.com/p/jarjar/
Or if you use maven, there's the shade plugin:
http://maven.apache.org/plugins/maven-shade-plugin/
You can try using the Ant jar
task - more info can be read here.
精彩评论