From: http://blog.csdn.net/cping1982/archive/2008/08/21/2806598.aspx
精簡JRE體積的小工具:http://blog.csdn.net/cping1982/archive/2008/09/02/2865198.aspx
項目地址:http://code.google.com/p/greenvm/
關鍵字:JRE,精簡,壓縮,JVM,JAVA.NET,虛擬機,綠色軟件,最小空間,脫框,壓縮,GREEN,GREENJVM

9月6日更新版本為 0.1.1.4
變更:
增加[SET_START_MAIN_CLASS_AUTO_LOAD]參數,當此項為真時,程序將設置主函數所在類開機自動啟動。
增加初始化界面設置,參數如下:
PS:本文中所有關于JRE部分皆指Sun JRE。
眾所周知,Java能夠運行于近乎所有的操作系統,包括Windows、 Mac或Linux等等。
對于任何組織或個人的Java應用而言,只要你的應用程序需要移植或多OS發布,那么將現有應用從一個系統移植到另一個操作系統將是件非常輕松的事情,因為Java使用了虛擬機機制,可以脫離OS的約束而獨立解釋并執行class。
但有利也有弊,對于很多程序而言,這也同時意味著你的用戶必須獲得JRE支持,也就是說他需要安裝JVM。但我國的現實情況卻是很多人別說讓他自己下載安裝JRE,你就是給他做好全[下一步]的安裝程序,他恐怕也連“下一步”都搞不定……||||
有鑒于此,我嘗試提供一種解決方案,我將它命名為:GreenJVM,也就是綠色的JVM。
GreenJVM是一個專為綠化Java應用而存在的小程序,以C++開發(昨晚上抽空寫的小應用程序,代碼原型以前在Blog發過:通過exe啟動class )。它的執行文件體積很小僅僅370KB,本身也是一個基于JNI的Java應用.真正的核心文件只有2個,一是GreenJVM.exe(執行文件),一個vm.cfg(配置文件),如下圖:

它的功能非常簡單,僅是解壓自帶的JRE并取代java.exe文件直接調度jvm.dll罷了。但就是這樣一個小程序,卻可以很輕松的實現Java軟件的綠色發布。
以千里冰封兄的YOYOPlayer為例(冰封兄blog:http://www.aygfsteel.com/hadeslee/),我們都知道這是一個非常之好的Java音樂播放器,在Java圈內已經小有名氣。但遺憾的是,對比千千靜聽這類知名軟件而言,了解它的人簡直比華南虎還要稀有......雖然軟件普及率低的原因多種多樣,但對Java應用而言,究其根本還是JVM安裝的關系。就像“媽是女人”的道理一樣,Java程序的運行環境必須有與其開發版本兼容的JRE存在,否則無法運作。也就是這道門檻,不知把多少普通用戶攔在了Java應用之外。
可能你會說這些是小事,的確,對我們這些Java程序員來講當然不存在任何問題;但令人遺憾的是,對絕大多數普通用戶,特別是并不成熟的中國數億網民而言(我是指軟件知識的平均值……其實牛人也很多……),安裝JRE這幾乎是件不可想象的艱巨任務;除非他們有必須使用不可的理由,否則需要下載第三方軟件的程序,絕對是第一時間被pass掉的(一般人使用軟件的準則就一條:簡單就用,麻煩就不用);無形中大大增加了Java軟件普及的難度,明明是很好的程序,卻只能在Java圈子里流傳,不禁令人扼腕。
事實上,我們可以通過極簡單的技術手段來突破這一限制,輕而易舉將Java應用做成綠色軟件,免除用戶這些不必要猶豫,令他們放心大膽的使用Java程序。
這個過程僅僅需要三步:
1、壓縮你的JRE:

目前GreenJVM支持rar和zip兩種方式的解壓。
2、設置vm.cfg:
vm.cfg內容配置如下:
3、發布應用,此時只需一個文件夾,就可以完全容納下整個Java應用了。
現在我們來看看一個基本完整JRE1.6壓縮包(去掉了bin下的exe文件)與YOYOPlayer放在一起后的空間占用情況,如下圖:

對比百來MB的JRE而言,現在總體不過20MB的體積已經是小的太多。只需直接丟給用戶這個文件夾,告訴用戶一句“雙擊EXE文件執行”,就能如常運行此程序,而不必再解釋或說明什么。
但饒是如此,20MB的音樂播放器,相較2MB左右的千千靜聽而言還是太大了,對很多普通用戶來說依舊難以接受,他們不會去考慮Java特性,只會去想“千千2MB就能搞定的事,你怎么就要用20MB才行?肯定是水平不行,不用……”,Java程序員們集體抱頭哭~~~。為了避免這類情況的發生,這時就需要我們在jre的體積上做些文章了。
就和人的大腦活動區域一樣,相對于我們每個應用而言,JRE中也至少會有20MB以上(只多不少)是被浪費掉的終身不使用區域,而這些區域中的組件及類庫的唯一作用就是貪婪的占用硬盤空間罷了~因此找出這些區域并縮減它,就能最大限度的減小程序體積。(雖然sun或其它jvm提供商大多都反對這樣,但我們只是在實驗罷了:),況且我認為他們早晚也會開放jvm定制服務的。 )
以YOYOPlayer為例,實際上我們只需在JRE中保留其音頻支持、AWT/SWing支持、及網絡支持等部分就好,其余的部分大可刪掉不要。
下例我做了一個精簡的JRE壓縮包,如下圖:
只用了不足8MB的空間,便足以完成YOYOPlayer的全部功能.
我們把這個JRE和YOYOPlayer放在一起,全部加起來也不過9MB多一點,而YOYOPlayer依舊可以在無JRE系統中正常運行.效果如下圖:

當然,如果再繼續刪的話,占用空間肯定還會有一定的下降幅度,我認為至少能將JRE壓縮到6MB以內;但現實意義不大,畢竟不是做嵌入式開發,為了1,2MB費那么大勁不值當的……。事實上,對于絕大多數Java應用而言,壓縮后至多9MB左右的空間占用便綽綽有余了,況且還有進一步精簡的余地。
如下例,這是我以前在Blog發過的一個FPS測速程序,效果如下:

現在我使用一個針對AWT使用而精簡的JRE,在另一臺無Java環境的電腦上測試,結果如下圖:

可以看到,程序正常運行,而且FPS數有明顯提高,并沒有因為直接調用JVM而削弱了性能.
這個完全支持AWT組件的JRE和執行程序全打成一個rar文件也不過4MB左右(PS:由于最占空間的JRE已經壓縮過,所以再壓縮其實意義不大……),實際上與本地程序的大小已經相差無幾了.
不過就算是4MB的JRE也不能說很小了,如果愿意深度精簡的話,2MB的JRE運行敝人的loonframework-game(尚未發布)都已經綽綽有余。就運行庫而言,對比rmxp(ruby語言的游戲開發玩具……)還要小的多。
這些幾MB的Java應用,放到U盤里隨身攜帶綽綽有余,要用時在U盤里便可以直接運行(當然,由于api依賴的關系,除非我為其它平臺重新制作啟動文件,否則只支持提供win32 api的系統),不用了就直接刪文件,環保安全無污染,標準的綠色食品,不買也看看啊~
再稍微正規點做個安裝文件(綠色軟件不能等同于無需安裝的軟件,畢竟安裝只不過是個部署過程,和綠不綠色沒有實質上關系。愚以為,只要不改變現有系統配置,不依賴本地系統組件的軟件都可稱為綠色軟件;相反就算不用安裝,一執行就注冊到系統中一堆亂七八糟東西的軟件同樣不能說是綠色的。),那么程序的體積還將進一步減小。
以YOYOPlayer為例,最終提供給用戶一個5MB甚至4MB左右的綠色應用是絕對可以做到的,對比5.2.1版占用2.85MB空間的千千靜聽來說,已經看不出兩者間有太大區別,普通的音樂愛好者已經沒有理由不下載看看了.
而一旦他們用了,就會慢慢發現Java應用的精妙之處,他會發現無論以后他用什么系統,這套軟件他都將無法自拔的使用下去.
項目地址:http://code.google.com/p/greenvm/
————————————————————————————————————————————
0.1.1版發布:
項目地址:http://code.google.com/p/greenvm/
新增[SET_LOCAL_JRE_UPDATE]項,通過此項可以命令本地JRE自動更新。
一起發布的是一個Java仿雷電游戲(源碼見包內),共設置有三關三個小BOSS。采用有GreenJVM發布,因此可以運行在未裝載JRE的Windows系統之上。 (N久以前寫的一個古董……湊活看吧……)。
準備寫到1.0時再去Sourceforge申請項目……現在Loonframework還沒弄完呢……
0.1.1.3版發布:
項目地址:http://code.google.com/p/greenvm/
新增7z格式壓縮包解壓支持,建議使用此格式進行虛擬機壓縮。
_____________________________________________________________________________________________________________
_____________________________________________________________________________________________________________
GreenDotNet0.1.0
GreenDotNet是一個根據GreenJVM移植的應用,目標是實現.netframework虛擬機的綠色發布。
GreenDotNet 0.1.1 簡要說明
1、本程序是一個非常簡單的.Net程序免安裝發布工具,可以滿足絕大部分.Net framework2.0及以下環境開發之桌面應用的綠色發布及使用。
2、本程序目前階段不嘗試虛擬.Net運行環境(一是難寫,二是敝人極懶,三我是Java程序員,明白?^^……),虛擬機初始化后將直接通過GreenDotNet.exe在Windows中布署最簡.Net環境,故對程序運行效率無影響。
3、虛擬機壓縮包中僅刪除了System.Web(如果要用編碼之類的功能自己實現就好,不然這堆東西也5MB左右呢|||),保留了其余一切鏈接庫(如操作數據庫必須的System.Data等,不要就自己刪吧~),因此絕大多數操作皆可在此環境下正常使用。
4、由于采用了真實的Windows環境進行布署,因此加密或混淆后的.Net程序依舊可以正常在此環境下運行。
5、相較使用Salamander .NET Linker等收費工具(含使用飛信運行框架)而言,這只是一個簡寫的.Net布署方式,故而絕對不會存在版權或收費等問題。
相關文件說明:
GreenDotNet.exe : 啟動文件,它將起到本地環境探針及布署.Net環境的作用。
vm.cfg : 配置文件,決定GreenDotNet.exe對系統進行的相關操作。
dotnet.pack(8MB) : 虛擬機壓縮包,使用7z格式產生,目前僅提供.Net 2.0版本支持,不保證2.0以下或以上版本開發之應用在此環境能夠正常運行。
vm.cfg配置如下:
項目地址:http://code.google.com/p/greenvm/
示例程序:
Zero漫天星辰漫畫下載器是一個.Net的在線漫畫檢索及下載工具,采用.netframework1.1開發(使用.net純粹是由于拖控件方便|||),作為GreenDotNet的示例程序一起發布.

精簡JRE體積的小工具:http://blog.csdn.net/cping1982/archive/2008/09/02/2865198.aspx
項目地址:http://code.google.com/p/greenvm/
關鍵字:JRE,精簡,壓縮,JVM,JAVA.NET,虛擬機,綠色軟件,最小空間,脫框,壓縮,GREEN,GREENJVM

9月6日更新版本為 0.1.1.4
變更:
增加[SET_START_MAIN_CLASS_AUTO_LOAD]參數,當此項為真時,程序將設置主函數所在類開機自動啟動。
增加初始化界面設置,參數如下:
- //程序啟動前使用初始界面(此項為false時,以下設定皆無效)
- SET_START_INIT=true
- //使用的初始界面圖片
- SET_START_IMAGE=init.bmp
- //設置true時初始窗體將自動居中,同時top及left無效
- SET_START_LOCATION_AUTO=true
- // 設置初始窗體在桌面的X軸
- SET_START_LOCATION_LEFT=100
- // 設置初始窗體在桌面的Y軸
- SET_START_LOCATION_TOP=100
- // 設定初始窗體顯示時間
- SET_START_TIME=1000
PS:本文中所有關于JRE部分皆指Sun JRE。
眾所周知,Java能夠運行于近乎所有的操作系統,包括Windows、 Mac或Linux等等。
對于任何組織或個人的Java應用而言,只要你的應用程序需要移植或多OS發布,那么將現有應用從一個系統移植到另一個操作系統將是件非常輕松的事情,因為Java使用了虛擬機機制,可以脫離OS的約束而獨立解釋并執行class。
但有利也有弊,對于很多程序而言,這也同時意味著你的用戶必須獲得JRE支持,也就是說他需要安裝JVM。但我國的現實情況卻是很多人別說讓他自己下載安裝JRE,你就是給他做好全[下一步]的安裝程序,他恐怕也連“下一步”都搞不定……||||
有鑒于此,我嘗試提供一種解決方案,我將它命名為:GreenJVM,也就是綠色的JVM。
GreenJVM是一個專為綠化Java應用而存在的小程序,以C++開發(昨晚上抽空寫的小應用程序,代碼原型以前在Blog發過:通過exe啟動class )。它的執行文件體積很小僅僅370KB,本身也是一個基于JNI的Java應用.真正的核心文件只有2個,一是GreenJVM.exe(執行文件),一個vm.cfg(配置文件),如下圖:

它的功能非常簡單,僅是解壓自帶的JRE并取代java.exe文件直接調度jvm.dll罷了。但就是這樣一個小程序,卻可以很輕松的實現Java軟件的綠色發布。
以千里冰封兄的YOYOPlayer為例(冰封兄blog:http://www.aygfsteel.com/hadeslee/),我們都知道這是一個非常之好的Java音樂播放器,在Java圈內已經小有名氣。但遺憾的是,對比千千靜聽這類知名軟件而言,了解它的人簡直比華南虎還要稀有......雖然軟件普及率低的原因多種多樣,但對Java應用而言,究其根本還是JVM安裝的關系。就像“媽是女人”的道理一樣,Java程序的運行環境必須有與其開發版本兼容的JRE存在,否則無法運作。也就是這道門檻,不知把多少普通用戶攔在了Java應用之外。
可能你會說這些是小事,的確,對我們這些Java程序員來講當然不存在任何問題;但令人遺憾的是,對絕大多數普通用戶,特別是并不成熟的中國數億網民而言(我是指軟件知識的平均值……其實牛人也很多……),安裝JRE這幾乎是件不可想象的艱巨任務;除非他們有必須使用不可的理由,否則需要下載第三方軟件的程序,絕對是第一時間被pass掉的(一般人使用軟件的準則就一條:簡單就用,麻煩就不用);無形中大大增加了Java軟件普及的難度,明明是很好的程序,卻只能在Java圈子里流傳,不禁令人扼腕。
事實上,我們可以通過極簡單的技術手段來突破這一限制,輕而易舉將Java應用做成綠色軟件,免除用戶這些不必要猶豫,令他們放心大膽的使用Java程序。
這個過程僅僅需要三步:
1、壓縮你的JRE:

目前GreenJVM支持rar和zip兩種方式的解壓。
2、設置vm.cfg:
vm.cfg內容配置如下:
- [LOON]
- /*虛擬機解壓方式,0.1版僅提供RAR及ZIP兩種,Windows平臺下建議使用RAR(調用自帶unrar.dll,故不要求本地
- 存在WinRAR,使用ZIP則可以刪除unrar.dll)*/
- SET_UNPACK_METHOD=rar
- //虛擬機壓縮包名稱,要求配置在vm.cfg同路徑下
- SET_VM_NAME=jre.pack
- //檢測本地jvm版本,低于期望值時使用自帶jvm,否則以本地虛擬機優先運行
- SET_START_REQUIRE_VERSION=1.6
- //期望加載的jar,多包以';'分隔
- SET_START_JAR_PATH=fps_test.jar
- //期望執行的main類
- SET_START_MAIN_CLASS=org/test/BallPanel
- //選填,嘗試從指定環境變量獲取jvm路徑,存在則優先運行本地jvm
- //SET_START_ENV=JAVA_HOME
現在我們來看看一個基本完整JRE1.6壓縮包(去掉了bin下的exe文件)與YOYOPlayer放在一起后的空間占用情況,如下圖:

對比百來MB的JRE而言,現在總體不過20MB的體積已經是小的太多。只需直接丟給用戶這個文件夾,告訴用戶一句“雙擊EXE文件執行”,就能如常運行此程序,而不必再解釋或說明什么。
但饒是如此,20MB的音樂播放器,相較2MB左右的千千靜聽而言還是太大了,對很多普通用戶來說依舊難以接受,他們不會去考慮Java特性,只會去想“千千2MB就能搞定的事,你怎么就要用20MB才行?肯定是水平不行,不用……”,Java程序員們集體抱頭哭~~~。為了避免這類情況的發生,這時就需要我們在jre的體積上做些文章了。
就和人的大腦活動區域一樣,相對于我們每個應用而言,JRE中也至少會有20MB以上(只多不少)是被浪費掉的終身不使用區域,而這些區域中的組件及類庫的唯一作用就是貪婪的占用硬盤空間罷了~因此找出這些區域并縮減它,就能最大限度的減小程序體積。(雖然sun或其它jvm提供商大多都反對這樣,但我們只是在實驗罷了:),況且我認為他們早晚也會開放jvm定制服務的。 )
以YOYOPlayer為例,實際上我們只需在JRE中保留其音頻支持、AWT/SWing支持、及網絡支持等部分就好,其余的部分大可刪掉不要。
下例我做了一個精簡的JRE壓縮包,如下圖:

只用了不足8MB的空間,便足以完成YOYOPlayer的全部功能.
我們把這個JRE和YOYOPlayer放在一起,全部加起來也不過9MB多一點,而YOYOPlayer依舊可以在無JRE系統中正常運行.效果如下圖:

當然,如果再繼續刪的話,占用空間肯定還會有一定的下降幅度,我認為至少能將JRE壓縮到6MB以內;但現實意義不大,畢竟不是做嵌入式開發,為了1,2MB費那么大勁不值當的……。事實上,對于絕大多數Java應用而言,壓縮后至多9MB左右的空間占用便綽綽有余了,況且還有進一步精簡的余地。
如下例,這是我以前在Blog發過的一個FPS測速程序,效果如下:

現在我使用一個針對AWT使用而精簡的JRE,在另一臺無Java環境的電腦上測試,結果如下圖:

可以看到,程序正常運行,而且FPS數有明顯提高,并沒有因為直接調用JVM而削弱了性能.
這個完全支持AWT組件的JRE和執行程序全打成一個rar文件也不過4MB左右(PS:由于最占空間的JRE已經壓縮過,所以再壓縮其實意義不大……),實際上與本地程序的大小已經相差無幾了.
不過就算是4MB的JRE也不能說很小了,如果愿意深度精簡的話,2MB的JRE運行敝人的loonframework-game(尚未發布)都已經綽綽有余。就運行庫而言,對比rmxp(ruby語言的游戲開發玩具……)還要小的多。
這些幾MB的Java應用,放到U盤里隨身攜帶綽綽有余,要用時在U盤里便可以直接運行(當然,由于api依賴的關系,除非我為其它平臺重新制作啟動文件,否則只支持提供win32 api的系統),不用了就直接刪文件,環保安全無污染,標準的綠色食品,不買也看看啊~
再稍微正規點做個安裝文件(綠色軟件不能等同于無需安裝的軟件,畢竟安裝只不過是個部署過程,和綠不綠色沒有實質上關系。愚以為,只要不改變現有系統配置,不依賴本地系統組件的軟件都可稱為綠色軟件;相反就算不用安裝,一執行就注冊到系統中一堆亂七八糟東西的軟件同樣不能說是綠色的。),那么程序的體積還將進一步減小。
以YOYOPlayer為例,最終提供給用戶一個5MB甚至4MB左右的綠色應用是絕對可以做到的,對比5.2.1版占用2.85MB空間的千千靜聽來說,已經看不出兩者間有太大區別,普通的音樂愛好者已經沒有理由不下載看看了.
而一旦他們用了,就會慢慢發現Java應用的精妙之處,他會發現無論以后他用什么系統,這套軟件他都將無法自拔的使用下去.
項目地址:http://code.google.com/p/greenvm/
————————————————————————————————————————————
0.1.1版發布:
項目地址:http://code.google.com/p/greenvm/
新增[SET_LOCAL_JRE_UPDATE]項,通過此項可以命令本地JRE自動更新。
一起發布的是一個Java仿雷電游戲(源碼見包內),共設置有三關三個小BOSS。采用有GreenJVM發布,因此可以運行在未裝載JRE的Windows系統之上。 (N久以前寫的一個古董……湊活看吧……)。
準備寫到1.0時再去Sourceforge申請項目……現在Loonframework還沒弄完呢……
0.1.1.3版發布:
項目地址:http://code.google.com/p/greenvm/
新增7z格式壓縮包解壓支持,建議使用此格式進行虛擬機壓縮。
_____________________________________________________________________________________________________________
_____________________________________________________________________________________________________________
GreenDotNet0.1.0
GreenDotNet是一個根據GreenJVM移植的應用,目標是實現.netframework虛擬機的綠色發布。
GreenDotNet 0.1.1 簡要說明
1、本程序是一個非常簡單的.Net程序免安裝發布工具,可以滿足絕大部分.Net framework2.0及以下環境開發之桌面應用的綠色發布及使用。
2、本程序目前階段不嘗試虛擬.Net運行環境(一是難寫,二是敝人極懶,三我是Java程序員,明白?^^……),虛擬機初始化后將直接通過GreenDotNet.exe在Windows中布署最簡.Net環境,故對程序運行效率無影響。
3、虛擬機壓縮包中僅刪除了System.Web(如果要用編碼之類的功能自己實現就好,不然這堆東西也5MB左右呢|||),保留了其余一切鏈接庫(如操作數據庫必須的System.Data等,不要就自己刪吧~),因此絕大多數操作皆可在此環境下正常使用。
4、由于采用了真實的Windows環境進行布署,因此加密或混淆后的.Net程序依舊可以正常在此環境下運行。
5、相較使用Salamander .NET Linker等收費工具(含使用飛信運行框架)而言,這只是一個簡寫的.Net布署方式,故而絕對不會存在版權或收費等問題。
相關文件說明:
GreenDotNet.exe : 啟動文件,它將起到本地環境探針及布署.Net環境的作用。
vm.cfg : 配置文件,決定GreenDotNet.exe對系統進行的相關操作。
dotnet.pack(8MB) : 虛擬機壓縮包,使用7z格式產生,目前僅提供.Net 2.0版本支持,不保證2.0以下或以上版本開發之應用在此環境能夠正常運行。
vm.cfg配置如下:
- [LOON]
- //虛擬機解壓方式,目前提供RAR、ZIP、7Z三種壓縮方式的解壓支持
- SET_UNPACK_METHOD=7z
- //虛擬機壓縮包名稱,要求配置在vm.cfg同路徑下
- SET_VM_NAME=DotNet.pack
- //檢測本地.net版本,低于期望值時使用自帶.net,否則以本地虛擬機優先運行
- SET_START_REQUIRE_VERSION=1.1
- //期望執行的exe文件,要求與vm.cfg同路徑下
- SET_START_MAIN_EXE=ComicStars.exe
項目地址:http://code.google.com/p/greenvm/
示例程序:
Zero漫天星辰漫畫下載器是一個.Net的在線漫畫檢索及下載工具,采用.netframework1.1開發(使用.net純粹是由于拖控件方便|||),作為GreenDotNet的示例程序一起發布.
