做了一个 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
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
提供另一种办法
#!/bin/sh
#获取当前目录
PWD=
pwd
for i in lib/*;
do CLASSPATH=$PWD/$i:"$CLASSPATH";
done
export CLASSPATH=.:$CLASSPATH
java Your Main Class
太好,更简练了,对我来说写成下来那样子就行了
#!/bin/sh
CP=.
for file in lib/*;
do CP=${CP}:$file;
done
echo $CP #我只要用这个CP就行
这个更方便:
CLASSPATH=
find lib -name *.jar|xargs|sed "s/ /:/g"
CLASSPATH=".:$CLASSPATH"
用sed啊,更精练了,谢谢,再来个Dos的批处理写法
很好,很强大!
自己补上一个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%