怎樣精簡jre 轉載

java是跨平臺的東西,但有的時候我們不需要它去跨平臺,我們希望能想c++做的程序一樣,編碼和簡單處理後能夠在系統運行。
這次的項目是要放到classmate pc上,這款機器是爲學生訂做的,系統資源很有限,一個jre1.5就70多M,放在上面肯定是不行的。於是我找了一些相關的資料,提供鏈接如下:
如何製作最小的RCP程序壓縮包(包含JRE)
java程序發佈之jre篇
基本知道思路了,我把寫的程序打包成jar,能雙擊運行了,然後拷貝一個jre到程序目錄下,具體是這樣的,目錄叫dict,dict下面有dict.jar、jre(目錄),然後寫了一個cmd腳本:
@echo off
set path=%cd%/jre/bin
java -jar -verbose:class dict.jar >>class.txt
pause
這樣程序使用的就是當前目錄下的jre,程序運行後,最好把所有的功能使用一遍,這樣輸出了一個文件class.txt,裏面有所有需要的class,其格式如下:
[Opened D:/data/dict/jre/lib/rt.jar]
[Loaded java.lang.Object from D:/data/dict/jre/lib/rt.jar]
[Loaded java.io.Serializable from D:/data/dict/jre/lib/rt.jar]
[Loaded java.lang.Comparable from D:/data/dict/jre/lib/rt.jar]
[Loaded java.lang.CharSequence from D:/data/dict/jre/lib/rt.jar]
[Loaded org.apache.lucene.index.CompoundFileReader$FileEntry from file:/D:/data/dict/dict.jar]

我們依照這個文件來裁剪rt.jar:
首先在utralEdit中進行一些處理,去掉所有不是rt.jar中的class的行,去掉from後面的,去掉loaded等無關項目,再把“.”替換成“/”.這個可以利用正則表達式等輕鬆處理。處理完後得到的文件類似如下格式:
java/lang/Object
java/io/Serializable
java/lang/Comparable
java/lang/CharSequence
java/lang/String 
然後寫一個腳本或者程序處理,將rt中需要的的class拷貝到另一個對應的文件夾rt1,我用java寫了一個,沒有時間仔細改,但能完成人物了。代碼如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
我裁剪出來的rt大小爲500多k。然後將rt1裏面的目錄和文件打包成rt.zip,改名爲rt.jar,然後替換原來的rt.jar。具體的步驟可以參考上面提到的那兩篇文章。

public class ReduceRt {
//文件拷貝
public static boolean copy(String file1,String file2)
{
try //must try and catch,otherwide will compile error
{
// instance the File as file_in and file_out
java.io.File file_in=new java.io.File(file1);
java.io.File file_out=new java.io.File(file2);
FileInputStream in1=new FileInputStream(file_in);
FileOutputStream out1=new FileOutputStream(file_out);
byte[] bytes=new byte[1024];
int c;
while((c=in1.read(bytes))!=-1)
out1.write(bytes,0,c);
in1.close();
out1.close();
return(true); //if success then return true
}

catch(Exception e)
{
System.out.println("Error!");
return(false); //if fail then return false
}
}
//讀取路徑,copy
public static int dealClass(String needfile ,String sdir,String odir) throws IOException
{
int sn = 0; //成功個數

File usedclass = new File(needfile);
if(usedclass.canRead())
{
String line = null;
LineNumberReader reader = new LineNumberReader(new InputStreamReader(new FileInputStream(usedclass),"UTF-8"));
while((line = reader.readLine())!=null)
{
line = line.trim();
int dirpos =line.lastIndexOf("/");
if(dirpos>0)
{
String dir = odir+ line.substring(0,dirpos);
File fdir = new File(dir);
if(!fdir.exists())
fdir.mkdirs();
String sf = sdir + line + ".class";
String of = odir + line + ".class";
boolean copy_ok=copy(sf.trim(),of.trim());
if(copy_ok)
sn++;
else
{
System.out.println(line);
}

}

}
}
return sn;

}

public static void main(String[] args)
{
String needfile = "usedclass.txt";
String sdir = "./rt/";
String odir = "./rt1/";
try {
int sn = dealClass(needfile,sdir,odir);
System.out.print(sn);
} catch (IOException e) {
// TODO 自動生成 catch 塊
e.printStackTrace();
}

}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章