<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
分享到:
相关推荐
程序写好并编译后生成hex文件,这个hex文件就是要...好了,从今天起你就要知道你所写的程序有多大该怎么看了,另外程序的大小还可以在工程目录下的.map文件中看到:找到.map文件,用记事本打开,拉到最后就可以看到了。
首先,微信小程序无需下载安装,用户通过微信即可直接使用,极大地降低了使用门槛。其次,小程序拥有与原生应用相近的用户体验,同时加载速度快,响应迅速,保证了良好的使用感受。此外,微信小程序还提供了丰富的...
首先,微信小程序无需下载安装,用户通过微信即可直接使用,极大地降低了使用门槛。其次,小程序拥有与原生应用相近的用户体验,同时加载速度快,响应迅速,保证了良好的使用感受。此外,微信小程序还提供了丰富的...
uni-app是一个基于Vue.js的跨平台开发框架,允许开发者编写一次代码,发布到多个平台,如iOS、Android、Web以及各类小程序。uni-app的优点在于它的跨平台能力,统一的语法和API使得开发效率大大提高。然而,跨平台...
"好玩的python程序的实现(有注释,80多个)"这个压缩包文件就提供了这样一个丰富的资源库,适合Python初学者深入理解和实践。下面我们将详细探讨这些程序可能包含的知识点。 首先,基础语法是Python学习的核心部分...
在微信中运行时,微信小程序获得更多的系统权限。首先是数据缓存能力,这可以让用户在打开一个小程序的时候将程序的主要框架缓存到微信上,下一次就可以快速打开了。微信创始人张小龙曾说过,微信应用号希望实现的...
首先,微信小程序无需下载安装,用户通过微信即可直接使用,极大地降低了使用门槛。其次,小程序拥有与原生应用相近的用户体验,同时加载速度快,响应迅速,保证了良好的使用感受。此外,微信小程序还提供了丰富的...
如果你想要进一步提升,可以尝试添加更多的交互元素,比如声音效果、随机回应或者更复杂的对话流程,让程序更加生动有趣。 总之,VB编写“你爱不爱我?”搞笑程序是一个很好的学习实践项目,既能巩固基础知识,也能...
首先,微信小程序无需下载安装,用户通过微信即可直接使用,极大地降低了使用门槛。其次,小程序拥有与原生应用相近的用户体验,同时加载速度快,响应迅速,保证了良好的使用感受。此外,微信小程序还提供了丰富的...
首先,微信小程序无需下载安装,用户通过微信即可直接使用,极大地降低了使用门槛。其次,小程序拥有与原生应用相近的用户体验,同时加载速度快,响应迅速,保证了良好的使用感受。此外,微信小程序还提供了丰富的...
在微信小程序的开发中,有时候我们需要分享小程序页面并携带特定参数,以便在用户扫码或...希望本文的讲解对你的学习或工作有所帮助,如果你需要了解更多关于微信小程序开发的信息,请查阅微信官方文档或其他相关资料。
对于初学者而言,掌握如何在该系统内打开已有的C程序以及创建新的C程序是非常重要的技能。本文将详细介绍如何利用此系统来完成这些基本任务。 #### 二、打开现有C程序 1. **启动《CC++程序设计学习与实验系统》**...
首先,微信小程序无需下载安装,用户通过微信即可直接使用,极大地降低了使用门槛。其次,小程序拥有与原生应用相近的用户体验,同时加载速度快,响应迅速,保证了良好的使用感受。此外,微信小程序还提供了丰富的...
首先,微信小程序无需下载安装,用户通过微信即可直接使用,极大地降低了使用门槛。其次,小程序拥有与原生应用相近的用户体验,同时加载速度快,响应迅速,保证了良好的使用感受。此外,微信小程序还提供了丰富的...
首先,微信小程序无需下载安装,用户通过微信即可直接使用,极大地降低了使用门槛。其次,小程序拥有与原生应用相近的用户体验,同时加载速度快,响应迅速,保证了良好的使用感受。此外,微信小程序还提供了丰富的...
首先,微信小程序无需下载安装,用户通过微信即可直接使用,极大地降低了使用门槛。其次,小程序拥有与原生应用相近的用户体验,同时加载速度快,响应迅速,保证了良好的使用感受。此外,微信小程序还提供了丰富的...
在Java程序设计的世界里,流派众多,每个程序员都有自己的编程风格和偏好。这篇博客“Java程序设计,你属于哪一流派?”或许能帮助我们理解这些不同的编程思想,并找到适合自己的编程之道。虽然描述中没有给出具体的...
你可以把它想象成一个容器,里面可以放很多个元素,每个元素都有自己的索引,通常从0开始。 2. **数组控件**:在VB的窗体设计中,数组控件如Array Control或Control Array允许你一次性创建和管理多个控件,比如...
首先,微信小程序无需下载安装,用户通过微信即可直接使用,极大地降低了使用门槛。其次,小程序拥有与原生应用相近的用户体验,同时加载速度快,响应迅速,保证了良好的使用感受。此外,微信小程序还提供了丰富的...