搬砖头

Knocking on Heaven's Door
posts - 34, comments - 6, trackbacks - 0, articles - 0
原帖地址: http://www.blogjava.net/Unmi/archive/2007/07/25/132391.html


做了一个 Java 程序放在 Solaris 下运行,用到许多的第三方包,有 *.zip 的和 *.jar的,放在 lib 目录下,然后写了一个 shell 脚本来运行那个 java 程序,那就要在 classpath 中包含所有在 lib 中的第三方包。

原来的做法是在 classpath中把lib目录中一个个的包文件名用冒号连缀起来,比如
classpath=.:lib/a.jar:lib/b.jar:lib/c.jar:lib/d.zip
java -classpath $classpath com.unmi.Main

碰到程序升级,在lib中增加或减少了包文件,又要再重新修改那个启动 java 程序的 shell 脚本,甚是麻烦。由此想写个 shell,功能是能列举lib目录下所有第三方包,用冒号连缀成一个 classpath 变量,这样的话,无论在 lib 目录中增减包,都不需要再次修改那个启动 java 程序的 shell 脚本,就像 tomcat,无论是 common/lib 还是 app/WEB-INF/lib 中的第三方包,即放即用。

记得在以前一个公司,有见过这样的脚本,不过记不清了,大致是用 while 循环来生成那样一个classpath 变量的。

还好在网上有高人出手相救,在 CSDN 发了一个贴:

http://community.csdn.net/Expert/topic/5671/5671131.xml?temp=.7013971

过一天就有人回复,完成这一功能的代码是:

#!/bin/sh

_jar=`ls | grep "..*\.zip$"`
_zip=`ls | grep "..*\.jar$"`
_classpath="${_jar} ${_zip}"
classpath=`echo ${_classpath} | sed -e 's/ /:/g'`
echo ${classpath}

这里根据我们前面的需求,是要列出 lib 目录下的 *.zip 或 *.jar 包,所以 shell 改写为:

#!/bin/sh

_jar=`ls lib | grep "..*\.zip$"`  #列举lib目录下的 *.zip 文件
_zip=`ls lib | grep "..*\.jar$"`  #列举lib目录下的 *.zip 文件
_classpath="${_jar} ${_zip}"
classpath=`echo ${_classpath} | sed -e 's/ /:lib\//g'`   #包名前都要带个 lib/
echo ${classpath}

这样,你就可以使用这个 classpath 变量了

java -classpath .:${classpath} com.unmi.Main #把当前目录 . 也加到 classpath 中

在此非常感谢 mymtom(mymtom) 的回复。

最后回头来想想这也就是在原来的 JRE 版本需要手工处理这些事情,如果能用上新版 6.0 Mustang JRE,就可以用它的新特性之一,classpath 通配符,java -classpath .;lib\*.jar:lib\*.zip 了,可是相信大多数同我一样,还享受不起最新版,只能暂且麻烦一些了。
posted on 2007-07-25 21:14 Unmi 阅读(685) 评论(4)  编辑  收藏

Feedback

# re: [导入]Linux/Unix下读取lib目录下所有包生成classpath的Shell 2007-07-27 09:41 blackstone
提供另一种办法

#!/bin/sh
#获取当前目录
PWD=`pwd`
for i in lib/*;
do CLASSPATH=$PWD/$i:"$CLASSPATH";
done

export CLASSPATH=.:$CLASSPATH

java Your Main Class  回复  更多评论
  

# re: [导入]Linux/Unix下读取lib目录下所有包生成classpath的Shell 2007-07-27 13:07 Unmi
太好,更简练了,对我来说写成下来那样子就行了

#!/bin/sh
CP=.
for file in lib/*;
do CP=${CP}:$file;
done
echo $CP
#我只要用这个CP就行
  回复  更多评论
  

# re: [导入]Linux/Unix下读取lib目录下所有包生成classpath的Shell 2007-09-30 10:38 飞猫
这个更方便:
CLASSPATH=`find lib -name *.jar|xargs|sed "s/ /:/g"`
CLASSPATH=".:$CLASSPATH"
echo $CLASSPATH

  回复  更多评论 
  
 
DOS批处理脚本枚举 lib 目录下的 jar 和 zip 文件,拼成 classpath 的脚本

@echo off
setlocal EnableDelayedExpansion
set cp=.
for /F %%a in ('dir lib\*.jar lib\*.zip /b') do set cp=!cp!;%%a
@echo %cp%

只有注册用户登录后才能发表评论。


网站导航: