Linux/Unix下读取lib目录下所有包生成classpath的Shell

做了一个 Java 程序放在 Solaris 下运行,用到许多的第三方包,有 *.zip 的和 *.ja r的,放在 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 了,可是相信大多数同我一样,还享受不起最新版,只能暂且麻烦一些了。

本文链接 https://yanbin.blog/linux-unix-lib-classpath-shell/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

6 Comments
Inline Feedbacks
View all comments
blackstone
17 years ago

提供另一种办法

#!/bin/sh

#获取当前目录

PWD=pwd

for i in lib/*;

do CLASSPATH=$PWD/$i:"$CLASSPATH";

done

export CLASSPATH=.:$CLASSPATH

java Your Main Class

Unmi
17 years ago

太好,更简练了,对我来说写成下来那样子就行了

#!/bin/sh

CP=.

for file in lib/*;

do CP=${CP}:$file;

done

echo $CP #我只要用这个CP就行

飞猫
17 years ago

这个更方便:
CLASSPATH=find lib -name *.jar|xargs|sed "s/ /:/g"
CLASSPATH=".:$CLASSPATH"

Unmi
17 years ago

用sed啊,更精练了,谢谢,再来个Dos的批处理写法

生活在别处
17 years ago

很好,很强大!

Unmi
17 years ago

自己补上一个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!;lib\%%a

@echo %cp%