BaNg@taobao

          Just Do It!

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            20 Posts :: -1 Stories :: 202 Comments :: 0 Trackbacks
          我平常做服務(wù)器或者應(yīng)用程序的時(shí)候喜歡把各種依賴包如log4j, jdbc, commons-lang等放到一個(gè)lib目錄下,然后啟動(dòng)的時(shí)候?qū)⑦@些jar包設(shè)置到classpath上。以前我經(jīng)常使用set classpath=log4j.jar;jdbc.jar;commons-lang.jar硬加載,但問(wèn)題就是每新加入一個(gè)jar,就得改批處理一次,再就是每開(kāi)發(fā)一個(gè)就得這么設(shè)置一次。很煩人,perl 創(chuàng)始人說(shuō),偷懶的程序員才是好程序員:),我需要一個(gè)通用的加載方式。

          不管linux/windows或其它OS,都提供一個(gè)shell與kernel交互,并且shell都有一個(gè)類似的for內(nèi)置commnd。

          下面是linux bash的嘗試
          #!/usr/bin/sh

          clspath
          ="bootstrap.jar"
          for k in *.jar
          do
           clspath
          =$clspath:$PWD/$k
           echo 
          "current jar is $k."
          done
          printf "classpath is %s" $clspath

          工作的很好,于是在windows同樣try了一下batch
          @echo off

          set clspath
          =bootstrap.jar
          for %%j in (*.jar) do (
          set clspath
          =%clspath%;%cd%\%%j
          echo current jar is 
          %%j.
          )
          echo classpath is 
          %clspath%

          很奇怪的是最后的結(jié)果卻是 classpath is bootstrap.jar;D:\workflow\bingo\lib\servlet-api.jar。很顯然batch默認(rèn)不支持變量迭代更改
          google了一下,發(fā)現(xiàn)原因,稍微改一下:
           
           1@echo off
           2
           3set clspath=bootstrap.jar
           4setlocal enabledelayedexpansion
           5for %%j in (*.jar) do (
           6set clspath=!clspath!;%cd%\%%j
           7echo current jar is %%j.
           8)
           9echo classpath is %clspath%
          10endlocal


          對(duì)比一下,可以發(fā)現(xiàn):

          1. 第4行加上了setlocal enabledelayedexpansion,即變量延遲展開(kāi)。
          2. 第10行有一個(gè)endlocal,結(jié)束這個(gè)設(shè)置
          3. 第6行把%classpath%變成了!classpath!。

          雖然目的達(dá)到了,還是要鄙視微軟的dos batch,實(shí)在很弱,不知Powershell怎樣。

          參考資料:
             setlocal


           

          posted on 2008-04-13 15:32 Always BaNg. 閱讀(4519) 評(píng)論(8)  編輯  收藏 所屬分類: Java網(wǎng)摘備用

          Feedback

          # re: 在批處理中加載某個(gè)目錄所有的jar 2008-04-13 17:45 x.matthew
          其實(shí)通過(guò)設(shè)置可以加載一個(gè)目錄的,下面是一個(gè)例子
          java -Djava.ext.dirs="c:\lib" org.xmatthew.spy2servers.console.Main start  回復(fù)  更多評(píng)論
            

          # re: 在批處理中加載某個(gè)目錄所有的jar 2008-04-13 18:48 BeanSoft
          good!!!  回復(fù)  更多評(píng)論
            

          # re: 在批處理中加載某個(gè)目錄所有的jar 2008-04-13 22:21 和風(fēng)細(xì)雨
          不錯(cuò)。  回復(fù)  更多評(píng)論
            

          # re: 在批處理中加載某個(gè)目錄所有的jar 2008-04-13 22:44 luchunwei
          start javaw -cp bin;lib\*; MainClass  回復(fù)  更多評(píng)論
            

          # re: 在批處理中加載某個(gè)目錄所有的jar 2008-04-14 01:19 隔葉黃鶯
          java -Djava.ext.dirs="c:\lib" 這樣寫不錯(cuò)的,就是假如有相同的 jar 包,但不同版本不知會(huì)出問(wèn)題不,也破壞的類加載器的不同職責(zé)

          start javaw -cp bin;lib\*; 用通配符的形式要 jdk 6 才支持。

          還可這么寫的
          CLASSPATH=`find lib -name *.jar|xargs|sed "s/ /:/g"`
          CLASSPATH=".:$CLASSPATH"  回復(fù)  更多評(píng)論
            

          # re: 在批處理中加載某個(gè)目錄所有的jar 2008-04-14 10:43 Always BaNg.
          @x.matthew
          這種通過(guò)-Djava.ext.dirs="lib"的方式不錯(cuò),但ext的類加載器與app的加載器不一樣,跟classloader綁定的比如JNI library將會(huì)出現(xiàn)問(wèn)題,所以只適合于你把自己的程序打到某個(gè)jar包放到lib目錄下,跟依賴包一起被ext classloader加載。

          @luchunwei
          這種方式很先進(jìn),學(xué)習(xí)了!


          @隔葉黃鶯
          原來(lái)在linux下只需要一句話,馬上改了,簡(jiǎn)單才是美。  回復(fù)  更多評(píng)論
            

          # re: 在批處理中加載某個(gè)目錄所有的jar 2008-04-16 16:43 solo
          很有用,謝謝各位!  回復(fù)  更多評(píng)論
            

          # re: 在批處理中加載某個(gè)目錄所有的jar[未登錄](méi) 2008-06-09 00:38 菜鳥
          Windows里面可以用JSscript或VBSscript,跟LINUX的SHELL差不多強(qiáng)大,語(yǔ)法和WEB里面的一樣,但是有很多現(xiàn)成對(duì)象,例如FileSystemObject可用  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 攀枝花市| 双牌县| 红桥区| 建平县| 中阳县| 封开县| 当涂县| 体育| 德安县| 盐山县| 彭泽县| 开化县| 宜州市| 南郑县| 乐东| 疏附县| 英超| 闻喜县| 收藏| 边坝县| 海口市| 永川市| 肥城市| 茌平县| 登封市| 库伦旗| 沽源县| 兴仁县| 洪湖市| 彰武县| 长寿区| 兴国县| 裕民县| 慈溪市| 攀枝花市| 颍上县| 台南市| 故城县| 江西省| 泰顺县| 陇川县|