如何在bat文件中查找jar包,动态设置classpath

最近在项目中使用了脚本文件(bat文件)启动Java程序。启动前如何设置classpath呢?

最直接的办法就是在bat文件中,直接设置classpath,如:

set classpath="./classes;./lib/dom4j.jar;./lib/hibernate.jar;./lib/jta.jar;./lib/mysql.jar;./lib/javassist.jar;"

java -classpath %classpath%  com.*.Server

这种方法最大的问题,就是每次增删jar都在手工维护这个classpath。那有没有更好的办法来实现呢?既然所有的jar包都在lib目录下,那能不能在lib下查找出所有的jar包,然后把它自动加入到classpath中呢?

查找jar包使用到了DOS中的for命令:

SET CLASSPATH=..\classes
for %%i in (..\lib\*.jar) do  set CLASSPATH=%CLASSPATH%;%%i
运行后,发现有问题,CLASSPATH只包含了classes目录和最后一个jar包。经过分析发现DOS在加载for命令时,就将%CLASSPATH%作了展开操作(此时展开,CLASSPATH的值为..\classes),在for循环中每一次执行都是“..\classes” + “*.jar”.
经过尝试,找到了一个办法规避:增加一个setclasspath.bat,在bat文件中对CLASSPATH进行设置:
set CLASSPATH=%CLASSPATH%;%1
修改原有的for循环:
for %%i in (..\lib\*.jar) do call setclasspath.bat %%i
这样就OK了。
虽然问题解决了,但是增加了一个bat文件,解决方法不够优雅。那有没有更好的解决方法呢?有!
之前的方法不成功,是因为for命令在加载时就把CLASSPATH变量进行了展开操作,我们期望的是在for循环执行中再展开。只要延迟CLASSPATH的展开操作,问题就解决了。
DOS系统提供了setlocal enabledelayedexpansion,可以启用延迟变量展开操作功能。只要在for命令前启用即可:
setlocal enabledelayedexpansion
for %%i in (..\lib\*.jar) do  set CLASSPATH=!CLASSPATH!;%%i
注:要延迟展开的变量,使用!包围,而不是原来的%。

至此,问题完美解决!


                
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值