Home » Android » java – Generate minimized jar with only used classes

java – Generate minimized jar with only used classes

Posted by: admin May 14, 2020 Leave a comment

Questions:

I’m in need of creating the minimal jar of utils library for use in Android. I’m using some methods from apache commons libraries (such as IOUtils, StringUtils). However, each such usage makes me import the whole library (commons-lang, commons-io etc.) which is absolutely acceptable under Tomcat (war‘s are mamoot-sized anyway), but absolutely unacceptable for Android project.

So, my aim is, to pack all used classes from dependencies into one jar – but only that classes that are needed. I remember once being in touch with maven plugin that done that task, unfortunatelly I can’t remember its name nor find it via Google.

So please, do you know maven plugin that will do such minimization of dependencies, or any stand-alone tool that will do the same?

How to&Answers:

Excuse me, maybe i not clearly understood question. Obfuscator tool (i.e. ProGuard) could do that, isn’t it? It packs several JARs into one and strips unused classes. If you don’t need obfuscation/optimization (to prevent unwanted side-effects) then you could disable them, leaving “shrink” phase enabled.

Answer:

The maven plugin you can’t remember is probably Apache Maven Shade Plugin, there is minimizeJar option. As Andreas_D noticed, this won’t include classes, loaded with Class.forName, so you will need to implicity say in configuration, that you need them. Here is how i made maven to include jdbc driver in my single jar:

<filter>
  <artifact>net.sourceforge.jtds:jtds</artifact>
    <includes>
      <include>**</include>
    </includes>
</filter>

Answer:

In general it is not possible to automatically select all classes that are used by an application. Just think about what we can do with Class.forName(String name) or if we use a dependency injection container and declare types in external configuration files.

Answer:

I guess if you use Eclipse to JAR the project it gives some options to do that while JARing 🙂
Maybe it will be useful.

Also you can collect your used library classes under a custom library and include this user created library in the project.