怎样精简jre

怎样精简jre
2007-11-22 12:20

java是跨平台的东西,但有的时候我们不需要它去跨平台,我们希望能想c++做的程序一样,编码和简单处理后能够在系统运行。
这次的项目是要放到classmate pc上,这款机器是为学生订做的,系统资源很有限,一个jre1.5就70多M,放在上面肯定是不行的。于是我找了一些相关的资料,提供链接如下:
如何制作最小的RCP程序压缩包(包含JRE)
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;

我裁剪出来的rt大小为500多k。然后将rt1里面的目录和文件打包成rt.zip,改名为rt.jar,然后替换原来的rt.jar。具体的步骤可以参考上面提到的那两篇文章。

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();
}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
精简jre步骤 1. 拷贝一个完整版的jre文件夹到D盘 2. 删除jre目录下所有出bin和lib目录的所有文件或目录 3. 打开cmd窗口,设置path路径为空,转到D:\jre\bin目录,运行java –version。正常显示当前Java的版本。 4. 在bin目录中新建一个temp目录,将除java.exe和java.dll外的移到temp目录中 5. 再次运行java –version命令,提示没找到verify.dll。将temp目录中的verify.dll移到bin目录中 6. 再次运行 java –version命令,提示:Could not create the Java virtual machine.错误 7. 根据测试:还要将hpi.dll和zip.dll放到bin目录中 8. 再次运行java –version命令,OK,又出现了版本信息。此时,可以将temp目录移出bin目录中。(放到桌面先) 9. 删除client目录中的除jvm.dll外的文件。转到jre目录,查看bin目录的大小,为2.89MB。但此时lib目录仍有60M有余 10. 转到lib目录,新建一个temp目录,将i386除外的目录都移动到temp目录中,再次运行java –version命令,OK 11. 再新建一个temp2目录,将charsets.jar和rt.jar外的所有文件移动到temp2目录中,再次运行 Java –version命令,OK 12. 将temp2和temp目录移到桌面。此时lib仍有48.7M接近50M。(还得努力) 13. 缩减charsets.jar和rt.jar(使用7z工具可以查看和修改jar文件的内容『直接添加和删除』)。准备做个软件来实现。 14. 缩减原则。运行java -verbose:class -version > temp.java 命令,此时在bin目录下生成了一个temp.java文件,用EditPlus打开,看到没有,要加载的就是那些类了,把不需要的全部删除就是了。 15. 原来charsets.jar没有加载呀。直接删除,再次运行java –version命令,OK 16. 接下来的工作就是裁剪rt.jar了。慢慢来。也可以做个软件来完成。可以下载一个GreenJVMMake.jar来完成。不过有时候好像有些类没加载到。要考虑更新了。 17. 裁剪玩rt.jar后,再次运行java –version ,出现了版本信息。OK 18. 转到D盘查看一下精简jre才4.47MB。不到5M。OK 19. 最小的jre制作完毕。 附带制作过程图片,可用Picasa来查看,播放模式效果更佳。 Thoams 2010-6-25 15:53

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值