`
dreamstone
  • 浏览: 288432 次
  • 来自: ...
文章分类
社区版块
存档分类

你的HelloWorld有多大(转载)

阅读更多

转自http://nonconductor.bokee.com/5085956.html

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

分享到:
评论

相关推荐

    SpringBootDay01-HelloWorld-1.0-SNAPSHOT.jar

    版权声明:本文为CSDN博主「倦眼问酒书j」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_42328682/article/details/105504539

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    我们这里的工程名为helloworld。 6.这时软件自动添加基本的头文件,因为这个程序我们不需要其他的功能,所以 直接点击Next。 7.我们将base class 选为QDialog 对话框类。然后点击Next。 8.点击Finish,完成工程的...

    【RPA之家转载AA视频教程】20.Hello.rar

    本资源是“RPA之家”提供的AA视频教程的一部分,名为“20.Hello.rar”,内含一个视频文件:“【RPA之家转载AA视频教程】20.Hello World消息显示.mp4”。 在RPA的学习和实践中,"Hello World"通常是初学者入门的典型...

    QT Designer学习

    在网上找了很多资料,不过发现很多基于QT Designer开发的Hello World教程中只有文字描述而没有图的指导,即使是有不过文章在转载过程中都把图片“载”没了。为了鼓励大家在学习QT的开发,我在一些资料当中抽取了一个...

    jdk常用命令

    如果你有主类(包含`public static void main(String[] args)`方法的类),可以直接运行,如`java HelloWorld`。 3. **jar**:Java Archive工具,用于打包和管理多个Java类文件。例如,`jar cf myapp.jar ...

    nettyhello_V0.1_IDEA.zip

    Netty入门-第一个例子HelloWorld,包含服务端和客户端代码。说明:所有代码属于从互联网、书本拷贝或者加工处理,能满足运行要求只用于交流和学习用 ———————————————— 版权声明:本文为CSDN博主「m0...

    转载osgi学习,开发框架

    对于初学者,了解OSGi的运行机制和通过“Hello World”程序实践是入门的好方法。通过这个过程,开发者可以深入理解OSGi如何处理模块之间的依赖关系,以及如何动态地管理服务和组件。总的来说,OSGi不仅是一个框架,...

    JAVA调用C语言写的SO文件

    因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 1 // 用JNI实现 2 // 实例: 3 4 // 创建HelloWorld.java 5 class HelloWorld...

    2048游戏java笔试题-hello-world:我是一个新手.学习使用的仓库。文档转载请注明出处,谢谢

    hello-world 初始 git 仓库,学习使用 学习使用git工具创建的仓库。 FIX_HTTPS TOOL 一个简易脚本,用于修改脚本所在目录下文件中的 http 协议,替换成 https 协议。 HyperDown 为下载第三方的一个解析 *.MD 文件的...

    TextBox Ticker Alert 转载

    TextBox ticker = new TextBox("Ticker Alert", "Hello, World!", 20, TextBox.ANY); ``` 2. **启用Ticker**:然后,通过调用TextBox的setTicker方法,可以设置Ticker的文本。这将启动Ticker的滚动效果。 ```...

    webwork教程

    在HelloWorld示例中,你将创建一个简单的Action类,其中包含一个名为execute的方法,该方法返回一个字符串结果,这个结果将决定视图如何被渲染。例如,你可以返回"success",这将导致框架加载对应的视图资源。 **...

    ARM汇编嵌入式学习博客转载.pdf

    例如,`"Hello""World"`表示字符串"HelloWorld"。 3. **LDR指令** `LDR`指令用于加载数据。当格式为`LDR r0,=0x022248`时,第二个参数是一个立即数,表示内存地址。若`LDR r0,[r2]`,则表示从寄存器`r2`指向的内存...

    object-c基础教程

    以下是一个简单的`HelloWorld`示例代码: ```objective-c #import int main(int argc, const char * argv[]) { printf("Hello World\n"); return 0; } ``` 这段代码展示了如何使用`#import`导入标准输入输出库...

    jQuery学习笔记之入门

    最近在学习jQuery,在网上看到有几篇关于jQuery的文章,写的不错转载过来跟大家分享一下; 一、JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察。 不使用...

    Qt Creator

    本文将介绍在Windows平台上下载、安装Qt Creator,并编写最简单的“Hello World”程序。同时,附录部分将探讨在Linux平台下相似的安装和编程方法。 首先,下载Qt Creator时,可以从Qt官方网站下载适合当前操作系统...

    maotai

    本仓库发布的helloworld项目中涉及的任何脚本,只能用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确,可以和有效,请根据情况自行判断。 本项目内所有资源文件,禁止任何公众号,自媒体进行任何形式...

    pocketc 教程 转载 小羊编写

    例如,“Hello” + “World”将返回“HelloWorld”。 ##### 2.3 运算符 PocketC支持多种运算符,按照优先级排序如下: - **赋值运算符**:`=` - **逻辑运算符**:`||`(逻辑或)、`&&`(逻辑与) - **位运算符**:`...

    webwork教程(经典)

    **二、WebWork安装 - HelloWorld** WebWork的安装通常包括以下步骤: 1. **添加依赖**:将WebWork的JAR文件添加到项目的类路径中。 2. **配置web.xml**:在Web应用的配置文件中,添加WebWork的过滤器和监听器。 3....

    qt教程及软件qtcn.pdf

    - 安装QtCreator和编写一个简单的“Hello World”程序。 - 编写多窗口程序、登录对话框和添加菜单图标。 - 使用布局管理器、实现文本编辑和查找功能。 - 文档中还提到了状态栏显示、鼠标和键盘事件处理。 - ...

Global site tag (gtag.js) - Google Analytics