Linux Shell精简jre,给很简单的java程序提供运行环境

利用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

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值