bash를 사용하여 디렉토리의 모든 파일에서 클래스 경로를 어떻게 만드나요?
이 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
내가 찾고있는 논리를 거의 표현하는 일부 seudo 코드는 다음과 같은 라인을 따라있을 것입니다.
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를 확장A.jar:b.JAR
, jar 파일의 순서가 지정되지 않은 것을 제외하고. 디렉토리 디렉토리의 모든 jar 파일 (숨겨진 파일 포함)이 목록에 포함됩니다. 로 구성된 클래스 단순히 경로 항목*
은 현재 디렉토리의 모든 항아리 목록 파일 으로 확장됩니다.CLASSPATH
환경 변수, 정의시에는 같이 전개됩니다. 클래스 경로 와일드 카드 확장은 JVM (Java Virtual Machine)이 시작되기 전에 발생합니다. 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
. 이것은 매우 이상하게 보이지만 모든 파일 이름에서 잘 작동하며 쉘 내장 기능 만 사용합니다.
CLASSPATH=$(JARS=("$LIB"/*.jar); IFS=:; echo "${JARS[*]}")
설명 :
JARS
파일 이름의 배열로 설정됩니다.IFS
로 변경:
됩니다.- 배열이 에코
$IFS
되고 배열 항목 사이의 구분 기호로 사용됩니다. 파일 이름 사이에 콜론이 인쇄됨을 의미합니다.
이 모든 작업은 하위 셸에서 수행 된 수행에 대한 변경 $IFS
은 작업이지 (baaaad)입니다.
for i in $LIB/*.jar; do
CLASSPATH=$CLASSPATH:$i
done
CLASSPATH=`echo $CLASSPATH | cut -c2-`
또 다른 변형이 있습니다.
printf -v CLASSPATH "$LIB/%s:" *.jar; CLASSPATH=${CLASSPATH%:}
printf -v
다소 비슷 sprintf
합니다. 중괄호 확장은 끝에서 여분의 콜론을 제거합니다.
베스트
awk
=) 모든 것이 더 좋습니다.
CLASSPATH=$(awk '$0=lib"/"FILENAME' ORS=":" lib=$LIB *.jar)
'ProgramingTip' 카테고리의 다른 글
Java에서 프로토콜 기능에 해당하는 C ++이 있습니까? (0) | 2020.11.27 |
---|---|
Python에서 PIL을 사용하여 이미지를 다른 이미지에 어떻게 합성하고 있습니까? (0) | 2020.11.27 |
웹킷 스크롤바 스타일을 지정된 요소에 적용 (0) | 2020.11.27 |
D3 SVG 등록에 텍스트 추가 (0) | 2020.11.27 |
ASMX 파일이 JSON을 출력하도록하는 방법 (0) | 2020.11.27 |