Part 1: Shrink Solr Application Size
Part 2: Use Proguard to Shrink Solr Application Size
Part 3: Use Pack200 to Shrink Solr Application Size
In order to continue to reduce the installation file, I decide to use pack200 to shrink jar size.
Please refer to http://docs.oracle.com/javase/1.5.0/docs/guide/deployment/deployment-guide/pack200.html
https://blogs.oracle.com/manveen/entry/pack200_and_compression_through_ant
This can remove all jars from 6.02mb to 4.44mb: 27% less.
The following is the ANT scrip to pack all jars:
<property name="jarpack-task.jar" value="C:\pathto\Pack200Task.jar" />
<taskdef name="pack200" classname="com.sun.tools.apache.ant.pack200.Pack200Task" classpath="${jarpack-task.jar}" />
<taskdef name="unpack200" classname="com.sun.tools.apache.ant.pack200.Unpack200Task" classpath="${jarpack-task.jar}" />
<target name="pack.all.jars">
<ac:foreach target="pack.jar" param="file.name">
<path>
<fileset dir="${final.jars.output}" includes="*.jar" />
</path>
</ac:foreach>
</target>
<target name="pack.jar" description="Applying the pack utility on jars">
<basename property="file.basename" file="${file.name}" />
<echo message="pack ${file.name} to ${final.jars.output}/${file.basename}.pack" />
<pack200 src="${file.name}" destfile="${final.jars.output}/${file.basename}.pack" stripdebug="true" deflatehint="keep" unknownattribute="pass" keepfileorder="true" />
<delete file="${file.name}" />
</target>
We can use ANT to unpack these jars:
<target name="unpack.all.jars" >
<ac:foreach target="unpack.jar" param="file.name">
<path>
<fileset dir="${runtime.home}" includes="*.pack" />
<fileset dir="${runtime.home.lib}" includes="*.pack" />
<fileset dir="${runtime.home}" includes="*.pack" />
<fileset dir="${runtime.solr.war.lib}" includes="*.pack" />
<fileset dir="${runtime.solr.core.lib}" includes="*.pack" />
</path>
</ac:foreach>
</target>
<target name="unpack.jar">
<propertyregex property="file.unpack.name" input="${file.name}" regexp="(.*).pack" select="\1" />
<echo message="unpack file ${file.name} to ${file.unpack.name}" />
<unpack200 src="${file.name}" dest="${file.unpack.name}" />
<delete file="${file.name}" />
</target>
Or we can use windows(linux) script to do this:@ECHO OFF
echo "Unpack startjetty.jar.pack"
CALL :unpackjar startjetty.jar.pack
echo "Unpack jars in folder ./lib"
For %%X in (lib\*.pack) do CALL :unpackjar %%X
echo "Unpack jars in folder ./solr.war\WEB-INF\lib"
For %%X in (solr.war\WEB-INF\lib\*.pack) do CALL :unpackjar %%X
echo "Unpack jars in folder ./solr-home\collection1\lib"
For %%X in (solr-home\collection1\lib\*.pack) do CALL :unpackjar %%X
GOTO :EOF
:unpackjar
set packedfile=%1
set unpackedfile=%packedfile:~0,-5%
echo unpack file: %unpackedfile% %packedfile%
unpack200 %packedfile% %unpackedfile%
DEL /Q %packedfile%
GOTO :EOF
@ECHO ON
After all these steps, we use 7zip to zip the application, size is 1,779 kb.
You can view all source code from github:
https://github.com/jefferyyuan/tools/tree/master/ant-scripts/shrink-solr