你的HelloWorld有多大
关键词:
jdk size
你经常写一些有趣的小程序么?你想分发你的程序么? 你怎么保证目标机上有jre呢? 你打包一个? 一个jre几十兆,若是大工程,带个jdk也无所谓,如果你自己的类文件一共还没有1兆,就要带个几十兆的jre,你能接受么? 如果你想分发你的小程序,那么我们来进行jre瘦身吧! 看看我们的HelloWorld最小能多小。
jre带的很多文件可能在你的程序里并不需要,或者你的程序只需要某个几兆大的jar里面的一个class。所以,理论上我们可以对jre进行减肥运动。把你不需要的jar和文件删掉,剩下的跟你的程序一起打个包。
下面以jdk5.0开发的一个HelloWorld为例来简单做个试验。
开发我们的Hello软件:
class Hello {
public static void main(String[] args) {
System.out.println("http://blog.javadoc.cn");
}
}
用java -verbose Hello 执行程序就能看到所有用到的class。当然,如果你的程序比较复杂,中间有条件跳转的话,一次执行可能并不能将所有的可能用到的class打印出来。这个不是大问题,你可以尝试别的办法来找出所有用到的文件。
1。把这些class找出来。java -verbose Hello>G:/jdkfit/Hello.list
当然,用Runtime.exec("java -verbose Hell").getInputStream()来获得输出结果直接使用更好。
2。打个包。我们来写个程序来完成这个任务吧。执行下边这个Packager 程序。
3。拷贝一个jre,把我们自己打的jar覆盖jre的rt.jar,用这个jre执行java Hello。最好做个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 {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
File f = new File("G:/jdkfit/Hello.list");
Packager pkger = new Packager();
List<string> ret = pkger.parseOutput(new FileInputStream(f));
pkger.debugEnabled = true;
pkger.pkgResources(ret, "G:/jdkfit/jar/Hello.jar");
}
private boolean debugEnabled;
public List<string> parseOutput(InputStream in) throws IOException {
ArrayList<string> ret = new ArrayList<string>();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = 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();
}
return ret;
}
public void pkgResources(List<string> res, String fileName)
throws IOException {
File f = new File(fileName);
if (!f.exists()) {
f.createNewFile();
}
byte[] buf = new byte[1024];
JarOutputStream out = new JarOutputStream(
new FileOutputStream(fileName));
for (String s : res) {
s = s.replace('.', '/') + ".class";
if (debugEnabled) {
System.out.println("adding: " + s);
}
InputStream in = this.getClass().getClassLoader()
.getResourceAsStream(s);
out.putNextEntry(new ZipEntry(s));
int w = in.read(buf);
while (w >= 0) {
out.write(buf, 0, w);
w = in.read(buf);
}
in.close();
}
out.finish();
out.close();
}
}
分享到:
相关推荐
版权声明:本文为CSDN博主「倦眼问酒书j」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_42328682/article/details/105504539
我们这里的工程名为helloworld。 6.这时软件自动添加基本的头文件,因为这个程序我们不需要其他的功能,所以 直接点击Next。 7.我们将base class 选为QDialog 对话框类。然后点击Next。 8.点击Finish,完成工程的...
本资源是“RPA之家”提供的AA视频教程的一部分,名为“20.Hello.rar”,内含一个视频文件:“【RPA之家转载AA视频教程】20.Hello World消息显示.mp4”。 在RPA的学习和实践中,"Hello World"通常是初学者入门的典型...
在网上找了很多资料,不过发现很多基于QT Designer开发的Hello World教程中只有文字描述而没有图的指导,即使是有不过文章在转载过程中都把图片“载”没了。为了鼓励大家在学习QT的开发,我在一些资料当中抽取了一个...
如果你有主类(包含`public static void main(String[] args)`方法的类),可以直接运行,如`java HelloWorld`。 3. **jar**:Java Archive工具,用于打包和管理多个Java类文件。例如,`jar cf myapp.jar ...
Netty入门-第一个例子HelloWorld,包含服务端和客户端代码。说明:所有代码属于从互联网、书本拷贝或者加工处理,能满足运行要求只用于交流和学习用 ———————————————— 版权声明:本文为CSDN博主「m0...
对于初学者,了解OSGi的运行机制和通过“Hello World”程序实践是入门的好方法。通过这个过程,开发者可以深入理解OSGi如何处理模块之间的依赖关系,以及如何动态地管理服务和组件。总的来说,OSGi不仅是一个框架,...
因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 1 // 用JNI实现 2 // 实例: 3 4 // 创建HelloWorld.java 5 class HelloWorld...
hello-world 初始 git 仓库,学习使用 学习使用git工具创建的仓库。 FIX_HTTPS TOOL 一个简易脚本,用于修改脚本所在目录下文件中的 http 协议,替换成 https 协议。 HyperDown 为下载第三方的一个解析 *.MD 文件的...
TextBox ticker = new TextBox("Ticker Alert", "Hello, World!", 20, TextBox.ANY); ``` 2. **启用Ticker**:然后,通过调用TextBox的setTicker方法,可以设置Ticker的文本。这将启动Ticker的滚动效果。 ```...
在HelloWorld示例中,你将创建一个简单的Action类,其中包含一个名为execute的方法,该方法返回一个字符串结果,这个结果将决定视图如何被渲染。例如,你可以返回"success",这将导致框架加载对应的视图资源。 **...
例如,`"Hello""World"`表示字符串"HelloWorld"。 3. **LDR指令** `LDR`指令用于加载数据。当格式为`LDR r0,=0x022248`时,第二个参数是一个立即数,表示内存地址。若`LDR r0,[r2]`,则表示从寄存器`r2`指向的内存...
以下是一个简单的`HelloWorld`示例代码: ```objective-c #import int main(int argc, const char * argv[]) { printf("Hello World\n"); return 0; } ``` 这段代码展示了如何使用`#import`导入标准输入输出库...
最近在学习jQuery,在网上看到有几篇关于jQuery的文章,写的不错转载过来跟大家分享一下; 一、JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察。 不使用...
本文将介绍在Windows平台上下载、安装Qt Creator,并编写最简单的“Hello World”程序。同时,附录部分将探讨在Linux平台下相似的安装和编程方法。 首先,下载Qt Creator时,可以从Qt官方网站下载适合当前操作系统...
本仓库发布的helloworld项目中涉及的任何脚本,只能用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确,可以和有效,请根据情况自行判断。 本项目内所有资源文件,禁止任何公众号,自媒体进行任何形式...
例如,“Hello” + “World”将返回“HelloWorld”。 ##### 2.3 运算符 PocketC支持多种运算符,按照优先级排序如下: - **赋值运算符**:`=` - **逻辑运算符**:`||`(逻辑或)、`&&`(逻辑与) - **位运算符**:`...
**二、WebWork安装 - HelloWorld** WebWork的安装通常包括以下步骤: 1. **添加依赖**:将WebWork的JAR文件添加到项目的类路径中。 2. **配置web.xml**:在Web应用的配置文件中,添加WebWork的过滤器和监听器。 3....
- 安装QtCreator和编写一个简单的“Hello World”程序。 - 编写多窗口程序、登录对话框和添加菜单图标。 - 使用布局管理器、实现文本编辑和查找功能。 - 文档中还提到了状态栏显示、鼠标和键盘事件处理。 - ...