클래스 경로의 디렉토리에 모든 jar 파일을 포함시키는 방법이 있습니까?
노력 java -classpath lib/*.jar:. my.package.Program
하고 있는데 그 항아리에있는 클래스 파일을 찾을 수 없습니다. 각 jar 파일을 클래스 경로에 별도로 추가해야합니까?
답변
Java 6 이상을 사용하는 classpath 옵션은 와일드 카드를 지원합니다. 다음에 유의하십시오.
- 따옴표 (
"
) 사용 - 사용
*
하지 말고 사용*.jar
윈도우
java -cp "Test.jar;lib/*" my.package.MainClass
유닉스
java -cp "Test.jar:lib/*" my.package.MainClass
이것은 Windows와 비슷하지만 :
대신 사용 합니다 ;
. 와일드 카드를 사용할 수없는 경우bash
다음 구문을 허용하십시오 ( lib
모든 Java 아카이브 파일이 포함 된 디렉토리).
java -cp $(echo lib/*.jar | tr ' ' ':')
(클래스 경로 사용은 -jar
옵션 과 호환되지 않습니다 . 참조 : 명령 프롬프트에서 여러 클래스 경로 라이브러리로 jar 파일 실행 )
와일드 카드 이해
로부터 클래스 경로 문서 :
클래스 경로 항목은 기본 이름 와일드 카드 문자를 포함 할 수 있으며
*
, 확장자가있는 디렉토리의 모든 파일 목록을 지정하는 것과 같습니다..jar
또는로.JAR
. 예를 들어, 클래스 경로 항목foo/*
은 foo라는 디렉토리의 모든 JAR 파일을 지정합니다. 단순히 구성된 클래스 경로 항목*
은 현재 디렉토리의 모든 jar 파일 목록 으로 확장됩니다.포함 된 클래스 경로 항목이
*
클래스 파일과 일치하지 않습니다. 단일 디렉토리 foo에서 클래스와 JAR 파일을 모두 일치 시키려면
foo;foo/*
또는foo/*;foo
. 선택한 순서에 따라 클래스 및 리소스foo
가 JAR 파일보다 먼저로드 되는지foo
또는 그 반대로 로드 되는지가 결정 됩니다.서브 디렉토리는 재귀 적으로 검색되지 않습니다. 예를 들어
foo/*
JAR 파일은foo
,하지에foo/bar
,foo/baz
등디렉토리의 JAR 파일이 확장 된 클래스 경로에 열거되는 순서는 지정되지 않았으며 플랫폼에 따라, 심지어 동일한 머신에서 순간에 따라 다를 수도 있습니다. 잘 구성된 응용 프로그램은 특정 순서에 의존해서는 안됩니다. 특정 순서가 필요한 경우 클래스 파일에서 JAR 파일을 명시 적으로 열거 할 수 있습니다.
와일드 카드의 확장은 클래스 로딩 프로세스 자체에서 늦지 않고 프로그램의 주요 메소드를 호출하기 전에 조기에 수행됩니다. 와일드 카드를 포함하는 입력 클래스 경로의 각 요소는 이름 지정된 디렉토리에 JAR 파일을 열거하여 생성 된 요소의 (비어있는) 순서로 대체됩니다. 디렉토리가 예를 들어,
foo
포함a.jar
,b.jar
및c.jar
다음 클래스 패스foo/*
로 확장foo/a.jar;foo/b.jar;foo/c.jar
, 그 캐릭터 라인은 시스템 프로퍼티의 값이 될 것이다
java.class.path
.
CLASSPATH
환경 변수에서 어떤 다르게 취급하지 않는-classpath
(또는-cp
) 명령 줄 옵션을 선택합니다. 즉,이 모든 경우에 와일드 카드가 사용됩니다. 그러나 클래스 경로 와일드 카드는Class-Path jar-manifest
헤더 에서 무시됩니다 .
참고 : Java 8의 알려진 버그로 인해 Windows 예제는 뒤에 별표가있는 백 슬래시 선행 항목을 사용해야합니다 : https://bugs.openjdk.java.net/browse/JDK-8131329
답변
창에서 이것은 작동합니다 :
java -cp "Test.jar;lib/*" my.package.MainClass
그리고 이것은 작동하지 않습니다 :
java -cp "Test.jar;lib/*.jar" my.package.MainClass
* .jar을 확인 하여 * 와일드 카드를 단독으로 사용해야합니다 .
Linux에서는 다음이 작동합니다.
java -cp "Test.jar:lib/*" my.package.MainClass
구분 기호는 세미콜론 대신 콜론입니다.
답변
이 문제 는 다른 필수 jar과 함께 클래스 경로를 지정하는 Manifest ( ) 파일 이 포함 된 기본 jar 파일 을 배치 한 후 함께 배치하여 해결합니다. 이 경우 코드를 실행할 때만 선언 하면됩니다.myapp.jar
Manifest.mf
java -jar myapp.jar
따라서 메인 jar
을 일부 디렉토리에 배포 한 다음 종속 jar을 그 lib
아래 의 폴더에 넣으면 매니페스트가 다음과 같습니다.
Manifest-Version: 1.0
Implementation-Title: myapp
Implementation-Version: 1.0.1
Class-Path: lib/dep1.jar lib/dep2.jar
주의 : 이것은 플랫폼에 독립적입니다. UNIX 서버 나 Windows PC에서 동일한 jar을 사용하여 시작할 수 있습니다.
답변
“lib”디렉토리에 모든 jar이있는 java-sun 1.6.0_24를 사용하는 Ubuntu 10.04에 대한 내 솔루션 :
java -cp. : lib / * my.main.Class
이것이 실패하면, 다음 명령이 작동해야합니다 (lib 디렉토리의 모든 * .jar를 classpath param에 인쇄합니다)
java -cp $ (lib / *. jar의 i의 경우 echo -n $ i :; 완료). my.main.Class
답변
짧은 답변: java -classpath lib/*:. my.package.Program
Oracle은 클래스 경로 와일드 카드 이해 섹션 에서 Java 6 및 Java 7의 클래스 경로에서 와일드 카드 사용에 대한 문서를 제공합니다 . (이 글을 쓸 때 두 페이지에 동일한 정보가 포함되어 있습니다.) 다음은 주요 내용을 요약 한 것입니다.
-
일반적으로 지정된 디렉토리에 모든 JAR을 포함시키기 위해 와일드 카드
*
( not*.jar
)를 사용할 수 있습니다 . -
와일드 카드는 클래스 파일이 아닌 JAR에만 일치합니다. 디렉토리의 모든 클래스를 가져 오려면 디렉토리 이름에서 클래스 경로 항목을 종료하십시오.
-
위의 두 옵션을 결합하여 디렉토리에 모든 JAR 및 클래스 파일을 포함시킬 수 있으며 일반적인 클래스 경로 우선 순위 규칙이 적용됩니다. 예 :
-cp /classes;/jars/*
-
와일드 카드는 하위 디렉토리에서 JAR을 검색 하지 않습니다 .
-
CLASSPATH
시스템 속성 또는-cp
또는-classpath
명령 줄 플래그 를 사용하면 위의 글 머리 기호가 적용됩니다 . 그러나Class-Path
개미 빌드 파일에서와 같이 JAR 매니페스트 헤더 를 사용하면 와일드 카드가 적용 되지 않습니다 .
예, 첫 번째 링크는 최고 점수 답변에서 제공 한 것과 동일하지만 (오버 테이밍의 희망은 없습니다) 그 답변은 링크를 넘어서는 많은 설명을 제공하지 않습니다. 요즘 스택 오버플로에서는 이러한 종류의 동작이 권장되지 않으므로 확장 할 것이라고 생각했습니다.
답변
윈도우 :
java -cp file.jar;dir/* my.app.ClassName
리눅스 :
java -cp file.jar:dir/* my.app.ClassName
알림 :
– 윈도우 경로 구분자는 ;
– 리눅스 경로 구분자는 :
-에서 윈도우 CP 인수가 공백을 포함하지 않는 경우, “따옴표”선택 사항입니다