<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软件:
class
Hello
{
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兆的一个小程序包更加容易分发吧。
package
cn.javadoc.jfit;
import
java.io.BufferedReader;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.InputStreamReader;
import
java.util.ArrayList;
import
java.util.List;
import
java.util.jar.JarOutputStream;
import
java.util.zip.ZipEntry;
public
class
Packager
{
/**
*@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