新答案
(2012年10月)
无需手动构建类路径列表。Java支持包含jar文件的目录的便捷通配符语法。
java -cp "$LIB/*"
(请注意,
*是 内 引号)。
来自的解释
man java:
为了特别方便,包含*的基本名称的类路径元素被认为等效于指定目录中所有带有扩展名
.jar或.JAR(Java程序无法区分两次调用之间的区别)的文件列表。例如,如果目录foo包含
a.jar和b.JAR,则将类路径元素foo/*扩展为A.jar:b.JAR,除非未指定jar文件的顺序。列表中包括指定目录中的所有jar文件,甚至是隐藏的jar文件。仅由组成的类路径条目*扩展为当前目录中所有jar文件的列表。的CLASSPATH环境变量,其中所定义,将类似地扩展。任何类路径通配符扩展都会在Java虚拟机启动之前发生-
除查询环境外,任何Java程序都不会看到未扩展的通配符。
旧答案
好
简单但不完美的解决方案:
CLASSPATH=$(echo "$LIB"/*.jar | tr ' ' ':')
有一个小缺陷,那就是不能正确处理带有空格的文件名。如果那很重要,请尝试以下稍微复杂一些的版本:
更好
CLASSPATH=$(find "$LIB" -name '*.jar' -printf '%p:' | sed 's/:$//')
这仅在您的find命令支持时才有效
-printf(如GNU
find那样)。
如果没有
findMac OS X上的GNU ,则可以
xargs改用:
CLASSPATH=$(find "." -name '*.jar' | xargs echo | tr ' ' ':')
最好?
另一种(更奇怪的)方法是更改字段分隔符变量
$IFS。这看起来很奇怪,但是在所有文件名下都表现良好,并且仅使用shell内置程序。
CLASSPATH=$(JARS=("$LIB"/*.jar); IFS=:; echo "${JARS[*]}")说明:
JARS
设置为文件名数组。IFS
更改为:
。- 回显该数组,并将
$IFS
其用作数组条目之间的分隔符。表示文件名之间用冒号打印。
所有这些都是在子Shell中完成的,因此对的更改
$IFS不是永久的(这将是baaaad)。



