noclassdeffounderRor java.exe -jar로 내 병을 실행하려고하는 동안… 무슨 일이야?

StackOverflow https://stackoverflow.com/questions/250166

문제

더 쉬운 배포를 위해 항아리로 포장하려는 응용 프로그램이 있습니다. 응용 프로그램은 클래스 경로에서 도달 할 수있는 클래스 세트로 실행될 때 (Windows CMD 창에서) 컴파일하고 실행됩니다. 그러나 동일한 CMD 창에서 수업을 듣고 Java 1.6으로 실행하려고하면 예외를 시작합니다.

C:\dev\myapp\src\common\datagen>C:/apps/jdk1.6.0_07/bin/java.exe -classpath C:\myapp\libs\commons -logging-1.1.jar -server -jar DataGen.jar
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
    at com.example.myapp.fomc.common.datagen.DataGenerationTest.<clinit>(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
    ... 1 more

재미있는 점은, 불쾌한 로지가 공통점에있는 것처럼 보인다는 것입니다. Jar 파일 (그렇습니다. 정말 거기에 있습니다) :

C:\dev\myapp\src\common\datagen>dir C:\myapp\libs\commons-logging-1.1.jar
 Volume in drive C is Local Disk
 Volume Serial Number is ECCD-A6A7

 Directory of C:\myapp\libs

12/11/2007  11:46 AM            52,915 commons-logging-1.1.jar
           1 File(s)         52,915 bytes
           0 Dir(s)  10,956,947,456 bytes free

Commons-Logging-1.1.jar 파일의 내용 :

C:\dev\myapp\src\common\datagen>jar -tf C:\myapp\libs\commons-logging-1.1.jar
META-INF/
META-INF/MANIFEST.MF
org/
org/apache/
org/apache/commons/
org/apache/commons/logging/
org/apache/commons/logging/impl/
META-INF/LICENSE.txt
META-INF/NOTICE.txt
org/apache/commons/logging/Log.class
org/apache/commons/logging/LogConfigurationException.class
org/apache/commons/logging/LogFactory$1.class
org/apache/commons/logging/LogFactory$2.class
org/apache/commons/logging/LogFactory$3.class
org/apache/commons/logging/LogFactory$4.class
org/apache/commons/logging/LogFactory$5.class
org/apache/commons/logging/LogFactory.class
... (more classes in commons-logging-1.1 ...)

그렇습니다. 커먼즈 로깅에는 로그 팩토리 클래스가 있습니다. 그리고 마지막으로, 내 항아리의 내용은 다음과 같습니다.

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: 10.0-b23 (Sun Microsystems Inc.)
Main-Class: com.example.myapp.fomc.common.datagen.DataGenerationTest
Class-Path: commons-logging-1.1.jar commons-lang.jar antlr.jar toplink
 .jar GroboTestingJUnit-1.2.1-core.jar junit.jar

이것은 저를 괴롭 혔고, 내가 하루 이상 버그를 쓴 동료들은 모든 동료들입니다. 최소한 이에 대한 제 3 자 솔루션은 라이센스 제한 및 회사 정책 (예 : EXE를 생성하거나 항아리를 포장하기위한 도구)으로 인해 해답을 구할 수 있습니다. 궁극적 인 목표는 내 개발 Windows 상자에서 Linux 서버로 복사 할 수있는 항아리를 만들고 데이터베이스를 채우는 데 사용됩니다 (따라서 클래스 경로는 개발 및 배포 환경간에 다를 수 있음). 이 미스터리에 대한 단서는 크게 감사 할 것입니다!

도움이 되었습니까?

해결책

-jar 옵션은 -classpath를 상호 배타합니다. 오래된 설명을 참조하십시오 여기

-항아리

JAR 파일에 캡슐화 된 프로그램을 실행합니다. 첫 번째 인수는 시작 클래스 이름 대신 JAR 파일의 이름입니다. 이 옵션이 작동하려면 JAR 파일의 매니페스트에는 Main-Class : ClassName 양식의 줄이 포함되어야합니다. 여기에서 ClassName은 응용 프로그램의 시작점 역할을하는 공개 정적 무효 기본 (String [] args) 메소드가있는 클래스를 식별합니다.

JAR 파일 및 JAR 파일 매니페스트 작업에 대한 정보는 JAR 도구 참조 페이지와 Java 튜토리얼의 JAR 트레일을 참조하십시오.

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

빠르고 더러운 해킹은 부트 스트랩 클래스 경로에 클래스 경로를 추가하는 것입니다.

-xbootclasspath/a :

기본 부트 스트랩 클래스 경로에 추가하기 위해 Directires, Jar Archives 및 Zip Archives의 콜론 구분 경로를 지정하십시오.

그러나 AS @단 올바른 솔루션은 항아리 매니페스트에 필요한 모든 항아리의 클래스 경로가 포함되어 있는지 확인하는 것입니다.

다른 팁

당신은 생략 할 수 있습니다 -jar 옵션 및 다음과 같은 JAR 파일을 시작하십시오.

java -cp MyJar.jar;C:\externalJars\* mainpackage.MyMainClass

이것은 발생하는 문제입니다.

JAR 파일이 "C : java apps appli.jar"에서로드 된 경우, Manifest 파일이 클래스-팩스 : 참조 "lib/elople.jar"가있는 경우 클래스 로더는 "c : java에서 볼 수 있습니다. apps lib ""Other.jar "의 경우. JAR 파일 항목 "lib/other.jar"를 보지 않습니다.

해결책:-

  1. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 내보내기를 선택하십시오.
  2. Java 폴더를 선택하고 JAR 파일 대신 실행 가능한 JAR 파일을 선택하십시오.
  3. 적절한 옵션을 선택하고 라이브러리 처리 섹션에서 세 번째 옵션 IE를 선택하십시오 (필수 라이브러리를 생성 된 JAR 옆의 하위 폴더로 복사).

[ 편집하다 = 세 번째 옵션 JAR 외에 폴더를 생성합니다. 2nd 옵션 ( "패키지 필요한 라이브러리로 생성 된 JAR")도 항아리가 있으므로 사용할 수 있습니다. ]

  1. 마무리를 클릭하면 Danifest 파일에 언급 된 항아리가 포함 된 폴더와 함께 지정된 위치에서 항아리가 생성됩니다.
  2. 터미널을 열고 항아리의 적절한 경로를 제공 하고이 명령 java -jar abc.jar를 사용하여 실행하십시오.

    이제 클래스 로더는 참조 된 항아리의 올바른 폴더를 살펴볼 것입니다. 이제는 앱 Jar가 포함 된 동일한 폴더에 존재하기 때문에 "Java.lang.noclassDeffounderRor"예외는 없습니다.

이것은 나를 위해 효과가있었습니다 ... 그것이 당신에게도 효과가 있기를 바랍니다 !!!

프로그램에서 외부 라이브러리를 사용하고 항아리 파일로 모두 함께 포장하려고하면 클래스 경로 문제로 인해 간단하지 않습니다.

사용하는 것이 좋습니다 Onejar 이 문제의 경우.

내 병에도 같은 문제가있었습니다.

  1. manifest.mf 파일 작성 :

명시 적 버전 : 1.0

봉인 : 사실

클래스-경로 :. lib/jarx1.jar lib/jarx2.jar lib/jarx3.jar

메인 클래스 : com.mainclass

  1. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 내보내기를 선택하십시오.

확인 된 프로젝트에 대한 모든 아웃 포트 폴더 내보내기를 선택하십시오

  1. Workspace에서 기존 매니페스트 사용을 선택하고 Manifest.mf 파일을 선택하십시오.

이것은 나를 위해 효과가있었습니다 :)

나는 클래스 경로에 대한 항아리 목록에 각 jag "required_lib/sun/pop3.jar required_lib/sun/smtp.jar"의 목록 후 공간이 있어야한다는 매니페스트를 사용할 때 발견했습니다. 목록의 마지막이더라도.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top