﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-咖啡没伴侣-随笔分类-Java</title><link>http://www.blogjava.net/oathleo/category/30445.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 28 Mar 2008 03:26:24 GMT</lastBuildDate><pubDate>Fri, 28 Mar 2008 03:26:24 GMT</pubDate><ttl>60</ttl><item><title>动态 JNLP</title><link>http://www.blogjava.net/oathleo/archive/2008/03/28/189199.html</link><dc:creator>LeoOath</dc:creator><author>LeoOath</author><pubDate>Fri, 28 Mar 2008 02:11:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2008/03/28/189199.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/189199.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2008/03/28/189199.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/189199.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/189199.html</trackback:ping><description><![CDATA[
		<div class="cnt" id="blog_text">
				<font size="2">
						<font color="#000000">
								<font face="Arial">附件是客户端代码，做了一些改造。主要是清除一些模块之间的关联，避免关联下载。<br />为了更快的启动客户端、最少的下载gui更新程序，我尝试了如下做法：<br /><br />   1. 个模块分开打包。目前粒度是对各第三方jar包、common目录、gui下的个子目录、gui目录本身做了单独打包、签名、pack200；<br />   2. 设置各个包的下载策略。对于少数必须包，用eager；对于非必须包（例如各模块包、itext包等），一律用lazy处理；<br />   3. 首次启动客户端，尽可能快、少下载包。目前可以只下载必要包（见后续列表，并且还有改进潜力）。目前可以做到LoginUI出现时，不下载任何业务模块。<br />   4. 由于MainUI关联了不少各模块的东西（例如工具栏上有一些业务模块的快捷入口），启动程序时候应当避免加载MainUI类。所以，改造XXX的main函数到Main.java中，而不再放在MainUI中；<br />   5. 通过观察以前代码jnlp的jar加载发现，login界面出来时候eng包竟然已经被加载。调试发现ClientInitialize类中调用了PartType数量。必要性不大，去掉之；<br />   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来死活在上面。<br />   7. 继续研究eng模块jar包总是被加载。发现原因是：默认进来的HomePage就是PartHomePage。这个看来没招了。不过sales和manage还要研究。<br />   8. 继续发现：part首页出现后，sales模块总是被加载。后来发现是AbstractHomePage类中的addInfoCenterTab方法中，竟然用SalesUtil.getString获得tab的title字符串。去掉，sales模块不再加载。<br />   9. 继续发现：part首页出现后，manage模块jar总是被加载。后来发现，part首页的infoCenter要显示InfoCenter的UI，而这些类是在manage包内定义的。抽出来放在eng模块，让manage引用eng模块。manage模块不再被加载。<br /><br />通过以上改造，首次运行XXX，到LoginUI显示时，加载的XXX的包如下：<br />XXX-base.jar<br />XXX-common.jar<br />XXX-gui.jar<br />XXX-i18n.jar<br />XXX-image.jar<br />XXX-server.jar<br />XXX-swing.jar<br />org.jar<br />第三方包有：<br />commons-lang.jar<br />jbossall-client.jar<br />looks-1.3.1.jar<br />twaver.jar<br />总计大小：3.439m。而且应当还有改进潜力。<br />点击login到进入MainUI，期间被加载的包有：<br />XXX-comany<br />XXX-conf<br />XXX-message<br />XXX-print<br />XXX-security<br />总计大小（包含前面加载的）：3.995m<br />如果点击树将各个模块触发全部jar下载，累计总计大小：7.116m<br />以后：<br /><br />    * 如果某个业务模块被具体更新：从双击jnlp到MainUI显示出来未做任何动作之前，没有任何下载产生（相当于直接启动）；点击对应的模块树会触发下载，但一般模块包的jar包都在1m以下，相当于下载一个新闻网页，略感延迟但不明显；只要下载服务器和客户端网络较好，基本感觉不到更新；<br />    * 如果客户端基本包（包括common、gui包、image、base、swing等）被更新，双击jnlp会触发进度条进行下载更新，不过会提示，用户可以选择；这是因为在jnlp中做了如下设置：&lt;update check="background" policy="prompt-update"/&gt;，用户可以选择不更新而启动客户端（当然这样风险相当大）；<br />    * 如果第三方包被更新：同上。<br /><br />附件的jnlp文件是新版本，可以看一下。为了方便管理众多gz和jar文件，将所有压缩包放入webstart/jars目录下，上层目录只留下index.htm和jnlp文件。<br />附件中的bat文件，可以将class文件进行打包、repack、签名、pack200压缩、生成对应的空jar文件、move到jboss目录，一次搞定（使用前需要修改一下里面的目录）。<br />&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />&lt;jnlp<br />spec="1.0+"<br />codebase="http://192.168.1.100:8080/webstart/"<br />href="XXX.jnlp"&gt;<br />&lt;information&gt;<br />      &lt;title&gt;2BizBox v2&lt;/title&gt;<br />         &lt;vendor&gt;SERVA Software&lt;/vendor&gt;<br />         &lt;homepage href="http://www.servasoft.com"/&gt;<br />         &lt;description&gt;XXX&lt;/description&gt;<br />         &lt;description kind="short"&gt;SERVA Software 2BizBox 2.0.&lt;/description&gt;<br />         &lt;offline-allowed/&gt;<br />&lt;/information&gt;<br />&lt;security&gt;<br />   &lt;all-permissions/&gt;<br />&lt;/security&gt;<br />&lt;update check="background" policy="prompt-update"/&gt;<br />&lt;resources&gt;<br />   &lt;j2se version="1.5+" initial-heap-size="128m" max-heap-size="512m"/&gt;<br />   &lt;jar href="jars/XXX-common.jar" part="XXX-common" download="eager"/&gt;<br />   &lt;jar href="jars/XXX-gui.jar" part="XXX-gui" download="eager" main="true"/&gt;<br />   &lt;jar href="jars/org.jar" part="XXX-gui" download="eager"/&gt;  <br />  <br />   &lt;!-- 2bizbox lazy modules --&gt;<br />  <br />   &lt;jar href="jars/XXX-acc.jar" part="XXX-acc" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.acc.*" part="XXX-acc" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-addr.jar" part="XXX-addr" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.addr.*" part="XXX-addr" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-base.jar" part="XXX-base" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.base.*" part="XXX-base" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-chart.jar" part="XXX-chart" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.chart.*" part="XXX-chart" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-company.jar" part="XXX-company" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.company.*" part="XXX-company" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-conf.jar" part="XXX-conf" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.conf.*" part="XXX-conf" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-cs.jar" part="XXX-cs" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.cs.*" part="XXX-cs" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-dev.jar" part="XXX-dev" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.dev.*" part="XXX-dev" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-doc.jar" part="XXX-doc" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.doc.*" part="XXX-doc" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-eng.jar" part="XXX-eng" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.eng.*" part="XXX-eng" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-hr.jar" part="XXX-hr" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.hr.*" part="XXX-hr" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-i18n.jar" part="XXX-i18n" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.i18n.*" part="XXX-i18n" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-images.jar" part="XXX-images" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.images.*" part="XXX-images" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-log.jar" part="XXX-log" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.log.*" part="XXX-log" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-man.jar" part="XXX-man" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.man.*" part="XXX-man" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-manage.jar" part="XXX-manage" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.manage.*" part="XXX-manage" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-message.jar" part="XXX-message" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.message.*" part="XXX-message" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-plan.jar" part="XXX-plan" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.plan.*" part="XXX-plan" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-print.jar" part="XXX-print" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.print.*" part="XXX-print" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-pur.jar" part="XXX-pur" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.pur.*" part="XXX-pur" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-quality.jar" part="XXX-quality" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.quality.*" part="XXX-quality" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-rule.jar" part="XXX-rule" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.rule.*" part="XXX-rule" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-sales.jar" part="XXX-sales" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.sales.*" part="XXX-sales" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-security.jar" part="XXX-security" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.security.*" part="XXX-security" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-server.jar" part="XXX-server" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.server.*" part="XXX-server" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-swing.jar" part="XXX-swing" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.swing.*" part="XXX-swing" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-tools.jar" part="XXX-tools" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.tools.*" part="XXX-tools" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-ware.jar" part="XXX-ware" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.ware.*" part="XXX-ware" recursive="true"/&gt;<br />   &lt;jar href="jars/XXX-wo.jar" part="XXX-wo" download="lazy"/&gt;<br />   &lt;package name="com.serva.XXX.gui.wo.*" part="XXX-wo" recursive="true"/&gt;<br /><br />   &lt;!-- all third party components --&gt;<br />   &lt;jar href="jars/looks-1.3.1.jar" download="eager"/&gt;<br />   &lt;jar href="jars/jbossall-client.jar" download="eager"/&gt;<br />   &lt;jar href="jars/commons-lang-1.0.1.jar" download="eager"/&gt;<br />   &lt;jar href="jars/itext-1.4.4.jar" part="itext" download="lazy"/&gt;<br />   &lt;jar href="jars/iTextAsian.jar" part="itext" download="lazy"/&gt;<br />   &lt;package name="com.lowagie.*" part="itext" recursive="true"/&gt;<br />  <br />   &lt;jar href="jars/twaver.jar" part="twaver" download="lazy"/&gt;<br />   &lt;package name="twaver.*" part="twaver" recursive="true"/&gt;<br />   &lt;jar href="jars/jxl.jar" part="jxl" download="lazy"/&gt;  <br />   &lt;package name="jxl.*" part="jxl" recursive="true"/&gt;<br />   &lt;jar href="jars/barbecue.jar" part="barbecue" download="lazy"/&gt;<br />   &lt;package name="net.sourceforge.barbecue.*" part="barbecue" recursive="true"/&gt;<br />&lt;/resources&gt;<br />&lt;application-desc main-class="com.serva.XXX.gui.Main"&gt;<br />   &lt;argument&gt;localhost&lt;/argument&gt;<br />&lt;/application-desc&gt;<br />&lt;/jnlp&gt;<br />pack.bat<br />cd classes<br />del /q *.jar<br />cd ..<br />rmdir -Q jars-gui<br />mkdir jars-gui<br />cd classes<br />jar -cf XXX-common.jar com/serva/XXX/common<br />jar -cf XXX-gui.jar com/serva/XXX/gui/*.class com/serva/XXX/gui/*.dat<br />jar -cf XXX-acc.jar com/serva/XXX/gui/acc<br />jar -cf XXX-addr.jar com/serva/XXX/gui/addr<br />jar -cf XXX-base.jar com/serva/XXX/gui/base<br />jar -cf XXX-chart.jar com/serva/XXX/gui/chart<br />jar -cf XXX-company.jar com/serva/XXX/gui/company<br />jar -cf XXX-conf.jar com/serva/XXX/gui/conf<br />jar -cf XXX-cs.jar com/serva/XXX/gui/cs<br />jar -cf XXX-dev.jar com/serva/XXX/gui/dev<br />jar -cf XXX-doc.jar com/serva/XXX/gui/doc<br />jar -cf XXX-eng.jar com/serva/XXX/gui/eng<br />jar -cf XXX-hr.jar com/serva/XXX/gui/hr<br />jar -cf XXX-i18n.jar com/serva/XXX/gui/i18n<br />jar -cf XXX-images.jar com/serva/XXX/gui/images<br />jar -cf XXX-log.jar com/serva/XXX/gui/log<br />jar -cf XXX-man.jar com/serva/XXX/gui/man<br />jar -cf XXX-manage.jar com/serva/XXX/gui/manage<br />jar -cf XXX-message.jar com/serva/XXX/gui/message<br />jar -cf XXX-plan.jar com/serva/XXX/gui/plan<br />jar -cf XXX-print.jar com/serva/XXX/gui/print<br />jar -cf XXX-pur.jar com/serva/XXX/gui/pur<br />jar -cf XXX-quality.jar com/serva/XXX/gui/quality<br />jar -cf XXX-rule.jar com/serva/XXX/gui/rule<br />jar -cf XXX-sales.jar com/serva/XXX/gui/sales<br />jar -cf XXX-security.jar com/serva/XXX/gui/security<br />jar -cf XXX-server.jar com/serva/XXX/gui/server<br />jar -cf XXX-swing.jar com/serva/XXX/gui/swing<br />jar -cf XXX-tools.jar com/serva/XXX/gui/tools<br />jar -cf XXX-ware.jar com/serva/XXX/gui/ware<br />jar -cf XXX-wo.jar com/serva/XXX/gui/wo<br />pack200 --repack XXX-common.jar                         <br />pack200 --repack XXX-gui.jar                         <br />pack200 --repack XXX-acc.jar                         <br />pack200 --repack XXX-addr.jar                         <br />pack200 --repack XXX-base.jar                         <br />pack200 --repack XXX-chart.jar                         <br />pack200 --repack XXX-company.jar                         <br />pack200 --repack XXX-conf.jar                         <br />pack200 --repack XXX-cs.jar                        <br />pack200 --repack XXX-dev.jar                         <br />pack200 --repack XXX-doc.jar                         <br />pack200 --repack XXX-eng.jar                        <br />pack200 --repack XXX-hr.jar                         <br />pack200 --repack XXX-i18n.jar                         <br />pack200 --repack XXX-images.jar                        <br />pack200 --repack XXX-log.jar                    <br />pack200 --repack XXX-man.jar                       <br />pack200 --repack XXX-manage.jar                     <br />pack200 --repack XXX-message.jar                      <br />pack200 --repack XXX-plan.jar                          <br />pack200 --repack XXX-print.jar                        <br />pack200 --repack XXX-pur.jar                      <br />pack200 --repack XXX-quality.jar                     <br />pack200 --repack XXX-rule.jar                    <br />pack200 --repack XXX-sales.jar                     <br />pack200 --repack XXX-security.jar            <br />pack200 --repack XXX-server.jar                     <br />pack200 --repack XXX-swing.jar                       <br />pack200 --repack XXX-tools.jar                       <br />pack200 --repack XXX-ware.jar                      <br />pack200 --repack XXX-wo.jar                 <br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-common.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-gui.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-acc.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-addr.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-base.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-chart.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-company.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-conf.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-cs.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-dev.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-doc.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-eng.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-hr.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-i18n.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-images.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-log.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-man.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-manage.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-message.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-plan.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-print.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-pur.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-quality.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-rule.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-sales.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-security.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-server.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-swing.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-tools.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-ware.jar XXX<br />jarsigner -keystore ../myKeystore -storepass servasoft XXX-wo.jar XXX<br />pack200 XXX-common.jar.pack.gz XXX-common.jar<br />pack200 XXX-gui.jar.pack.gz XXX-gui.jar<br />pack200 XXX-acc.jar.pack.gz XXX-acc.jar<br />pack200 XXX-addr.jar.pack.gz XXX-addr.jar<br />pack200 XXX-base.jar.pack.gz XXX-base.jar<br />pack200 XXX-chart.jar.pack.gz XXX-chart.jar<br />pack200 XXX-company.jar.pack.gz XXX-company.jar<br />pack200 XXX-conf.jar.pack.gz XXX-conf.jar<br />pack200 XXX-cs.jar.pack.gz XXX-cs.jar<br />pack200 XXX-dev.jar.pack.gz XXX-dev.jar<br />pack200 XXX-doc.jar.pack.gz XXX-doc.jar<br />pack200 XXX-eng.jar.pack.gz XXX-eng.jar<br />pack200 XXX-hr.jar.pack.gz XXX-hr.jar<br />pack200 XXX-i18n.jar.pack.gz XXX-i18n.jar<br />pack200 XXX-images.jar.pack.gz XXX-images.jar<br />pack200 XXX-log.jar.pack.gz XXX-log.jar<br />pack200 XXX-man.jar.pack.gz XXX-man.jar<br />pack200 XXX-manage.jar.pack.gz XXX-manage.jar<br />pack200 XXX-message.jar.pack.gz XXX-message.jar<br />pack200 XXX-plan.jar.pack.gz XXX-plan.jar<br />pack200 XXX-print.jar.pack.gz XXX-print.jar<br />pack200 XXX-pur.jar.pack.gz XXX-pur.jar<br />pack200 XXX-quality.jar.pack.gz XXX-quality.jar<br />pack200 XXX-rule.jar.pack.gz XXX-rule.jar<br />pack200 XXX-sales.jar.pack.gz XXX-sales.jar<br />pack200 XXX-security.jar.pack.gz XXX-security.jar<br />pack200 XXX-server.jar.pack.gz XXX-server.jar<br />pack200 XXX-swing.jar.pack.gz XXX-swing.jar<br />pack200 XXX-tools.jar.pack.gz XXX-tools.jar<br />pack200 XXX-ware.jar.pack.gz XXX-ware.jar<br />pack200 XXX-wo.jar.pack.gz XXX-wo.jar<br />del /q *.jar<br />move *.gz ../jars-gui<br />cd ../jars-gui<br />echo nothing &gt; XXX-common.jar                         <br />echo nothing &gt; XXX-gui.jar                         <br />echo nothing &gt; XXX-acc.jar                         <br />echo nothing &gt; XXX-addr.jar                         <br />echo nothing &gt; XXX-base.jar                         <br />echo nothing &gt; XXX-chart.jar                         <br />echo nothing &gt; XXX-company.jar                         <br />echo nothing &gt; XXX-conf.jar                         <br />echo nothing &gt; XXX-cs.jar                        <br />echo nothing &gt; XXX-dev.jar                         <br />echo nothing &gt; XXX-doc.jar                         <br />echo nothing &gt; XXX-eng.jar                        <br />echo nothing &gt; XXX-hr.jar                         <br />echo nothing &gt; XXX-i18n.jar                         <br />echo nothing &gt; XXX-images.jar                        <br />echo nothing &gt; XXX-log.jar                    <br />echo nothing &gt; XXX-man.jar                       <br />echo nothing &gt; XXX-manage.jar                     <br />echo nothing &gt; XXX-message.jar                      <br />echo nothing &gt; XXX-plan.jar                          <br />echo nothing &gt; XXX-print.jar                        <br />echo nothing &gt; XXX-pur.jar                      <br />echo nothing &gt; XXX-quality.jar                     <br />echo nothing &gt; XXX-rule.jar                    <br />echo nothing &gt; XXX-sales.jar                     <br />echo nothing &gt; XXX-security.jar            <br />echo nothing &gt; XXX-server.jar                     <br />echo nothing &gt; XXX-swing.jar                       <br />echo nothing &gt; XXX-tools.jar                       <br />echo nothing &gt; XXX-ware.jar                      <br />echo nothing &gt; XXX-wo.jar      <br />del -Q C:\jboss-4.0.5\server\default\deploy\webstart.war\jars\XXX-*.*<br />move *.* C:\jboss-4.0.5\server\default\deploy\webstart.war\jars<br />cd ..<br />rmdir -Q jars-gui<br /></font>
						</font>
						<br />
				</font>
		</div>
<img src ="http://www.blogjava.net/oathleo/aggbug/189199.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">LeoOath</a> 2008-03-28 10:11 <a href="http://www.blogjava.net/oathleo/archive/2008/03/28/189199.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Word转html</title><link>http://www.blogjava.net/oathleo/archive/2008/03/28/189196.html</link><dc:creator>LeoOath</dc:creator><author>LeoOath</author><pubDate>Fri, 28 Mar 2008 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2008/03/28/189196.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/189196.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2008/03/28/189196.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/189196.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/189196.html</trackback:ping><description><![CDATA[
		<font face="Arial" size="2">jacob是java和windows下的com桥，通过它我们可以在java程序中调用COM组件。如果你的JDK是1.4，那你需要下载jacob1.9的jni库才能正常运行，早期版本在JDK1.4下有些问题。<br /><br />package com; <br />/**<br />* 〈p〉Title:Word文档转html类〈/p〉<br />* 〈p〉Description: 〈/p〉<br />* 〈p〉Copyright:() 2002〈/p〉<br />* @author 舵手<br />* @version 1.0<br />*/<br />import com.jacob.com.*; <br />import com.jacob.activeX.*; <br /><br />public class WordtoHtml {<br />/**<br />*文档转换函数<br />*@param docfile word文档的绝对路径加文件名(包含扩展名)<br />*@param htmlfile 转换后的html文件绝对路径和文件名(不含扩展名)<br />*/<br />public static void change(String docfile, String htmlfile) {<br />ActiveXComponent app = new ActiveXComponent("Word.Application"); // 启动word<br />try {<br />app.setProperty("Visible", new Variant(false)); <br />//设置word不可见<br />Object docs = app.getProperty("Documents").toDispatch(); <br />Object doc = Dispatch.invoke(docs,"Open",Dispatch.Method,new Object[] { docfile, new Variant(false),new Variant(true) }, new int[1]).toDispatch(); <br />// 打开word文件<br />Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {htmlfile, new Variant(8) }, new int[1]); <br />// 作为html格式保存到临时文件<br />Variant f = new Variant(false); <br />Dispatch.call(doc, "Close", f); <br />} catch (Exception e) {<br />e.printStackTrace(); <br />} finally {<br />app.invoke("Quit", new Variant[]{}); <br />}<br />}<br />public static void main(String[] strs){<br />WordtoHtml.change("c:\\a\\运输管理调度系统总体方案.doc", "c:\\a\\t"); <br /><br />}<br />}</font>
<img src ="http://www.blogjava.net/oathleo/aggbug/189196.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">LeoOath</a> 2008-03-28 10:08 <a href="http://www.blogjava.net/oathleo/archive/2008/03/28/189196.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA 移位运算符 &lt;&lt; &gt;&gt; &gt;&gt;&gt;</title><link>http://www.blogjava.net/oathleo/archive/2008/03/28/189197.html</link><dc:creator>LeoOath</dc:creator><author>LeoOath</author><pubDate>Fri, 28 Mar 2008 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2008/03/28/189197.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/189197.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2008/03/28/189197.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/189197.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/189197.html</trackback:ping><description><![CDATA[
		<div class="cnt">
				<p>/* <br />
 * show the arthimetic character of '&lt;&lt;' '&gt;&gt;' '&gt;&gt;&gt;'<br />
 */</p>
				<p>public class TestArithmetic {<br />
   public TestArithmetic() {<br />
   }<br />
  <br />
   public   static void   main(String [] args){<br />
     int minus = -10;<br />
     System.out.println(" Binary of -10 is " + Integer.toBinaryString(minus));<br />
     System.out.println(" Arthimetic minus by -10 &lt;&lt; 2 = " +
(minus&lt;&lt;2) + " Binary is " +
Integer.toBinaryString(minus&lt;&lt;2));<br />
     System.out.println(" Arthimetic minus by -10 &gt;&gt; 2 = " +
(minus&gt;&gt;2) + " Binary is " +
Integer.toBinaryString(minus&gt;&gt;2));<br />
     System.out.println(" Arthimetic minus by -10 &gt;&gt;&gt;2 =   " +
(minus &gt;&gt;&gt; 2) + " Binary is " +
Integer.toBinaryString(minus&gt;&gt;&gt;2) <br />
                        + ",length is " + Integer.toBinaryString(minus&gt;&gt;&gt;2).length());<br />
    <br />
     int plus = 10;<br />
     System.out.println(" Binary of 10 is " + Integer.toBinaryString(plus));<br />
     System.out.println(" Arthimetic minus by 10 &lt;&lt; 2 = " +
(plus&lt;&lt;2)+ "Binary is " + Integer.toBinaryString(plus&lt;&lt;2));<br />
     System.out.println(" Arthimetic minus by 10 &gt;&gt; 2 = " +
(plus&gt;&gt;2)+ "Binary is "+ Integer.toBinaryString(plus&gt;&gt;2));<br />
     System.out.println(" Arthimetic minus by 10 &gt;&gt;&gt;2 =   " +
(plus &gt;&gt;&gt; 2)+ "Binary is "+ Integer.toBinaryString(plus
&gt;&gt;&gt; 2));<br />
   }</p>
				<p>补充知识：数值的补码表示也分两种情况： <br />
（1）正数的补码：与原码相同。 <br />
例如，+9的补码是00001001。 <br />
（2）负数的补码：符号位为1，其余位为该数绝对值的原码按位取反；然后整个数加1。 <br />
例如，-7的补码：因为是负数，则符号位为“1”,整个为10000111；其余7位为-7的绝对值+7的原码0000111按位取反为1111000；再加1，所以-7的补码是11111001。 <br /><br /><br />
已知一个数的补码，求原码的操作分两种情况： <br />
（1）如果补码的符号位为“0”，表示是一个正数，所以补码就是该数的原码。 <br />
（2）如果补码的符号位为“1”，表示是一个负数，求原码的操作可以是：符号位为1，其余各位取反，然后再整个数加1。 <br />
例如，已知一个补码为11111001，则原码是10000111（-7）：因为符号位为“1”，表示是一个负数，所以该位不变，仍为“1”；其余7位1111001取反后为0000110；再加1，所以是10000111。</p>
		</div>
<img src ="http://www.blogjava.net/oathleo/aggbug/189197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">LeoOath</a> 2008-03-28 10:08 <a href="http://www.blogjava.net/oathleo/archive/2008/03/28/189197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用XMLEncode输出时候，有BigDecimal有时候不好使。</title><link>http://www.blogjava.net/oathleo/archive/2008/03/28/189195.html</link><dc:creator>LeoOath</dc:creator><author>LeoOath</author><pubDate>Fri, 28 Mar 2008 02:07:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2008/03/28/189195.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/189195.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2008/03/28/189195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/189195.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/189195.html</trackback:ping><description><![CDATA[
		<div id="blog_text" class="cnt">
				<p>用XMLEncode输出时候，如果有BigDecimal有时候不好使。<br />
原因是：如果类的变量在定义时候有初始值，而不是null，就必须要重载DefaultPersistenceDelegate的mutatesTo方法。<br />
关于这个说明，在网上这里可以看到：<br /><a href="http://forum.java.sun.com/thread.jspa?threadID=631299&amp;messageID=3642493">http://forum.java.sun.com/thread.jspa?threadID=631299&amp;messageID=3642493</a><br /><br />有兴趣的可以看看：<br />
//setup big decimal delegate.<br />
          DefaultPersistenceDelegate bigDecimalDelegate = new DefaultPersistenceDelegate() {<br />
              protected Expression instantiate(Object oldInstance, Encoder out) {<br />
                  BigDecimal decimal = (BigDecimal) oldInstance;<br />
                  return new Expression(oldInstance, oldInstance.getClass(), "new", new Object[] {decimal.toString()});<br />
              }<br />
              //must override this method.<br />
              // see <a href="http://forum.java.sun.com/thread.jspa?threadID=631299&amp;messageID=3642493">http://forum.java.sun.com/thread.jspa?threadID=631299&amp;messageID=3642493</a><br />
              protected boolean mutatesTo(Object oldInstance, Object newInstance) {<br />
                  return oldInstance.equals(newInstance);<br />
              }<br />
              //--- Joshua<br />
          };<br /><br />
网上的牛人说：<br /><br />
This works for BigDecimal properties that aren't initialized, i.e.
null. But if you initialize the property, then this won't work unless
you override mutatesTo in addition to instantiate mentioned above:</p>
				<p>protected boolean mutatesTo(Object oldInstance, Object newInstance) {<br />
return oldInstance.equals(newInstance);<br />
} </p>
		</div>
<img src ="http://www.blogjava.net/oathleo/aggbug/189195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">LeoOath</a> 2008-03-28 10:07 <a href="http://www.blogjava.net/oathleo/archive/2008/03/28/189195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 引用</title><link>http://www.blogjava.net/oathleo/archive/2008/03/28/189193.html</link><dc:creator>LeoOath</dc:creator><author>LeoOath</author><pubDate>Fri, 28 Mar 2008 02:05:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2008/03/28/189193.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/189193.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2008/03/28/189193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/189193.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/189193.html</trackback:ping><description><![CDATA[
		<div id="blog_text" class="cnt">
				<p>public class MethodDemo {</p>
				<p>/**<br />
* @param args<br />
*/<br />
public static void main(String[] args) {<br />
    MethodDemo demo = new MethodDemo();<br />
    Integer i = Integer.valueOf(1);<br />
    demo.add(i);<br />
    System.out.println("i:" + i);<br />
  <br />
    String s = "ss";<br />
    demo.stringchange(s);<br />
    System.out.println("s:" + s);<br />
  <br />
    Person per = new Person();<br />
    demo.setDate(per);<br />
    System.out.println("per:" + per.getName());<br />
}</p>
				<p>//基本类型变不了<br />
public void add(int i) {<br />
    i++;<br />
}</p>
				<p>
				</p>
				<p>
				</p>
				<p> /***<br />
  * 凡是在引用中出现修改引用的赋值语句，<br />
  * 修改都变成无效<br />
  * @param i<br />
  */</p>
				<p>//想修改引用，不行<br />
public void add(Integer i) {<br />
    int j = i.intValue();<br />
    i = Integer.valueOf(j++);//i的原引用已经丢失了<br />
}<br /><br />
//想修改引用，不行<br />
public void stringchange(String s){<br />
    s = "stringchange";<br />
}<br /><br />
public void setDate(Person per){<br />
    Person per2 = new Person();<br />
    per2.setName("per2Name");<br />
    per = per2;//per的原引用已经丢失了<br />
    per.setName("name");<br />
}</p>
				<p>}</p>
				<p>class Person {<br />
String name ;</p>
				<p>public String getName() {<br />
    return name;<br />
}</p>
				<p>public void setName(String name) {<br />
    this.name = name;<br />
}<br /><br />
}</p>
		</div>
<img src ="http://www.blogjava.net/oathleo/aggbug/189193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">LeoOath</a> 2008-03-28 10:05 <a href="http://www.blogjava.net/oathleo/archive/2008/03/28/189193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>