java程序发布之jre篇

本文介绍如何通过分析Java程序运行时加载的类,精简JRE中的rt.jar文件,以减小程序体积。通过自定义脚本记录所需类,并编写Java程序筛选并复制这些类到新的rt.jar中。
java程序发布之jre篇   基本知道思路了,我把写的程序打包成jar,能双击运行了,然后拷贝一个jre到程序目录下,具体是这样的,目录叫dict,dict下面有dict.jar、jre(目录),然后写了一个cmd脚本: @echo off set path=%cd%/jre/bin java -jar -verbose:class dict.jar >>class.txt pause   这样程序使用的就是当前目录下的jre,程序运行后,最好把所有的功能使用一遍,这样输出了一个文件class.txt,里面有所有需要的class,其格式如下: [Opened D:/data/dict/jre/lib/rt.jar] [Loaded java.lang.Object from D:/data/dict/jre/lib/rt.jar] [Loaded java.io.Serializable from D:/data/dict/jre/lib/rt.jar] [Loaded java.lang.Comparable from D:/data/dict/jre/lib/rt.jar] [Loaded java.lang.CharSequence from D:/data/dict/jre/lib/rt.jar] [Loaded org.apache.lucene.index.CompoundFileReader$FileEntry from file:/D:/data/dict/dict.jar]   我们依照这个文件来裁剪rt.jar:   首先在utralEdit中进行一些处理,去掉所有不是rt.jar中的class的行,去掉from后面的,去掉loaded等无关项目,再把“.”替换成“/”.这个可以利用正则表达式等轻松处理。处理完后得到的文件类似如下格式: java/lang/Object java/io/Serializable java/lang/Comparable java/lang/CharSequence java/lang/String   然后写一个脚本或者程序处理,将rt中需要的的class拷贝到另一个对应的文件夹rt1,我用java写了一个,没有时间仔细改,但能完成人物了。代码如下: import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; public class ReduceRt { //文件拷贝 public static boolean copy(String file1,String file2) { try //must try and catch,otherwide will compile error { // instance the File as file_in and file_out java.io.File file_in=new java.io.File(file1); java.io.File file_out=new java.io.File(file2); FileInputStream in1=new FileInputStream(file_in); FileOutputStream out1=new FileOutputStream(file_out); byte[] bytes=new byte[1024]; int c; while((c=in1.read(bytes))!=-1) out1.write(bytes,0,c); in1.close(); out1.close(); return(true); //if success then return true } catch(Exception e) { System.out.println(”Error!”); return(false); //if fail then return false } } //读取路径,copy public static int dealClass(String needfile ,String sdir,String odir) throws IOException { int sn = 0; //成功个数 File usedclass = new File(needfile); if(usedclass.canRead()) { String line = null; LineNumberReader reader = new LineNumberReader(new InputStreamReader(new FileInputStream(usedclass),”UTF-8″)); while((line = reader.readLine())!=null) { line = line.trim(); int dirpos =line.lastIndexOf(”/”); if(dirpos>0) { String dir = odir+ line.substring(0,dirpos); File fdir = new File(dir); if(!fdir.exists()) fdir.mkdirs(); String sf = sdir + line + “.class”; String of = odir + line + “.class”; boolean copy_ok=copy(sf.trim(),of.trim()); if(copy_ok) sn++; else { System.out.println(line); } } } } return sn; } public static void main(String[] args) { String needfile = “usedclass.txt”; String sdir = “./rt/”; String odir = “./rt1/”; try { int sn = dealClass(needfile,sdir,odir); System.out.print(sn); } catch (IOException e) { // TODO 自动生成 catch 块 e.printStackTrace(); } } }   我裁剪出来的rt大小为500多k。然后将rt1里面的目录和文件打包成rt.zip,改名为rt.jar,然后替换原来的rt.jar。具体的步骤可以参考上面提到的那两篇文章。   This entry was posted on Thursday, August 30th, 2007 at 12:54 pm and is filed under Java. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值