`
zengsai
  • 浏览: 28431 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

你的程序有多大?

阅读更多
<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>你经常写一些有趣的小程序么?你想分发你的程序么?你怎么保证目标机上有jre呢?你打包一个?一个jre几十兆,若是大工程,带个jdk也无所谓,如果你自己的类文件一共还没有1兆,就要带个几十兆的jre,你能接受么?如果你想分发你的小程序,那么我们来进行jre瘦身吧!看看我们的HelloWorld最小能多小。

jre带的很多文件可能在你的程序里并不需要,或者你的程序只需要某个几兆大的jar里面的一个class。所以,理论上我们可以对jre进行减肥运动。把你不需要的jar和文件删掉,剩下的跟你的程序一起打个包。

下面以jdk5.0开发的一个HelloWorld为例来简单做个试验。

开发我们的Hello软件:
classHello{
publicstaticvoidmain(String[]args){
System.out.println(
"HelloWorld!");
}

}



用java-verboseHello执行程序就能看到所有用到的class。当然,如果你的程序比较复杂,中间有条件跳转的话,一次执行可能并不能将所有的可能用到的class打印出来。这个不是大问题,你可以尝试别的办法来找出所有用到的文件。

1。把这些class找出来。java-verboseHello>G:/jdkfit/Hello.list

当然,用Runtime.exec("java-verboseHello").getInputStream()来获得输出结果直接使用更好。

2。打个包。我们来写个程序来完成这个任务吧。执行下边这个Packager程序。

3。拷贝一个jre,把我们自己打的jar覆盖jre的rt.jar,用这个jre执行javaHello。最好做个bat文件(我做了个run.bat)。试着删除jre下的文件,看能不能run。直到最后,呵呵,只剩下这么几个了:

bin/java

bin/run.bat

bin/client/jvm.dll

lib/rt.jar(我们自己打的那个包)

lib/i386/jvm.cfg

共计大小:2.11兆

再来rar一下:1.123兆

呵呵1.1兆的一个小程序包更加容易分发吧。

packagecn.javadoc.jfit;

importjava.io.BufferedReader;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.jar.JarOutputStream;
importjava.util.zip.ZipEntry;

publicclassPackager{

/**
*
@paramargs
*/

publicstaticvoidmain(String[]args)throwsException{
Filef
=newFile("G:/jdkfit/Hello.list");
Packagerpkger
=newPackager();
Listret
=pkger.parseOutput(newFileInputStream(f));
pkger.debugEnabled
=true;
pkger.pkgResources(ret,
"G:/jdkfit/jar/Hello.jar");

}


privatebooleandebugEnabled;

publicListparseOutput(InputStreamin)throwsIOException{
ArrayListret
=newArrayList();
BufferedReaderreader
=newBufferedReader(newInputStreamReader(in));
Stringline
=reader.readLine();
while(line!=null){
if(line.matches("\[Loaded.*from.*")){
if(debugEnabled)
System.out.println(
"Matches:"+line);
ret.add(line.substring(
8,line.indexOf("from")));
}
else{
if(debugEnabled)
System.out.println(
"UnMatches:"+line);
}

line
=reader.readLine();
}

returnret;
}


publicvoidpkgResources(Listres,StringfileName)
throwsIOException{
Filef
=newFile(fileName);
if(!f.exists()){
f.createNewFile();
}

byte[]buf=newbyte[1024];
JarOutputStreamout
=newJarOutputStream(
newFileOutputStream(fileName));
for(Strings:res){
s
=s.replace('.','/')+".class";
if(debugEnabled){
System.out.println(
"adding:"+s);
}

InputStreamin
=this.getClass().getClassLoader()
.getResourceAsStream(s);
out.putNextEntry(
newZipEntry(s));
intw=in.read(buf);
while(w>=0){
out.write(buf,
0,w);
w
=in.read(buf);
}

in.close();
}

out.finish();
out.close();
}

}

文章来源:http://www.javaresearch.org/article/99402.htm

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics