利用Linux Shell精简jre,给很简单的java程序提供运行环境,我的小程序主要依赖rt.jar,所以本文主要是对rt.jar进行精简。另外,本文着重点是对依赖类的处理,对
Step1将项目打包成jar包,把电脑中的jre拷贝出来,将jar包放到拷贝出来的jre文件夹(后面简称为jre)中的bin目录。
Step2打开cmd窗口,进入bin目录,输入java-jar *.jar,这时jar包没问题,那就肯定能运行。运行的java程序不要关,把bin目录里的东西大胆删除,不能删的东西会提示正在被使用。bin子文件夹里的东西也要删除。这样bin精简好了。
Step3关闭程序,输入java -jar -verbose *.jar>> class,这句把依赖类写到class中。大概长这样:
[OpenedC:\Users\cfcck\Desktop\jre1.8.0_111\lib\rt.jar]
[Loadedjava.lang.Object from C:\Users\cfcck\Desktop\jre1.8.0_111\lib\rt.jar]
[Loadedjava.io.Serializable from C:\Users\cfcck\Desktop\jre1.8.0_111\lib\rt.jar]
[Loadedjava.lang.Comparable from C:\Users\cfcck\Desktop\jre1.8.0_111\lib\rt.jar]
[Loadedjava.lang.CharSequence from C:\Users\cfcck\Desktop\jre1.8.0_111\lib\rt.jar]
……………………………………………以下省略……………………………………………………
[OpenedC:\Users\cfcck\Desktop\jre1.8.0_111\lib\rt.jar] 这句知道有用到jre文件夹下的rt.jar,
Loadedjava.lang.Object 表示用了rt.jar的java/lang/Object.class这个类(rt.jar直接解压后会有很多文件夹,java sun org jdk javax等等)。rt.jar会有很多类,不一定全用到,所以没用的类删掉。
把class和rt.jar拷贝到linux系统下。rt.jar解压到rt文件夹,unziprt.jar -d rt
Step4这一步主要目的是,获得所需类,及其路径。扫一下class文件,知道就用了rt.jar,用vi命令删除第一行。从剩余行中取出这一列java.lang.Object,
awk‘BEGIN{FS=” ”} {print $2}’class | cat > class1
class1文件长这样:
java.lang.Object
java.io.Serializable
java.lang.Comparable
java.lang.CharSequence
java.lang.String
java.lang.reflect.AnnotatedElement
……以下省略……
把class1中的’.’替换成’/’, sed 's/\./\//g' class1 | cat > class2
class2文件长这样:
java/lang/Object
java/io/Serializable
……以下省略……
把class2中的尾巴加上.class,awk '{print $0 ".class"}'class2 | cat > class3
class3文件长这样:
java/lang/Object.class
java/io/Serializable.class
……以下省略……
Step5用脚本删除无用的类。先把要用的类权限变一下,改为和原来不一样,我是改为000了。
注意:脚本运行路径和rt.jar解压出来的文件路径要一样,也就是在java javax sun文件夹那一级。
脚本如下:
#!/bin/bash
for i in `awk '{print $0}' class3`
do
echo $i
chmod 000 $i #把有用的类权限弄为000
#chmod 664 $i #删完后,把权限弄回去
done
利用需要类和不需要类的权限不一样,删掉的不需要类,脚本如下:
#!/bin/bash
for i in `find ./ -name "*.class"`
do
echo $i
str=`ls -l $i | awk '{print $1}'`
if [ $str = "-rw-rw-r--" ]; then
echo $str
rm $i
fi
#rm $i
done
再把权限变回去。
Step6打包jar包
如果linux上有java环境,在javajavax sun 那一级目录,jar cvf rt.jar com javajavax jdk org sun
如果没有,就压缩这几个文件夹,tar zcvf rt.tar com javajavax jdk org sun
然后一起拷贝到有java环境的Windows,也是运行jar cvf rt.jar com java javax jdkorg sun