명령 줄에서 JAR 파일을 실행하고 클래스 경로를 지정합니다.


115

JAR 파일을 컴파일 하고 매니페스트에 Main-Class를 지정했습니다 (Eclipse Export 기능 사용). 내 종속성은 모두 레이블이 지정된 디렉토리에 lib있습니다. lib/*클래스 경로로를 사용해야 함을 지정하는 동안 JAR 파일을 실행하는 방법에 대한 직접적인 대답을 얻을 수없는 것 같습니다 .

난 노력 했어:

]$ java -jar -cp .:lib/* MyJar.jar
]$ java -cp .:lib/* -jar MyJar.jar
]$ java -cp .:lib/* com.somepackage.subpackage.Main

기타...

각각 다음과 같은 오류가 발생합니다.

Error: Could not find or load main class ....

또는 NoClassDefFoundError라이브러리를 찾을 수 없음을 나타냅니다.

심지어 JAR 파일을 다시 만들고 lib디렉토리와 내용을 포함 했지만 여전히 주사위가 없습니다.

명령 줄에서 JAR 파일을 실행하고 사용할 클래스 경로를 지정하려면 어떻게해야합니까?


답변:


204

지정 -jar하면 -cp매개 변수가 무시됩니다.

에서 문서 :

이 옵션을 사용하는 경우 JAR 파일은 모든 사용자 클래스의 소스이며 다른 사용자 클래스 경로 설정은 무시됩니다.

또한 필요한 jar 파일을 다른 jar 파일에 "포함"할 수 없습니다 (그 내용을 추출하고 .class 파일을 jar 파일에 넣어야합니다).

두 가지 옵션이 있습니다.

  1. lib디렉토리의 모든 jar 파일을 매니페스트에 포함 (상대 경로를 사용할 수 있음)
  2. 다음을 사용하여 명령 줄에서 jar를 포함한 모든 것을 지정 합니다 -cp.
    java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

22
; 대신 : 다음과 같이 Windows를 사용하는 경우 java -cp MyJar.jar; lib / * com.somepackage.subpackage.Main
오류

또한 필요한 jar 파일을 다른 jar 파일에 "포함"할 수 없습니다. 물론 넌 할 수있어. 내부 사용을위한 경우 (즉, 사용자가 기술적 인 기술을 가지고있을 것으로 예상하는 경우) jar를 실행하기 전에 1 단계가 실행되도록 요청할 수 있습니다 unzip MyJar.jar lib/*.jar. 그런 다음 제안한대로 실행할 수 있습니다java -cp MyJar.jar:lib/* ...
Roger

3
안타까운 점은 외부 서버 별 속성 파일에 대한 참조와 함께 "모두 포함 된"uber jar를 실행하는 일반적인 사용 사례라는 것입니다. 분명하지 않은 차단제,하지만 확실히 덜 메인 지정해야하는 -jar을 사용할 수없는 경우 명령 자세한
앤드류 노먼

알아내는 데 시간이 걸렸습니다. log4j 파일을 명시 적으로로드하려면 약 6 줄이 필요합니다. 수정되지 않을 또 다른 Java 버그.
Tuntable

1
선언 된 Class-Path는 jar 파일을로드하는 데만 사용할 수 있습니다. 예를 들어, log4j3.xml을 조회하는 데 사용할 수 없습니다. 잘 했어.
Tuntable

34

jar 파일을 실행하고 다음과 같이 클래스 경로를 지정합니다.

java -cp <jar_name.jar:libs/*> com.test.App

jar_name.jar 실행하려는 JAR의 전체 이름입니다.

libs/* 종속성 JAR의 경로입니다.

com.test.Appmain(String[])메소드 가있는 JAR에서 클래스의 완전한 이름입니다.

jar 및 종속 jar에는 실행 권한이 있어야합니다.


10

유닉스 쉘에서 다음을 수행 할 수 있습니다.

java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

Windows PowerShell에서 다음을 수행 할 수 있습니다.

java -cp "MyJar.jar;lib\*" com.somepackage.subpackage.Main

4

또는 원하는 경우 매니페스트를 사용하여 클래스 경로 및 기본 클래스를 -cp지정하면 기본 클래스 를 사용 하거나 지정할 필요가 없습니다 . 귀하의 경우에는 다음과 같은 줄이 포함됩니다.

Main-Class: com.test.App
Class-Path: lib/one.jar lib/two.jar

안타깝게도 매니페스트에서 각 jar의 철자를 입력해야합니다 (한 번만 수행하는 것만 큼 큰 문제가 아닙니다. 스크립트를 사용하여 파일을 빌드하거나 ANT, Maven 또는 Gradle과 같은 빌드 도구를 사용할 수 있습니다). 그리고 참조는 .NET Framework를 실행하는 상대 또는 절대 디렉토리 여야합니다 java -jar MyJar.jar.

그런 다음

java -jar MyJar.jar

Class-Path가 외부 jar 내의 파일을 참조해야한다고 생각합니다. MyJar.jar 외부의 구성 파일을 참조하기 위해 일반적으로 작동하도록 만들 수 없습니다.
Tuntable

0

Runtime.getRuntime.exec (command)를 수행하여 args가있는 클래스 경로를 포함하는 jar를 다시 시작할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.