在批处理中加载某个目录所有的jar

研究完下面这篇文章之后,我选择了以下的方法:
JAVA_HOME="/opt/jdk1.5.0_16" PATH=$JAVA_HOME/bin:$PATH CLASSPATH=`find /opt/batch/lib -name *.jar|xargs|sed "s/ /:/g"` CLASSPATH="/opt/batch/bin:$CLASSPATH" export JAVA_HOME PATH CLASSPATH
 我平常做服务器或者应用程序的时候喜欢把各种依赖包如log4j, jdbc, commons-lang等放到一个lib目录下,然后启动的时候将这些jar包设置到classpath上。以前我经常使用set classpath=log4j.jar;jdbc.jar;commons-lang.jar硬加载,但 问题就是每新加入一个jar,就得改批处理一次,再就是每开发一个就得这么设置一次。很烦人,perl 创始人说,偷懒的程序员才是好程序员:),我需要一个通用的加载方式。

不管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

工作的很好,于是在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 %

很奇怪的是最后的结果却是 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


对比一下,可以发现:

  1. 第4行加上了setlocal enabledelayedexpansion,即变量延迟展开。
  2. 第10行有一个endlocal,结束这个设置
  3. 第6行把%classpath%变成了!classpath!。

虽然目的达到了,还是要鄙视微软的dos batch,实在很弱,不知Powershell怎样。

参考资料:
   setlocal


 

posted on 2008-04-13 15:32 Always BaNg. 阅读(1166) 评论(8)   编辑   收藏 所属分类: Java网摘备用
<script type="text/javascript"> // </script>

Feedback

#  re: 在批处理中加载某个目录所有的jar 2008-04-13 17:45 x.matthew
其实通过设置可以加载一个目录的,下面是一个例子
java -Djava.ext.dirs="c:/lib" org.xmatthew.spy2servers.console.Main start   回复   更多评论
  

#  re: 在批处理中加载某个目录所有的jar 2008-04-13 18:48 BeanSoft
good!!!   回复   更多评论
  

#  re: 在批处理中加载某个目录所有的jar 2008-04-13 22:21 和风细雨
不错。   回复   更多评论
  

#  re: 在批处理中加载某个目录所有的jar 2008-04-13 22:44 luchunwei
start javaw -cp bin;lib/*; MainClass   回复   更多评论
  

#  re: 在批处理中加载某个目录所有的jar 2008-04-14 01:19 隔叶黄莺
java -Djava.ext.dirs="c:/lib" 这样写不错的,就是假如有相同的 jar 包,但不同版本不知会出问题不,也破坏的类加载器的不同职责

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

还可这么写的
CLASSPATH=`find lib -name *.jar|xargs|sed "s/ /:/g"`
CLASSPATH=".:$CLASSPATH"   回复   更多评论
  

#  re: 在批处理中加载某个目录所有的jar 2008-04-14 10:43 Always BaNg.
@x.matthew
这种通过-Djava.ext.dirs="lib"的方式不错,但ext的类加载器与app的加载器不一样,跟classloader绑定的比 如JNI library将会出现问题,所以只适合于你把自己的程序打到某个jar包放到lib目录下,跟依赖包一起被ext classloader加载。

@luchunwei
这种方式很先进,学习了!


@隔叶黄莺
原来在linux下只需要一句话,马上改了,简单才是美。   回复   更多评论
  

#  re: 在批处理中加载某个目录所有的jar 2008-04-16 16:43 solo
很有用,谢谢各位!   回复   更多评论
  

#  re: 在批处理中加载某个目录所有的jar[未登录] 2008-06-09 00:38 菜鸟
Windows里面可以用JSscript或VBSscript,跟LINUX的SHELL差不多强大,语法和WEB里面的一样,但是有很多现成对象,例如FileSystemObject可用   回复   更多评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值