DANCE WITH JAVA

          開發出高質量的系統

          常用鏈接

          統計

          積分與排名

          好友之家

          最新評論

          你的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("?}
          }

          用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 ret = pkger.parseOutput(new FileInputStream(f));
          ??pkger.debugEnabled = true;
          ??pkger.pkgResources(ret, "G:/jdkfit/jar/Hello.jar");

          ?}

          ?private boolean debugEnabled;

          ?public List parseOutput(InputStream in) throws IOException {
          ??ArrayList ret = new ArrayList();
          ??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 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();
          ?}
          }

          posted on 2006-11-06 11:34 dreamstone 閱讀(526) 評論(0)  編輯  收藏 所屬分類: jdk相關

          主站蜘蛛池模板: 罗源县| 旅游| 固安县| 太原市| 察哈| 达拉特旗| 安顺市| 雷山县| 绵竹市| 广汉市| 蕲春县| 潍坊市| 鸡东县| 广宁县| 莱州市| 伊春市| 镇巴县| 永修县| 镶黄旗| 哈尔滨市| 甘南县| 城固县| 萍乡市| 莎车县| 钟祥市| 永寿县| 定远县| 台北市| 朝阳县| 望城县| 水城县| 阿巴嘎旗| 威信县| 洛扎县| 玉树县| 天全县| 江北区| 仁寿县| 普陀区| 伊金霍洛旗| 金堂县|