2013-02-10 2 views
0

좋아요. 하루 종일 인터넷 검색을 해봤습니다. 그래서 내가 본 모든 것을 시도해 보았습니다. 그래서 누군가 도움을 줄 수 있는지 궁금합니다.NoClassDefFoundError 도서관을 참조 할 때

나는 jar 파일을 참조하는 클래스가 있습니다. lib 폴더의 작업 공간으로 복사했습니다. Classifier4J.jar, 내 클래스는 콘솔에서 완벽하게 실행됩니다. 내가 그것을 필요로하는 classifier4j 라이브러리를 참조 할의 수하지 .JAR를 만들 때 그래서 분명

Exception in thread "pool-2-thread-1" java.lang.NoClassDefFoundError: net/sf/classifier4J/bayesian/IWordsDataSource...(10 more) 

: 나는 함께 .JAR을 포장하고 나에게 오류를 제공합니다 다른 프로그램에서 .JAR를 실행하려고합니다.

것들 나는 시도했다 :

매니페스트 파일

- 변경 내 빌드 경로

-in 일식이 파일에 가서 내 .JAR와 .JAR을 - 포장 -configure > export> java> runnable .jar은 라이브러리

등을 참조하며 다른 것은 작동하지 않으며 아무 것도 작동하지 않습니다.

어쨌든 비슷한 문제가 있거나 이런 일이 발생하는 이유를 알고 있다면 정말 저의 머리를 썩히는 데 도움이 될 수 있습니다. 이것은 일식에 문제가 있습니까? 그것은 일식을 통해 할 수 있습니까? 사전에

덕분에

제이

+0

이클립스에서 응용 프로그램을 실행할 수 있습니까? –

+0

@NishantShreshth 옙 응용 프로그램이 완벽하게 작동합니다. 단지 .jar 파일에 추가하려고 시도하고 다른 응용 프로그램에서 사용하면 오류가 발생합니다. – hacker9116

+0

eclipse를 사용하여 실행 가능한 jar로 내보낼 때 "생성 된 jar 옆의 하위 폴더에 필요한 라이브러리 복사"옵션을 선택하십시오. 이제 의존성이 실제로 끝나고 있는지 살펴보십시오. –

답변

0

시간이 지나면 마침내 해결책을 찾았습니다. 클래스를 .jar 파일로 출력 할 때 내 매니페스트 파일을 가리켰습니다. 작동하지 않았기 때문에 잘못하고있는 것을 찾을 수 없었습니다. 나는 항아리에 실제로 담겨 있던 것을 보았고 그 항아리에 올바른 manifest 파일을 두지 않은 것을 보았습니다.

Manifest-Version: 1.0 

이처럼 보였다해야 :

Manifest-Version: 1.0 
Class-Path: ../lib/Classifier4J.jar 

에있는 lib 폴더 다시 내 항아리는 어디에서 디렉토리이었다 그것은처럼 보였다 새로운 하나를 넣어했다. 모든 것이 완벽하게 작동합니다. 모든 도움에 감사드립니다.

제이

0

특정 라이브러리는 당신의 항아리에 포함되지 않습니다. 이클립스 빌드 구성을 수정하여 라이브러리를 포함 시키거나 프로그램을 실행할 때 클래스 패스에 라이브러리의 jar를 추가 할 수 있습니다.
나중에 더 쉬울 수도 있습니다. 프로그램을 실행할 때 다음 명령을 명령에 추가하십시오.

java -cp yourjar.jar;thelibrarysjar.jar com.your.Mainclass 
0

당신이 실제로 시도 것을, 당신이 실제로 뭘 하려는지 이해하기 어렵다, 당신은 일을 기대하지만, 나는 실마리가 여기에있다 생각 :

packaged the .jar with my .jar

이 보인다 모든 종속 JAR을 포함하는 "실행 가능한 JAR"을 작성하려고한다는 것을 의미합니다. 작동하지 않는 "실행 가능한 JAR"은 다른 JAR을 포함 할 수 없습니다. (. 글쎄 ...하지만 당신이 심각하게 복잡한 일을하지 않고 응용 프로그램의 클래스 경로에 넣어 수 없습니다 수 있습니다) 기본적으로

, 두 가지 옵션이 있습니다 :

    는 포함하지 마십시오

  • (실행 가능 여부에 관계없이) 응용 프로그램 JAR에서 종속 종속 JAR을 선택하십시오. 이들을 별도로 유지하고 실행 클래스 경로가이를 포함하도록 구성하십시오. (그리고 실행 JAR에 대한 것을 조심, 실행 클래스 경로는 매니페스트 항목으로 구성해야합니다. 당신이 java -jar ...을 사용하는 경우 -cp argument$CLASS_PATH는 무시됩니다!)

  • 는 이른바 '동네 짱 JAR "를 만들기 폭발에 의해 응용 프로그램 JAR 및 모든 종속 JAR을 단일 디렉토리에 저장 한 다음 해당 로트에서 단일 JAR (적합한 Manifest 포함)을 작성하십시오.귀하의 빌드 도구 또는 IDE 일부 플러그인을 통해 이것을 지원할 수 있습니다.

개인적으로는 이전 접근 방식과 응용 프로그램 및 래퍼 스크립트의 "설치 디렉토리"가 결합 된 방식을 선호합니다. 후자의 접근 방식을 사용하면 사용자 (또는 배포자)가 종속 JAR의 버전을 혼합 및 일치시키는 것을 어렵게 만듭니다. 또한 "uber-JAR"접근 방식 인 과 같이 타사 라이브러리의 라이센스와 충돌 할 수 있습니다.

마침내

, 어쩌면 우리는 어딘가에

.... the .jar file is ran from a tomcat application its a simple adapter for log files that all.

확인을 얻을 수 있습니다. 중요이기 때문에 이전에 언급 했어야합니다. 웹 컨테이너 (즉, Tomcat과 동일한 JVM)에서 JAR 파일을 사용할 수 있으려면 웹 컨테이너의 디렉토리 트리에 JAR 파일 및 모든 종속 JAR 파일의 사본이 있어야합니다. 두 가지 선택이 있습니다. webapp의 lib 디렉토리 (예 : webapp/WEB-INFO/lib)에 넣거나 공유 라이브러리 디렉토리에 넣습니다. 사용중인 Tomcat 버전에 따라 다릅니다.

+0

매니페스트 파일을 다음과 같이 구성했습니다. 매니페스트 - 버전 : 1.0 클래스 경로 : lib/classifer4j.jar – hacker9116

+0

아직 세부 정보가 충분하지 않습니다. 당신은 당신이 한 모든 것을 정확하게 묘사해야합니다. 의존성은 JAR 파일을 생성 한 방법, 파일이 서로 상대적인 위치, 실행 방법을 정의합니다. –

+0

좋아, 내가 할 수있는 한 많은 세부 사항을 줄 것이다. .jar 파일을 만들기 위해 .jardesc 파일을 만들었고, 그것을 실행하고, 내가 무엇을 포함하고 싶은지 물어 본다. .classpath, .project, myclass.java, 그 후에 내가 앞에서 설명한 manifest 파일을 선택하고 마침을 클릭합니다. classifiier4j.jar 파일은 내 프로젝트의/lib 폴더에 있습니다. 빌드 경로에 포함 시켰으므로 .jar 파일을 올바르게 만들 때 참조해야합니다. .jar 파일은 Tomcat 응용 프로그램에서 실행되며 로그 파일을위한 간단한 어댑터입니다. 도움이 필요하시면 언제든지 문의 해 주시기 바랍니다. – hacker9116

0

당신은 그 NoClassDefFoundError를 거의 이해하지 할 필요가 (이하 "실행 JAR"접근 방식은. 당신이 매니페스트에 넣어 클래스 패스 물건은 무관하다. 그리고 중첩 JAR 파일 중 하나가 작동하지 않습니다. 여기에 작동하지 않습니다) 이는 식별 된 클래스를 찾을 수 없다는 것을 의미합니다. 더 자주 클래스가 발견되었지만 무언가가 성공적으로로드되지 못했습니다.

두 가지 가능성이 가장 높은 문제가있다 -

  • "확인"되는 명명 된 클래스를 방지 다른 어떤 누락 된 클래스입니다.
  • 다른 버전의 클래스 (대개 다른 클래스)가 컴파일과 실행에 사용되기 때문에 일부 비 호환성이 있습니다.

문제가 발생하면 다른 jar의 다른 (호환되지 않는) 버전을 컴파일하는 동안 환경과 비교할 가능성이 큽니다.

관련 문제