Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Selective jar packaging

Tags:

java

package

jar

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.

like image 874
Łukasz Lew Avatar asked Apr 14 '26 13:04

Łukasz Lew


1 Answers

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

  1. only the classes that are actually used are stored in the final jar.
  2. 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.

like image 55
mdma Avatar answered Apr 16 '26 01:04

mdma



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!