java打包exe 製作安裝包 With JRE 自啓動 轉載

來自:http://hi.baidu.com/adanren/blog/item/57892af7a0c47b24730eec23.html

(這篇文章真的很不錯)

又是一個無聊的週末,硬着頭皮給客戶想出一套java程序打包的解決方案

目標:有安裝程序包像安裝qq一樣簡單一直下一步即可 ,可卸載,要求程序自動啓動,不需要單獨安裝JRE,就在寫這套解決方案的時候,我真是百般痛恨微軟.哎無奈啊.幸好最終還是被我想出來了,分享下吧,好久不寫博了.

第一步 jre減肥,刪除jre/lib/rt.jar中不使用的類,刪除charsets.jar中不使用的字符集編碼.MyWork開源項目(http://mywork.sourceforge.net/)中帶了一個瘦身過的JRE6.0,非常小隻有幾M.如果有需要可在此基礎上適當的增肥,例如提示有類找不到,只要在完整的jre下rt.jar包中找到這個類所在的包添加到瘦身過的jre即可.
第二步使用pack200進行壓縮,壓縮效果非常驚人,具體用法可參考官方手冊,下面是最簡單的壓縮和解壓縮命令(如果要製作安裝包的話不建議壓縮,因爲不方便解壓縮,還需要另外寫程序進行解壓)
壓縮命令D:/xxxxx/pack200 rt.jar.pack.gz rt.jar
解壓縮命令unpack200 -r jre/lib/rt.jar.pack jre/lib/rt.jar
第三步將自己的程序打成jar包,注意指定主類,連同依賴的jar包一同放到jre/lib/ext下面,(當然也可以不怎麼幹,通過寫批處理指定CLASSPATH)直接放到ext下面的好處在下面會體現出來

第四步 在jre文件夾的上層目錄下面編寫啓動批處理%1的作用下面在說
@SET PATH=./jre/bin;%1;%PATH%;
@start javaw com.Main(根據實際情況修改爲自己的程序入口)

將本地的jre或jdk文件夾重命名,並在cmd下敲java以確認本機的jre已經失效,點擊批處理,測試如果程序正常啓動的話,繼續往下看,如果程序無法啓動,將@start javaw com.Main改寫爲java com.Main重新啓動調試下,看看是不是缺類.

第五步 將批處理編譯成exe程序,使用Quick Batch File Compiler工具(http://www.abyssmedia.com/download.shtml),程序使用起來非常簡單這裏就不在介紹了,E文不好的可以去漢化新世紀下載中文的,注意如果要製作成安裝包必須使用幽靈模式,不可以使用控制檯模式.

第六步製作安裝包使用InnoSetup工具(百度一下到處都有下載),此工具有使用嚮導,這部分就不介紹了,嚮導結束後,會提示生成腳本,保存此腳本並生成 exe安裝包,運行安裝包,如果生成出來的文件程序結構和第四步是一樣的,並且可以運行的話,安裝包製作完成.(這一步選擇程序文件時批處理exe和 jre一同加進來注意jre必須是沒有進行pack2000壓縮的,否則需要在安裝腳本里面另寫解壓程序)

第七步 隨windows自動啓動程序,修改安裝腳本添加如下代碼
[Registry]
Root: HKLM; Subkey: "SOFTWARE/Microsoft/Windows/CurrentVersion/Run"; ValueType: string; ValueName: "程序名"; ValueData: """{app}/主程序.exe"" ""{app}/jre/bin"""

這裏面就用到了%1 熟悉批處理的同學都知道系統自啓動的時候.代表的並不是程序的所在文件夾,所以這裏傳遞了jre所在文件夾參數,@SET PATH=./jre/bin;%1;%PATH%;中把jre添加到了path中.

第八步註銷下重新登錄看看程序是否自動啓動了.(可以在沒有安裝jre的機器上測試下)


我的安裝包大小爲10M左右,我依賴了很多第三方的jar包,否則還可以更小,最後還可以加個殼或使用rar壓縮下

==================================================================================
Java5中帶了一個壓縮工具:Pack200,這個工具能對普通的jar文件進行高效壓縮。其實現原理是根據Java類特有的結構,合併常數池,去掉無用信息等來實現對java類的高效壓縮。由於是專門對Java類進行壓縮的,所以對普通文件的壓縮和普通壓縮軟件沒有什麼兩樣,但是對於Jar 文件卻能輕易達到10-40%的壓縮率。這在Java應用部署中很有用,尤其對於移動Java計算,能夠大大減小代碼下載量。
Java5中還提供了這一技術的API接口,你可以將其嵌入到你的程序中使用。使用的方法很簡單,下面的短短几行代碼即可以實現jar的壓縮和解壓:
壓縮
Packer packer=Pack200.newPacker();
OutputStream output=new BufferedOutputStream(new FileOutputStream(outfile));
packer.pack(new JarFile(jarFile), output);
output.close();
解壓
Unpacker unpacker=Pack200.newUnpacker();
output=new JarOutputStream(new FileOutputStream(jarFile));
unpacker.unpack(pack200File, output);
output.close();
更爲詳細介紹,請見下面的網址:
http://java.sun.com/javase/6/docs/technotes/guides/deployment/deployment-guide/pack200.html
==================================================================================
目前發佈了一個swing 的程序,包括java web start 與applet 兩個版本,但是由於第三方包的引入,發佈包達到了近5MB,即使在局域網也讓人無法忍受那緩慢的加載速度,畢竟對於絕大部分應用來說,網絡帶寬還是最終的系統瓶頸。

還好JDK5在Java Web Start和Java Plug-in中提供了對gizp和pack200壓縮技術的支持,通過壓縮將使Java的網絡應用在jar的壓縮基礎上再一次的得到瘦身的飛躍。

gzip
jar包中包含的內容非Java類的資源文件比較多,例如JPEG, GIF等的,用gzip會比較合適

pack200
jar包絕大部分信息是class內容的話,那麼pack200絕對是你的首選方案,因爲pack200是專門針對class的java類進行優化設計的,主要體現在以下幾個方面:

It merges and sorts the constant-pool data in the class files and co-locates them in the archive.
It removes redundant class attributes.
It stores internal data structures.
It use delta and variable length encoding.
It chooses optimum coding types for secondary compression.

壓縮簽名的整個發佈過程

***/JDK5/bin/pack200 --repack demo.jar
--repack的作用等價與pack200和unpack200這兩個指令,其作用是對demo.jar裏面的class結構用Pack200的格式進行整理,因爲簽名需要根據jar包的類結構進行散列計算,所以如果不先進行jar的Pack200格式整理的話,等簽名後再用pack200進行壓縮將會導致簽名無效,所以第一步需要進行--repack這個看似無用實則關鍵的操作
jarsigner -keystore myKeystore demo.jar ...
對Pack200格式整理過的demo.jar進行簽名
***/JDK5/bin/pack200 demo.jar.pack.gz demo.jar
對簽完名的demo.jar進行Pack200壓縮,生成demo.jar.pack.gz

***/JDK5/sample/jnlp/servlet下面的jar包,主要是jnlp-servlet.jar拷貝到要發佈的web工程的WEB-INF/lib/目錄下
修改web發佈工程的web.xml文件,將所有*.jnlp和*.jar的url路徑定位到jnlp.sample.servlet.JnlpDownloadServlet進行處理
將demo.jar、demo.jar.pack.gz拷貝到jnlp或者applet指定的路徑下
通過以上的操作一切就ok了,也許你想問jnlp和applet需要做什麼改動嗎,答案是no,一切都由JnlpDownloadServlet 進行透明處理了,jnlp和applet裏面的指向還是demo.jar,JnlpDownloadServlet自動會根據request的 Accept-Encoding決定到底是下發demo.jar.pack.gz還是demo.jar,這樣如果客戶端安裝了JDK5的Java Web Start或者Java Plug-in那麼JnlpDownloadServlet自動會下發Pack200壓縮的demo.jar.pack.gz包,如果客戶端是JDK1.4或者更老的環境,那麼JnlpDownloadServlet自然會下發demo.jar的普通包。

Pack200的壓縮和解壓縮速度是比較快的,而且壓縮率也是很驚人的,在我是使用的包4.46MB壓縮後成了1.44MB(0.322%),而且隨着包的越大壓縮率會根據明顯,據說如果jar包都是class類可以壓縮到1/9的大小。其實JavaWebStart還有很多功能,例如可以按不同的jar包進行lazy下載和單獨更新,設置可以根據jar中的類變動進行class粒度的下載。心動不如行動,趕快去對你的發佈程序進行瘦身吧。

參考:http://sailing8036.spaces.live.com/blog/cns!69D05DFD4294F487!479.entr

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