Exception in thread main java.lang. NoClassDefFoundError 오류 해결 방법

6735 단어 Exceptioninthreadmain
오류 설명
javac helloworld.자바는 통과할 수 있다.하지만 자바 Helloworld에서 오류가 발생했습니다.

hadoop@xuwei-erplab:~/jarfile$ java HelloWorld 
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: org/xuwei/HelloWorld)
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
	at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: HelloWorld. Program will exit.
2. 문제 해결
문헌1에서 많은 사람들이 언급한 것은 환경 변수classpath 설정 오류 때문이다.현재 경로 "."를 추가하지 않았습니다.근데 제 classpath를 봤어요.

export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
이것은 나의classpath 설정이 정확하다는 것을 나타낸다.이때 나는 문헌 2를 찾았는데 그 안에 helloword는 가방 이름과 가방 이름 두 종류로 나뉜다고 언급했다.
3. 패키지 계층이 없는 Hello World.java

public class HelloWorld {
	public static void main(String args[]){
		System.out.println("Hello World!");
	}
}
/home/hadoop/jarfile에 저장하고 javac 명령을 사용하여 컴파일합니다.

$ javac HelloWorld.java  
실행:

$ java HelloWorld 
화면 인쇄:
  Hello World!
4. 초보자의 실수
4.1. 운행할 때 가지고 왔습니다.class 접미사
다음 명령을 사용하려면: (아래 명령은 HelloWorld.java가 있는 디렉터리에서 실행된다고 가정합니다. 즉,/home/hadoop/jarfile)

java HelloWorld.class 
시스템은 Hello World 패키지 아래의class라는 클래스 파일을 실행하고 있다고 오인하여 시스템의 CLASSPATH 아래 (일반적으로 현재 디렉터리를 포함) Hello World를 찾으려고 합니다.class.class와 같은 종류, 이런 종류는 당연히 존재하지 않는다.또한 존재할 수 없습니다. 왜냐하면class는 키워드이기 때문에 하나의 종류의 이름이 될 수 없습니다.그래서 다음과 같은 오류 메시지가 표시됩니다.
  Exception in thread "main"java.lang.NoClassDefFoundError: HelloWorld/class
4.2. 파일 이름 대소문자 오류
Windows 같은 시스템에서는 대소문자를 구분하지 않고 컴파일할 수 있습니다.예를 들어 Hello World를 컴파일합니다.java 에서도 사용할 수 있습니다.

javac helloworld.java
컴파일할 수도 있지만, 생성된 클래스 파일은 원본 파일과 일치합니다. HelloWorld.class.그러나 실행할 때 대소문자를 주의해야 한다. 예를 들어 다음과 같은 명령을 사용해서 실행하려고 한다.

java helloworld 
1과 유사한 오류가 보고됩니다.
  Exception in thread "main"java.lang.NoClassDefFoundError: helloworld (wrong name: HelloWorld)
5. 패키지 계층을 포함하는 HelloWorld.java
예를 들면 위의 Hello World.java 수정은 다음과 같습니다.

package org.myorg;

public class HelloWorld {
	public static void main(String args[]){
		System.out.println("Hello World!");
	}
}
번역할 때 두 가지 방법이 있다
5.1. 직접 번역

javac HelloWorld.java 
현재 디렉토리에서 HelloWorld를 내보냅니다.class.이 때, 실행은 위와 같은 방법을 사용할 수 없습니다. 사용:

java HelloWorld 
실행 중 다음과 같은 오류가 발생했습니다.
  Exception in thread "main"java.lang.NoClassDefFoundError: HelloWorld (wrong name: org/myorg/HelloWorld)
상기 오류 정보를 보면 시스템에서 HelloWorld 클래스를 찾을 수 있습니다. (현재 경로가 CLASSPATH에 포함되어 있기 때문에, 구체적으로 wrong name을 제시하고, 관심 있는 친구는 Java 언어 규범을 참조하십시오.) 그러나 이 클래스는 org에 속합니다.myogr 가방.그래서 당신이 해야 할 일은 상술한 패키지 차원에 따라 디렉터리 차원을 만들고 그 위에 생성된 Hello World를 만드는 것입니다.class는/home/hadoop/jarfile/org/myorg 디렉터리에 놓습니다.HelloWorld.java는/home/hadoop/jarfile/디렉터리에 있습니다.실행:

java org.myorg.HelloWorld 
인쇄:
 Hello World! 
여기서 주의해야 할 것은 자바 org\myorg\HelloWorld를 사용해서는 안 된다는 것입니다. 이때 다음과 같은 오류가 발생합니다.
Exception in thread "main"java.lang.NoClassDefFoundError :org\myorg\HelloWorld (wrong name: org\myorg\HelloWorld)
좀 이상하지 않아요? 그건 어쩔 수 없어요.앞으로 자바의 가방에 대해 더 깊은 인식을 가지게 되면 알게 될 것이다.
5.2. -d 컴파일 옵션 사용하기
위의 컴파일링 방법이 좀 번거롭다고 생각하십니까? 현재 경로(또는 임의로 지정한 경로)에서 패키지 차원을 자동으로 생성할 수 있습니까?있다!- d 컴파일 옵션을 사용하면 할 수 있습니다.

javac -d . HelloWorld.java 
현재 디렉터리(/home/hadoop/jarfile)에서 org\myorg 디렉터리(/home/hadoop/jarfile/org/myorg)를 생성하고 출력합니다.class 파일도 안에 있습니다.실행:

java org.myorg.HelloWorld 
시스템 인쇄:
Hello World!
생성된 클래스 파일을 디렉터리에 집중적으로 저장하고 싶다면:/home/hadoop/jarfile/test에서 이 디렉터리를 만들고 컴파일할 때:

javac -d /home/hadoop/jarfile/test HelloWorld.java 
생성된 클래스 파일을/home/hadoop/jarfile/test 디렉터리에 놓고 패키지 차원에 따라 디렉터리 경로를 만들 수 있습니다./home/hadoop/jarfile/test/org/myorg에서 HelloWorld를 찾을 수 있습니다.class 파일.다음 명령을 사용하면 올바르게 실행할 수 있습니다 (다른 클래스를 사용하려면 CLASSPATH에 설정하십시오).

hadoop@xuwei-erplab:~/jarfile/test$ java org.xuwei2.HelloWorld 
상기 명령은/홈/hadoop/jarfile/test에서 실행됩니다.
만약 안 된다면 아래의 방법을 참고할 수 있다.
두 번째 문제 해결 방법:
이것은 JDK의 버전으로 인해 발생한 문제입니다. 저는 OpenJDK를 장착하고 있는데 JAR 패키지의 결함이 발생하여 시동 오류가 발생할 수 있습니다. 그래서 여기는 Oracle 정부에서 제시한 JDK로 교체해야 합니다.
1. Oracle 공식에 가서 이런 가방을 다운로드합니다: jdk-7u79-linux-x64.tar.gz
2. 압축을 풀고/usr/local/java 디렉터리로 이동
3. 환경 변수 추가:vim/etc/profile, 파일 마지막 몇 줄 추가

export JAVA_HOME=/usr/local/java/jdk1.7.0_79   // JDK
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
4. 위의 설치를 완료한 후 Tomcat을 다시 시작하면 오류가 발생합니다. Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
이 문제는 Tomcat이 JDK의 환경 변수를 인식하지 못했기 때문입니다.
5. Tomcat의 bin 디렉터리의catalina를 수정합니다.sh 파일, 파일의 시작 부분에 다음 코드를 추가합니다.

export JAVA_HOME=/usr/local/java/jdk1.7.0_79  //// JDK
export JRE_HOME=/usr/local/java/jdk1.7.0_79/jre
마지막으로 Tomcat을 시작합니다. 로그 인쇄가 정상적이고 브라우저도 접근할 수 있습니다. 문제 해결
Exception in thread "main"java.lang.InternalError
        at sun.security.ec.SunEC.initialize(Native Method)
        at sun.security.ec.SunEC.access$000(SunEC.java:49)
        at sun.security.ec.SunEC$1.run(SunEC.java:61)

좋은 웹페이지 즐겨찾기