不管linux/windows或其它OS,都提供一个shell与kernel交互,并且shell都有一个类似的for内置commnd。
下面是linux bash的尝试










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








很奇怪的是最后的结果却是 classpath is bootstrap.jar;D:/workflow/bingo/lib/servlet-api.jar。很显然batch默认不支持 变量迭代更改。
google了一下,发现原因,稍微改一下:
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

对比一下,可以发现:
- 第4行加上了setlocal enabledelayedexpansion,即变量延迟展开。
- 第10行有一个endlocal,结束这个设置
- 第6行把%classpath%变成了!classpath!。
虽然目的达到了,还是要鄙视微软的dos batch,实在很弱,不知Powershell怎样。
参考资料:
setlocal
Feedback
java -Djava.ext.dirs="c:/lib" org.xmatthew.spy2servers.console.Main start 回复 更多评论
start javaw -cp bin;lib/*; 用通配符的形式要 jdk 6 才支持。
还可这么写的
CLASSPATH=`find lib -name *.jar|xargs|sed "s/ /:/g"`
CLASSPATH=".:$CLASSPATH" 回复 更多评论
这种通过-Djava.ext.dirs="lib"的方式不错,但ext的类加载器与app的加载器不一样,跟classloader绑定的比 如JNI library将会出现问题,所以只适合于你把自己的程序打到某个jar包放到lib目录下,跟依赖包一起被ext classloader加载。
@luchunwei
这种方式很先进,学习了!
@隔叶黄莺
原来在linux下只需要一句话,马上改了,简单才是美。 回复 更多评论