Posted on 2008-03-28 10:11
oathleo 閱讀(1716)
評論(2) 編輯 收藏 所屬分類:
Java
附件是客戶端代碼,做了一些改造。主要是清除一些模塊之間的關聯,避免關聯下載。
為了更快的啟動客戶端、最少的下載gui更新程序,我嘗試了如下做法:
?? 1. 個模塊分開打包。目前粒度是對各第三方jar包、common目錄、gui下的個子目錄、gui目錄本身做了單獨打包、簽名、pack200;
?? 2. 設置各個包的下載策略。對于少數必須包,用eager;對于非必須包(例如各模塊包、itext包等),一律用lazy處理;
?? 3. 首次啟動客戶端,盡可能快、少下載包。目前可以只下載必要包(見后續列表,并且還有改進潛力)。目前可以做到LoginUI出現時,不下載任何業務模塊。
?? 4. 由于MainUI關聯了不少各模塊的東西(例如工具欄上有一些業務模塊的快捷入口),啟動程序時候應當避免加載MainUI類。所以,改造XXX的main函數到Main.java中,而不再放在MainUI中;
?? 5. 通過觀察以前代碼jnlp的jar加載發現,login界面出來時候eng包竟然已經被加載。調試發現ClientInitialize類中調用了PartType數量。必要性不大,去掉之;
?? 6. 啟動MainUI,什么也沒動的情況下,發現幾乎所有業務模塊jar都被加載。原因是:MainUIActionManager里面的clear方法在清除緩存時候,用硬編碼調用各個模塊的類的靜態方法進行clear,導致這些jar包全都被加載。做如下改造:在MainUIActionManager中做一個map存儲所有待清除類,用類名和方法名記錄clear cache的方法;各個具體模塊的類如果有需要logout被清除的,在類的開始處用static代碼段調用 MainUIActionManager.registerClearCache來注冊自己。這樣,MainUIActionManager就不必知道每個被清除者,誰注冊誰會被回調。這里的缺點是:由于這些clear方法都是static的,無法用接口來定義,java沒有abstract static這樣的概念,這里只能用反射,有一定的出錯概率。經過這個改造,mainUI啟動后,業務模塊大多沒有load,只有eng、sales和 manage來死活在上面。
?? 7. 繼續研究eng模塊jar包總是被加載。發現原因是:默認進來的HomePage就是PartHomePage。這個看來沒招了。不過sales和manage還要研究。
?? 8. 繼續發現:part首頁出現后,sales模塊總是被加載。后來發現是AbstractHomePage類中的addInfoCenterTab方法中,竟然用SalesUtil.getString獲得tab的title字符串。去掉,sales模塊不再加載。
?? 9. 繼續發現:part首頁出現后,manage模塊jar總是被加載。后來發現,part首頁的infoCenter要顯示InfoCenter的UI,而這些類是在manage包內定義的。抽出來放在eng模塊,讓manage引用eng模塊。manage模塊不再被加載。
通過以上改造,首次運行XXX,到LoginUI顯示時,加載的XXX的包如下:
XXX-base.jar
XXX-common.jar
XXX-gui.jar
XXX-i18n.jar
XXX-image.jar
XXX-server.jar
XXX-swing.jar
org.jar
第三方包有:
commons-lang.jar
jbossall-client.jar
looks-1.3.1.jar
twaver.jar
總計大小:3.439m。而且應當還有改進潛力。
點擊login到進入MainUI,期間被加載的包有:
XXX-comany
XXX-conf
XXX-message
XXX-print
XXX-security
總計大小(包含前面加載的):3.995m
如果點擊樹將各個模塊觸發全部jar下載,累計總計大小:7.116m
以后:
??? * 如果某個業務模塊被具體更新:從雙擊jnlp到MainUI顯示出來未做任何動作之前,沒有任何下載產生(相當于直接啟動);點擊對應的模塊樹會觸發下載,但一般模塊包的jar包都在1m以下,相當于下載一個新聞網頁,略感延遲但不明顯;只要下載服務器和客戶端網絡較好,基本感覺不到更新;
??? * 如果客戶端基本包(包括common、gui包、image、base、swing等)被更新,雙擊jnlp會觸發進度條進行下載更新,不過會提示,用戶可以選擇;這是因為在jnlp中做了如下設置:<update check="background" policy="prompt-update"/>,用戶可以選擇不更新而啟動客戶端(當然這樣風險相當大);
??? * 如果第三方包被更新:同上。
附件的jnlp文件是新版本,可以看一下。為了方便管理眾多gz和jar文件,將所有壓縮包放入webstart/jars目錄下,上層目錄只留下index.htm和jnlp文件。
附件中的bat文件,可以將class文件進行打包、repack、簽名、pack200壓縮、生成對應的空jar文件、move到jboss目錄,一次搞定(使用前需要修改一下里面的目錄)。
<?xml version="1.0" encoding="utf-8"?>
<jnlp
spec="1.0+"
codebase="http://192.168.1.100:8080/webstart/"
href="XXX.jnlp">
<information>
????? <title>2BizBox v2</title>
???????? <vendor>SERVA Software</vendor>
???????? <homepage />
???????? <description>XXX</description>
???????? <description kind="short">SERVA Software 2BizBox 2.0.</description>
???????? <offline-allowed/>
</information>
<security>
?? <all-permissions/>
</security>
<update check="background" policy="prompt-update"/>
<resources>
?? <j2se version="1.5+" initial-heap-size="128m" max-heap-size="512m"/>
?? <jar href="jars/XXX-common.jar" part="XXX-common" download="eager"/>
?? <jar href="jars/XXX-gui.jar" part="XXX-gui" download="eager" main="true"/>
?? <jar href="jars/org.jar" part="XXX-gui" download="eager"/>?
?
?? <!-- 2bizbox lazy modules -->
?
?? <jar href="jars/XXX-acc.jar" part="XXX-acc" download="lazy"/>
?? <package name="com.serva.XXX.gui.acc.*" part="XXX-acc" recursive="true"/>
?? <jar href="jars/XXX-addr.jar" part="XXX-addr" download="lazy"/>
?? <package name="com.serva.XXX.gui.addr.*" part="XXX-addr" recursive="true"/>
?? <jar href="jars/XXX-base.jar" part="XXX-base" download="lazy"/>
?? <package name="com.serva.XXX.gui.base.*" part="XXX-base" recursive="true"/>
?? <jar href="jars/XXX-chart.jar" part="XXX-chart" download="lazy"/>
?? <package name="com.serva.XXX.gui.chart.*" part="XXX-chart" recursive="true"/>
?? <jar href="jars/XXX-company.jar" part="XXX-company" download="lazy"/>
?? <package name="com.serva.XXX.gui.company.*" part="XXX-company" recursive="true"/>
?? <jar href="jars/XXX-conf.jar" part="XXX-conf" download="lazy"/>
?? <package name="com.serva.XXX.gui.conf.*" part="XXX-conf" recursive="true"/>
?? <jar href="jars/XXX-cs.jar" part="XXX-cs" download="lazy"/>
?? <package name="com.serva.XXX.gui.cs.*" part="XXX-cs" recursive="true"/>
?? <jar href="jars/XXX-dev.jar" part="XXX-dev" download="lazy"/>
?? <package name="com.serva.XXX.gui.dev.*" part="XXX-dev" recursive="true"/>
?? <jar href="jars/XXX-doc.jar" part="XXX-doc" download="lazy"/>
?? <package name="com.serva.XXX.gui.doc.*" part="XXX-doc" recursive="true"/>
?? <jar href="jars/XXX-eng.jar" part="XXX-eng" download="lazy"/>
?? <package name="com.serva.XXX.gui.eng.*" part="XXX-eng" recursive="true"/>
?? <jar href="jars/XXX-hr.jar" part="XXX-hr" download="lazy"/>
?? <package name="com.serva.XXX.gui.hr.*" part="XXX-hr" recursive="true"/>
?? <jar href="jars/XXX-i18n.jar" part="XXX-i18n" download="lazy"/>
?? <package name="com.serva.XXX.gui.i18n.*" part="XXX-i18n" recursive="true"/>
?? <jar href="jars/XXX-images.jar" part="XXX-images" download="lazy"/>
?? <package name="com.serva.XXX.gui.images.*" part="XXX-images" recursive="true"/>
?? <jar href="jars/XXX-log.jar" part="XXX-log" download="lazy"/>
?? <package name="com.serva.XXX.gui.log.*" part="XXX-log" recursive="true"/>
?? <jar href="jars/XXX-man.jar" part="XXX-man" download="lazy"/>
?? <package name="com.serva.XXX.gui.man.*" part="XXX-man" recursive="true"/>
?? <jar href="jars/XXX-manage.jar" part="XXX-manage" download="lazy"/>
?? <package name="com.serva.XXX.gui.manage.*" part="XXX-manage" recursive="true"/>
?? <jar href="jars/XXX-message.jar" part="XXX-message" download="lazy"/>
?? <package name="com.serva.XXX.gui.message.*" part="XXX-message" recursive="true"/>
?? <jar href="jars/XXX-plan.jar" part="XXX-plan" download="lazy"/>
?? <package name="com.serva.XXX.gui.plan.*" part="XXX-plan" recursive="true"/>
?? <jar href="jars/XXX-print.jar" part="XXX-print" download="lazy"/>
?? <package name="com.serva.XXX.gui.print.*" part="XXX-print" recursive="true"/>
?? <jar href="jars/XXX-pur.jar" part="XXX-pur" download="lazy"/>
?? <package name="com.serva.XXX.gui.pur.*" part="XXX-pur" recursive="true"/>
?? <jar href="jars/XXX-quality.jar" part="XXX-quality" download="lazy"/>
?? <package name="com.serva.XXX.gui.quality.*" part="XXX-quality" recursive="true"/>
?? <jar href="jars/XXX-rule.jar" part="XXX-rule" download="lazy"/>
?? <package name="com.serva.XXX.gui.rule.*" part="XXX-rule" recursive="true"/>
?? <jar href="jars/XXX-sales.jar" part="XXX-sales" download="lazy"/>
?? <package name="com.serva.XXX.gui.sales.*" part="XXX-sales" recursive="true"/>
?? <jar href="jars/XXX-security.jar" part="XXX-security" download="lazy"/>
?? <package name="com.serva.XXX.gui.security.*" part="XXX-security" recursive="true"/>
?? <jar href="jars/XXX-server.jar" part="XXX-server" download="lazy"/>
?? <package name="com.serva.XXX.gui.server.*" part="XXX-server" recursive="true"/>
?? <jar href="jars/XXX-swing.jar" part="XXX-swing" download="lazy"/>
?? <package name="com.serva.XXX.gui.swing.*" part="XXX-swing" recursive="true"/>
?? <jar href="jars/XXX-tools.jar" part="XXX-tools" download="lazy"/>
?? <package name="com.serva.XXX.gui.tools.*" part="XXX-tools" recursive="true"/>
?? <jar href="jars/XXX-ware.jar" part="XXX-ware" download="lazy"/>
?? <package name="com.serva.XXX.gui.ware.*" part="XXX-ware" recursive="true"/>
?? <jar href="jars/XXX-wo.jar" part="XXX-wo" download="lazy"/>
?? <package name="com.serva.XXX.gui.wo.*" part="XXX-wo" recursive="true"/>
?? <!-- all third party components -->
?? <jar href="jars/looks-1.3.1.jar" download="eager"/>
?? <jar href="jars/jbossall-client.jar" download="eager"/>
?? <jar href="jars/commons-lang-1.0.1.jar" download="eager"/>
?? <jar href="jars/itext-1.4.4.jar" part="itext" download="lazy"/>
?? <jar href="jars/iTextAsian.jar" part="itext" download="lazy"/>
?? <package name="com.lowagie.*" part="itext" recursive="true"/>
?
?? <jar href="jars/twaver.jar" part="twaver" download="lazy"/>
?? <package name="twaver.*" part="twaver" recursive="true"/>
?? <jar href="jars/jxl.jar" part="jxl" download="lazy"/>?
?? <package name="jxl.*" part="jxl" recursive="true"/>
?? <jar href="jars/barbecue.jar" part="barbecue" download="lazy"/>
?? <package name="net.sourceforge.barbecue.*" part="barbecue" recursive="true"/>
</resources>
<application-desc main-class="com.serva.XXX.gui.Main">
?? <argument>localhost</argument>
</application-desc>
</jnlp>
pack.bat
cd classes
del /q *.jar
cd ..
rmdir -Q jars-gui
mkdir jars-gui
cd classes
jar -cf XXX-common.jar com/serva/XXX/common
jar -cf XXX-gui.jar com/serva/XXX/gui/*.class com/serva/XXX/gui/*.dat
jar -cf XXX-acc.jar com/serva/XXX/gui/acc
jar -cf XXX-addr.jar com/serva/XXX/gui/addr
jar -cf XXX-base.jar com/serva/XXX/gui/base
jar -cf XXX-chart.jar com/serva/XXX/gui/chart
jar -cf XXX-company.jar com/serva/XXX/gui/company
jar -cf XXX-conf.jar com/serva/XXX/gui/conf
jar -cf XXX-cs.jar com/serva/XXX/gui/cs
jar -cf XXX-dev.jar com/serva/XXX/gui/dev
jar -cf XXX-doc.jar com/serva/XXX/gui/doc
jar -cf XXX-eng.jar com/serva/XXX/gui/eng
jar -cf XXX-hr.jar com/serva/XXX/gui/hr
jar -cf XXX-i18n.jar com/serva/XXX/gui/i18n
jar -cf XXX-images.jar com/serva/XXX/gui/images
jar -cf XXX-log.jar com/serva/XXX/gui/log
jar -cf XXX-man.jar com/serva/XXX/gui/man
jar -cf XXX-manage.jar com/serva/XXX/gui/manage
jar -cf XXX-message.jar com/serva/XXX/gui/message
jar -cf XXX-plan.jar com/serva/XXX/gui/plan
jar -cf XXX-print.jar com/serva/XXX/gui/print
jar -cf XXX-pur.jar com/serva/XXX/gui/pur
jar -cf XXX-quality.jar com/serva/XXX/gui/quality
jar -cf XXX-rule.jar com/serva/XXX/gui/rule
jar -cf XXX-sales.jar com/serva/XXX/gui/sales
jar -cf XXX-security.jar com/serva/XXX/gui/security
jar -cf XXX-server.jar com/serva/XXX/gui/server
jar -cf XXX-swing.jar com/serva/XXX/gui/swing
jar -cf XXX-tools.jar com/serva/XXX/gui/tools
jar -cf XXX-ware.jar com/serva/XXX/gui/ware
jar -cf XXX-wo.jar com/serva/XXX/gui/wo
pack200 --repack XXX-common.jar????????????????????????
pack200 --repack XXX-gui.jar????????????????????????
pack200 --repack XXX-acc.jar????????????????????????
pack200 --repack XXX-addr.jar????????????????????????
pack200 --repack XXX-base.jar????????????????????????
pack200 --repack XXX-chart.jar????????????????????????
pack200 --repack XXX-company.jar????????????????????????
pack200 --repack XXX-conf.jar????????????????????????
pack200 --repack XXX-cs.jar???????????????????????
pack200 --repack XXX-dev.jar????????????????????????
pack200 --repack XXX-doc.jar????????????????????????
pack200 --repack XXX-eng.jar???????????????????????
pack200 --repack XXX-hr.jar????????????????????????
pack200 --repack XXX-i18n.jar????????????????????????
pack200 --repack XXX-images.jar???????????????????????
pack200 --repack XXX-log.jar???????????????????
pack200 --repack XXX-man.jar??????????????????????
pack200 --repack XXX-manage.jar????????????????????
pack200 --repack XXX-message.jar?????????????????????
pack200 --repack XXX-plan.jar?????????????????????????
pack200 --repack XXX-print.jar???????????????????????
pack200 --repack XXX-pur.jar?????????????????????
pack200 --repack XXX-quality.jar????????????????????
pack200 --repack XXX-rule.jar???????????????????
pack200 --repack XXX-sales.jar????????????????????
pack200 --repack XXX-security.jar???????????
pack200 --repack XXX-server.jar????????????????????
pack200 --repack XXX-swing.jar??????????????????????
pack200 --repack XXX-tools.jar??????????????????????
pack200 --repack XXX-ware.jar?????????????????????
pack200 --repack XXX-wo.jar????????????????
jarsigner -keystore ../myKeystore -storepass servasoft XXX-common.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-gui.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-acc.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-addr.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-base.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-chart.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-company.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-conf.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-cs.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-dev.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-doc.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-eng.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-hr.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-i18n.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-images.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-log.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-man.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-manage.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-message.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-plan.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-print.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-pur.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-quality.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-rule.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-sales.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-security.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-server.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-swing.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-tools.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-ware.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-wo.jar XXX
pack200 XXX-common.jar.pack.gz XXX-common.jar
pack200 XXX-gui.jar.pack.gz XXX-gui.jar
pack200 XXX-acc.jar.pack.gz XXX-acc.jar
pack200 XXX-addr.jar.pack.gz XXX-addr.jar
pack200 XXX-base.jar.pack.gz XXX-base.jar
pack200 XXX-chart.jar.pack.gz XXX-chart.jar
pack200 XXX-company.jar.pack.gz XXX-company.jar
pack200 XXX-conf.jar.pack.gz XXX-conf.jar
pack200 XXX-cs.jar.pack.gz XXX-cs.jar
pack200 XXX-dev.jar.pack.gz XXX-dev.jar
pack200 XXX-doc.jar.pack.gz XXX-doc.jar
pack200 XXX-eng.jar.pack.gz XXX-eng.jar
pack200 XXX-hr.jar.pack.gz XXX-hr.jar
pack200 XXX-i18n.jar.pack.gz XXX-i18n.jar
pack200 XXX-images.jar.pack.gz XXX-images.jar
pack200 XXX-log.jar.pack.gz XXX-log.jar
pack200 XXX-man.jar.pack.gz XXX-man.jar
pack200 XXX-manage.jar.pack.gz XXX-manage.jar
pack200 XXX-message.jar.pack.gz XXX-message.jar
pack200 XXX-plan.jar.pack.gz XXX-plan.jar
pack200 XXX-print.jar.pack.gz XXX-print.jar
pack200 XXX-pur.jar.pack.gz XXX-pur.jar
pack200 XXX-quality.jar.pack.gz XXX-quality.jar
pack200 XXX-rule.jar.pack.gz XXX-rule.jar
pack200 XXX-sales.jar.pack.gz XXX-sales.jar
pack200 XXX-security.jar.pack.gz XXX-security.jar
pack200 XXX-server.jar.pack.gz XXX-server.jar
pack200 XXX-swing.jar.pack.gz XXX-swing.jar
pack200 XXX-tools.jar.pack.gz XXX-tools.jar
pack200 XXX-ware.jar.pack.gz XXX-ware.jar
pack200 XXX-wo.jar.pack.gz XXX-wo.jar
del /q *.jar
move *.gz ../jars-gui
cd ../jars-gui
echo nothing > XXX-common.jar????????????????????????
echo nothing > XXX-gui.jar????????????????????????
echo nothing > XXX-acc.jar????????????????????????
echo nothing > XXX-addr.jar????????????????????????
echo nothing > XXX-base.jar????????????????????????
echo nothing > XXX-chart.jar????????????????????????
echo nothing > XXX-company.jar????????????????????????
echo nothing > XXX-conf.jar????????????????????????
echo nothing > XXX-cs.jar???????????????????????
echo nothing > XXX-dev.jar????????????????????????
echo nothing > XXX-doc.jar????????????????????????
echo nothing > XXX-eng.jar???????????????????????
echo nothing > XXX-hr.jar????????????????????????
echo nothing > XXX-i18n.jar????????????????????????
echo nothing > XXX-images.jar???????????????????????
echo nothing > XXX-log.jar???????????????????
echo nothing > XXX-man.jar??????????????????????
echo nothing > XXX-manage.jar????????????????????
echo nothing > XXX-message.jar?????????????????????
echo nothing > XXX-plan.jar?????????????????????????
echo nothing > XXX-print.jar???????????????????????
echo nothing > XXX-pur.jar?????????????????????
echo nothing > XXX-quality.jar????????????????????
echo nothing > XXX-rule.jar???????????????????
echo nothing > XXX-sales.jar????????????????????
echo nothing > XXX-security.jar???????????
echo nothing > XXX-server.jar????????????????????
echo nothing > XXX-swing.jar??????????????????????
echo nothing > XXX-tools.jar??????????????????????
echo nothing > XXX-ware.jar?????????????????????
echo nothing > XXX-wo.jar?????
del -Q C:\jboss-4.0.5\server\default\deploy\webstart.war\jars\XXX-*.*
move *.* C:\jboss-4.0.5\server\default\deploy\webstart.war\jars
cd ..
rmdir -Q jars-gui