不管linux/windows或其它OS,都提供一个shell与kernel交互,并且shell都有一个类似的for内置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
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 %
set clspath = bootstrap . jar
for % %j in ( *. jar) do (
set clspath = %clspath % ; %cd %/% %j
echo current jar is % %j .
)
echo classpath is %clspath %
很奇怪的是最后的结果却是 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 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
对比一下,可以发现:
- 第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下只需要一句话,马上改了,简单才是美。 回复 更多评论