对于bash大师来说,这将是一个非常简单的免费赠品:
题
使用bash,如何从目录中的所有文件中创建类路径?
细节
给定目录:
LIB=/path/to/project/dir/lib
除了* .jar文件外,仅包含以下内容:
junit-4.8.1.jar
jurt-3.2.1.jar
log4j-1.2.16.jar
mockito-all-1.8.5.jar
我需要以以下形式创建用冒号分隔的类路径变量:
CLASSPATH=/path/to/project/dir/lib/junit-4.8.1.jar:/path/to/project/dir/lib/jurt-3.2.1.jar:/path/to/project/dir/lib/log4j-1.2.16.jar:/path/to/project/dir/lib/mockito-all-1.8.5.jar
几乎可以表达我正在寻找的逻辑的一些伪代码大致如下:
for( each file in directory ) {
classpath = classpath + ":" + LIB + file.name
}
通过bash脚本完成此操作的简单方法是什么?
新答案
(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
那样)。
如果没有find
Mac 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)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句