Java應(yīng)用定制工廠(以下簡稱為JCB,Java Customization Builder)是一個針對Java輕量級桌面應(yīng)用進(jìn)行精簡優(yōu)化的小工具,使用它可以精簡你的jar包,并自動生成一個精簡的JRE,也可以使用它生成一個Exe啟動引導(dǎo)程序,并且能夠?qū)δ愕腏ava應(yīng)用自動做Pack200和Unpack200處理。使用本工具定制的Java桌面應(yīng)用通常不會超過10M(包含JRE),SWT客戶端程序相對于Swing客戶端程序更小,一般不會超過5M。
JCB是一個Java應(yīng)用,所以目標(biāo)機(jī)器上必須安裝1.5以上版本的JDK用以啟動JCB,但是JCB可以用來精簡1.4版的JRE,并且JRE1.4精簡后的體積遠(yuǎn)小于1.5以上的版本。
1.新建JCB項(xiàng)目
精簡JRE的步驟比較繁瑣,有可能精簡失敗,為了不重復(fù)之前的步驟,JCB提供一個項(xiàng)目文件用來保存精簡配置信息,擴(kuò)展名為jcprj。這里我們創(chuàng)建一個項(xiàng)目,名為JCB
Wizard需要輸入一個工程名和指定工程位置,至于下面的應(yīng)用程序位置和定制JRE位置由JCB自動指定,這兒顯示出來僅供參考。
此時(shí)最好Ctrl+S保存一下項(xiàng)目,否則退出后你之前的配置信息會全部丟失,因?yàn)槟悴]有制定一個可用的項(xiàng)目配置文件。
2. 配置JCB項(xiàng)目

首先指定項(xiàng)目需要的jar文件,然后依次選擇項(xiàng)目的main class,啟動路徑默認(rèn)為空,一般來說無需指定。然后設(shè)定應(yīng)用程序參數(shù)和虛擬機(jī)參數(shù)。最后選定需要精簡的JRE,JCB當(dāng)前支持1.4-1.7版本的JRE,未來可能會支持更高版本的JRE。
右下角有2個單選按鈕:全部重新運(yùn)行和增量運(yùn)行。全部重新運(yùn)行就會放棄之前的運(yùn)行結(jié)果,增量運(yùn)行就是會保留以前的運(yùn)行結(jié)果。
然后點(diǎn)擊“以Verbose模式運(yùn)行”按鈕。Verbose模式運(yùn)行Java程序,會顯示JVM加載的全部類信息,JCB需要這些類信息進(jìn)行JRE的精簡,所以請盡可能的把應(yīng)用所有的功能盡可能的跑一遍,跑的越全面,導(dǎo)致精簡出錯的可能性就越低。

Verbose運(yùn)行結(jié)果,這個頁面的顯示信息僅供參考,無實(shí)際用處。
3. 分析項(xiàng)目的類依賴項(xiàng)

分析類依賴模式有2個選項(xiàng):重新完全分析和增量分析。完全分析會花費(fèi)較多的時(shí)間。當(dāng)使用verbose模式增量運(yùn)行后,可以使用增量模式分析類依賴項(xiàng),這樣可以節(jié)約大量的時(shí)間。類依賴分析會反編譯所有運(yùn)行的類,分析類引用關(guān)系,但是無法獲取Class.forName這類動態(tài)類加載信息,所以需要Verbose模式運(yùn)行的盡量全面,以避免這些動態(tài)加載的類的缺失。
為什么需要分析類依賴關(guān)系呢?因?yàn)椴煌牟僮飨到y(tǒng),不同的硬件配置,JRE可能會采取策略模式加載不同的類,或者一些異常,Verbose模式一般不會加載,這樣換個硬件環(huán)境,僅僅使用Verbose模式的類可能會導(dǎo)致ClassNotFound這樣的異常,導(dǎo)致Java程序崩潰。
4. 精簡JRE

精簡JRE有兩種模式:使用Verbose運(yùn)行結(jié)果和使用類依賴分析結(jié)果。前者只包含Verbose分析出來的類,精簡出來的JRE包很小,但是基本不具備跨平臺性。所以一般來說推薦選擇后者。
如果你的程序包含Swing的客戶端,并且比較復(fù)雜的話,最好選中包含Swing選項(xiàng)。因?yàn)镾wing的設(shè)計(jì)完全是動態(tài)化的加載,全部使用Class.forName方式,類依賴分析對Swing是無效的。當(dāng)然選中該選項(xiàng)后,JRE的體積會增加許多。比較好的解決方案,是使用SWT替代Swing進(jìn)行開發(fā),或者盡量把你的程序跑全面,包括各種異常界面都跑出來。
右下角有兩個按鈕,是用來自定義類和資源文件的,比如移除JAR包的MD5文件或者無用的文件。或者測試運(yùn)行發(fā)現(xiàn)ClassNotFound異常,手動把缺少的類加進(jìn)去,然后JCB會自動運(yùn)行增量類依賴分析加載所有可能需要的類。
選擇左上角的“精簡Jar包”按鈕,就可以對JRE進(jìn)行精簡了,精簡完畢后可以點(diǎn)擊“查看精簡結(jié)果”按鈕進(jìn)行查看。
5.定制JRE

上圖顯示了JRE精簡結(jié)果,JCB會自動分析所有的Class,生成精簡版JRE,包括需要的JAR,DLL和資源文件。一般來說精簡出來的JRE,普通功能都能正確完成,但是不排除有些功能不能正常使用,比如缺少某個資源文件或者DLL,需要手工添加。
為了保證精簡的正確性,你需要進(jìn)行運(yùn)行測試,這一步是必須的,而且最好和Verbose運(yùn)行模式一樣,把所有的功能都跑一遍,確認(rèn)精簡無誤。

如果測試運(yùn)行有誤的話,請根據(jù)運(yùn)行錯誤報(bào)告進(jìn)行分析,如果缺少類,請使用Verbose模式重新運(yùn)行相應(yīng)的功能,或者在步驟四手工添加需要的類,然后重新生成依賴的JRE。如果缺少相關(guān)的DLL或者資源文件,也請手工添加,并且取消步驟四的“清理工作區(qū)選項(xiàng)”,否則每次精簡JRE都需要重新手工添加。
到此為止,精簡JRE部分就算全部完成了,你最好使用Ctrl+S保存一下結(jié)果,以避免下次重做項(xiàng)目。
JCB項(xiàng)目下載地址:http://www.sourceforge.net/projects/jcb
JCB是一個Java應(yīng)用,所以目標(biāo)機(jī)器上必須安裝1.5以上版本的JDK用以啟動JCB,但是JCB可以用來精簡1.4版的JRE,并且JRE1.4精簡后的體積遠(yuǎn)小于1.5以上的版本。
1.新建JCB項(xiàng)目
精簡JRE的步驟比較繁瑣,有可能精簡失敗,為了不重復(fù)之前的步驟,JCB提供一個項(xiàng)目文件用來保存精簡配置信息,擴(kuò)展名為jcprj。這里我們創(chuàng)建一個項(xiàng)目,名為JCB

Wizard需要輸入一個工程名和指定工程位置,至于下面的應(yīng)用程序位置和定制JRE位置由JCB自動指定,這兒顯示出來僅供參考。
此時(shí)最好Ctrl+S保存一下項(xiàng)目,否則退出后你之前的配置信息會全部丟失,因?yàn)槟悴]有制定一個可用的項(xiàng)目配置文件。
2. 配置JCB項(xiàng)目

首先指定項(xiàng)目需要的jar文件,然后依次選擇項(xiàng)目的main class,啟動路徑默認(rèn)為空,一般來說無需指定。然后設(shè)定應(yīng)用程序參數(shù)和虛擬機(jī)參數(shù)。最后選定需要精簡的JRE,JCB當(dāng)前支持1.4-1.7版本的JRE,未來可能會支持更高版本的JRE。
右下角有2個單選按鈕:全部重新運(yùn)行和增量運(yùn)行。全部重新運(yùn)行就會放棄之前的運(yùn)行結(jié)果,增量運(yùn)行就是會保留以前的運(yùn)行結(jié)果。
然后點(diǎn)擊“以Verbose模式運(yùn)行”按鈕。Verbose模式運(yùn)行Java程序,會顯示JVM加載的全部類信息,JCB需要這些類信息進(jìn)行JRE的精簡,所以請盡可能的把應(yīng)用所有的功能盡可能的跑一遍,跑的越全面,導(dǎo)致精簡出錯的可能性就越低。

Verbose運(yùn)行結(jié)果,這個頁面的顯示信息僅供參考,無實(shí)際用處。
3. 分析項(xiàng)目的類依賴項(xiàng)

分析類依賴模式有2個選項(xiàng):重新完全分析和增量分析。完全分析會花費(fèi)較多的時(shí)間。當(dāng)使用verbose模式增量運(yùn)行后,可以使用增量模式分析類依賴項(xiàng),這樣可以節(jié)約大量的時(shí)間。類依賴分析會反編譯所有運(yùn)行的類,分析類引用關(guān)系,但是無法獲取Class.forName這類動態(tài)類加載信息,所以需要Verbose模式運(yùn)行的盡量全面,以避免這些動態(tài)加載的類的缺失。
為什么需要分析類依賴關(guān)系呢?因?yàn)椴煌牟僮飨到y(tǒng),不同的硬件配置,JRE可能會采取策略模式加載不同的類,或者一些異常,Verbose模式一般不會加載,這樣換個硬件環(huán)境,僅僅使用Verbose模式的類可能會導(dǎo)致ClassNotFound這樣的異常,導(dǎo)致Java程序崩潰。
4. 精簡JRE

精簡JRE有兩種模式:使用Verbose運(yùn)行結(jié)果和使用類依賴分析結(jié)果。前者只包含Verbose分析出來的類,精簡出來的JRE包很小,但是基本不具備跨平臺性。所以一般來說推薦選擇后者。
如果你的程序包含Swing的客戶端,并且比較復(fù)雜的話,最好選中包含Swing選項(xiàng)。因?yàn)镾wing的設(shè)計(jì)完全是動態(tài)化的加載,全部使用Class.forName方式,類依賴分析對Swing是無效的。當(dāng)然選中該選項(xiàng)后,JRE的體積會增加許多。比較好的解決方案,是使用SWT替代Swing進(jìn)行開發(fā),或者盡量把你的程序跑全面,包括各種異常界面都跑出來。
右下角有兩個按鈕,是用來自定義類和資源文件的,比如移除JAR包的MD5文件或者無用的文件。或者測試運(yùn)行發(fā)現(xiàn)ClassNotFound異常,手動把缺少的類加進(jìn)去,然后JCB會自動運(yùn)行增量類依賴分析加載所有可能需要的類。
選擇左上角的“精簡Jar包”按鈕,就可以對JRE進(jìn)行精簡了,精簡完畢后可以點(diǎn)擊“查看精簡結(jié)果”按鈕進(jìn)行查看。
5.定制JRE

上圖顯示了JRE精簡結(jié)果,JCB會自動分析所有的Class,生成精簡版JRE,包括需要的JAR,DLL和資源文件。一般來說精簡出來的JRE,普通功能都能正確完成,但是不排除有些功能不能正常使用,比如缺少某個資源文件或者DLL,需要手工添加。
為了保證精簡的正確性,你需要進(jìn)行運(yùn)行測試,這一步是必須的,而且最好和Verbose運(yùn)行模式一樣,把所有的功能都跑一遍,確認(rèn)精簡無誤。

如果測試運(yùn)行有誤的話,請根據(jù)運(yùn)行錯誤報(bào)告進(jìn)行分析,如果缺少類,請使用Verbose模式重新運(yùn)行相應(yīng)的功能,或者在步驟四手工添加需要的類,然后重新生成依賴的JRE。如果缺少相關(guān)的DLL或者資源文件,也請手工添加,并且取消步驟四的“清理工作區(qū)選項(xiàng)”,否則每次精簡JRE都需要重新手工添加。
到此為止,精簡JRE部分就算全部完成了,你最好使用Ctrl+S保存一下結(jié)果,以避免下次重做項(xiàng)目。
JCB項(xiàng)目下載地址:http://www.sourceforge.net/projects/jcb