2012-11-19 2 views
0

도우미 클래스와 메서드 (주로 정적 메서드)가 포함 된 my.jar 파일 인 my.common.jar를 만들었습니다. 또한 jar 파일 인 test.jar을 my.common.jar의 클래스에서 정적 메서드를 호출하는 main 메서드로 만들었습니다.또 다른 NoClassDefFoundError 퍼즐

java -classpath path/to/myjars/my.common.jar:./test.jar test.Tester 

테스터는 방법 주를 포함 test.jar의 클래스입니다 :이 같은 주요 시작할 때

모든 것이 잘 작동합니다. 내가 이런 식으로 실행할 때

는하지만 NoClassDefFoundError my/common/Myclass 얻을 : 내가 그렇게 열심히 노력

java -classpath path/to/myjars/my.common.jar -jar test.jar 

을하지만, 나는 그것이 실패하거나이 문제를 해결하는 방법을 이유를 알아낼 수 없습니다입니다. 도와 주셔서 감사합니다.

Manifest-Version: 1.0 
    Build-Jdk: 1.6.0_13 
    Created-By: Apache Maven 
    Main-Class: test.Tester 
    Archiver-Version: Plexus Archiver 
+0

MANIFEST 파일의 test.jar에서 주 클래스를 정의하지 않은 것 같습니다. –

+0

두 번째 구현이 작동합니다. jar의 MANIFEST.MF에서 주 클래스를 지정해야합니다 –

답변

3

당신은 명령 줄에서 모두 -classpath-jar 옵션을 사용할 수 없습니다

----- 부록 ---- 나는과 같이 test.jar의 매니페스트 파일이 보이는 것을 언급하는 것을 잊었다 . 둘 중 하나만 사용하십시오. 둘 다 사용할 수는 없습니다.

-jar 옵션을 사용하면이 명령은 JAR 파일 매니페스트에서 진입 점 클래스와 런타임 클래스 경로를 찾을 수 있습니다. -classpath 인수는 CLASSPATH 환경 변수와 같이 무시됩니다. 인용하려면 java manual page :

".이 옵션을 사용하면 JAR 파일이 모든 사용자 클래스의 소스 및 기타 사용자 클래스 패스 설정이 무시됩니다"

(실행 가능한) JAR 파일이 다른 JAR 파일을 사용해야하는 경우 매니페스트에 Class-Path 속성이 필요합니다. 이 속성 값은 공백으로 구분 된 URL 목록입니다. here을 참조하십시오.

귀하의 경우 그래서

, 당신은 당신의 JAR의 매니페스트에 이런 식으로 뭔가를 추가해야합니다 : 자바 튜토리얼의

Class-path: /path/to/myjars/my.common.jar 

This page

이 항목을 포함하고 Class-path 매니페스트 라인이 적절해야한다는 경고를 포함 JVM이이를 인식 할 수 있도록 CR 또는 NL로 종료되었습니다.

+0

"CLASSPATH를 내보내십시오. = pth/to/myjars/my.common."jar "명령 줄에 -classpath가 없기 때문에 작동하지 않습니다. 또한이 정보는 -classpath와 -jar를 함께 사용할 수 없다는 새로운 정보입니다. –

+0

Stephen에게 감사드립니다. 클래스 경로를 매니페스트 파일에 적용하면 이제는 작동합니다 ...하지만 이전에 그렇게 할 필요가 없었습니다.이 프로그램을 java 1.4.2에서 실행 중이었고 이제 Java 1.6으로 마이그레이션했습니다. 그래서 왜 제대로 작동하는지 궁금합니다. –

+0

@CJ - 왜 그런지 설명 할 수 없습니다. 아마도 1.4.2 Java 설치 확장에 my.common.jar 파일의 복사본을 심었을 것입니다. 디렉토리 (Tsk, tsk, tsk) –

0

test.jar에 매니페스트를 넣습니다. 다른 jar는 일반적으로 ./lib 디렉토리로 이동합니다. JAR에 META-INF/MANIFEST.MF를 추가하려면 일반적으로 빌드 인프라 : ant 또는 maven을 사용할 수 있습니다. 또는 수동으로 수행하십시오.

이미 Main-Class : test.Tester가 있습니다. 이제 클래스 경로 : ...

Maven에서 종속성은 일반적으로 pom.xml의 jar에 추가됩니다. 자신 만의 항아리는 mvn을 사용하여 저장소에 저장할 수 있습니다. 그런 다음 pom.xml에 종속성을 추가합니다.