我平常做服務(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)原因,稍微改一下:
不管linux/windows或其它OS,都提供一個(gè)shell與kernel交互,并且shell都有一個(gè)類似的for內(nèi)置commnd。
下面是linux bash的嘗試










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








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

2

3

4

5

6

7

8

9

10

對(duì)比一下,可以發(fā)現(xiàn):
- 第4行加上了setlocal enabledelayedexpansion,即變量延遲展開(kāi)。
- 第10行有一個(gè)endlocal,結(jié)束這個(gè)設(shè)置
- 第6行把%classpath%變成了!classpath!。
雖然目的達(dá)到了,還是要鄙視微軟的dos batch,實(shí)在很弱,不知Powershell怎樣。
參考資料:
setlocal