[java] java.lang.NoClassDefFoundError를 해결하는 방법?

Oracle의 Java Tutorials 의 예제를 모두 시도했습니다 . 둘 다 잘 컴파일되지만 런타임 에이 오류가 발생합니다.

Exception in thread "main" java.lang.NoClassDefFoundError: graphics/shapes/Square
    at Main.main(Main.java:7)
Caused by: java.lang.ClassNotFoundException: graphics.shapes.Square
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

Main.java파일이 잘못된 폴더에 있을 수 있습니다 . 디렉토리 계층 구조는 다음과 같습니다.

graphics
 Main.java
 shapes
|    Square.java
|    Triangle.java
 linepoint
|    Line.java
|    Point.java
 spaceobjects
|    Cube.java
|    RectPrism.java

그리고 여기 있습니다 Main.java:

import graphics.shapes.*;
import graphics.linepoint.*
import graphics.spaceobjects.*;

public class Main {
    public static void main(String args[]) {
        Square s = new Square(2,3,15);
        Line l = new Line(1,5,2,3);
        Cube c = new Cube(13,32,22);
    }
}

내가 여기서 뭘 잘못하고 있니?

최신 정보

Main클래스를 graphics패키지 에 넣고 (추가 한 package graphics;) 클래스 경로를 “_test”(그래픽이 포함 된 폴더)로 설정하고 컴파일 java graphics.Main한 후 (명령 줄에서) 실행했습니다.

정말 늦게 업데이트 # 2

Eclipse (Notepad ++ 및 JDK)를 사용하지 않았으며 위의 업데이트로 문제가 해결되었습니다. 그러나 이러한 답변 중 많은 것이 Eclipse 및 IntelliJ에 대한 것으로 보이지만 유사한 개념을 가지고 있습니다.



답변

코드를 컴파일 한 후에 .class는 프로그램의 각 클래스에 대한 파일이 생성됩니다. 이 바이너리 파일은 Java가 프로그램을 실행하기 위해 해석하는 바이트 코드입니다. 는 NoClassDefFoundError(이 경우 클래스 로더 나타냅니다 java.net.URLClassLoader동적 로딩 클래스에 대한 책임)는 찾을 수 없습니다 .class당신이 사용하려는하는 클래스 파일을.

필요한 클래스가 없으면 (클래스에 리플렉션이로드되지 않은 경우) 코드가 컴파일되지 않으므로 일반적으로이 예외는 클래스 경로에 필요한 클래스가 포함되어 있지 않음을 의미합니다. 클래스 로더 (특히 java.net.URLClassLoader)는 클래스 경로의 각 항목에서 폴더 a / b / c /의 패키지 abc에서 클래스를 찾습니다. NoClassDefFoundError또한 컴파일 한 .jar 파일의 전 이적 종속성이 누락되어 사용하려고 함을 나타낼 수도 있습니다.

예를 들어, 클래스가 있으면 com.example.Foo컴파일 한 후에 클래스 파일이 생깁니다 Foo.class. 예를 들어 작업 디렉토리가 .../project/입니다. 해당 클래스 파일은에 있어야하며 .../project/com/example클래스 경로를로 설정해야합니다 .../project/.

참고 사항 : Java 및 JVM 언어에 존재하는 놀라운 툴링을 활용하는 것이 좋습니다. Eclipse 및 IDEA와 같은 최신 IDE 및 Maven 또는 Gradle과 같은 빌드 관리 도구를 사용하면 클래스 경로에 대해 걱정할 필요가 없으며 코드에 집중할 수 있습니다! 즉, 말했다 링크는 명령 줄에서 실행할 때 클래스 경로를 설정하는 방법에 대해 설명합니다.


답변

에 다른 사람의 관점을 수정하고 싶습니다 NoClassDefFoundError.

NoClassDefFoundError 여러 가지 이유로 발생할 수 있습니다

  1. ClassNotFoundException-컴파일 타임에 사용할 수 있는지 여부 (예 : 기본 / 자식 클래스)에 관계없이 참조 된 클래스에 대해 .class를 찾을 수 없습니다.
  2. 클래스 파일이 있지만 정적 변수를 초기화하는 동안 예외가 발생했습니다.
  3. 클래스 파일이 있습니다. 정적 블록을 초기화하는 동안 예외가 발생했습니다.

원래 질문에서 CLASSPATH를 참조 된 클래스 jar 파일 또는 해당 패키지 폴더로 설정하여 해결할 수있는 첫 번째 경우였습니다.

“컴파일 시간에 사용 가능”이라는 말의 의미는 무엇입니까?

  • 참조 클래스는 코드에서 사용됩니다.
    예 : A와 B (확장 A)의 두 클래스. B가 코드에서 직접 참조되면 컴파일 타임에 사용할 수 있습니다. 즉 A a = new B ();

“컴파일 타임에 사용할 수 없음”이라는 말의 의미는 무엇입니까?

  • 컴파일 타임 클래스와 런타임 클래스는 다릅니다. 예를 들어 기본 클래스는 클래스의 하위 클래스의 클래스 이름을 사용하여로드됩니다 (
    예 : Class.forName ( “classname”) ). 코드는
    A a = Class.forName ( “B”). newInstance ();

답변

NoClassDefFoundError은 클래스가에 클래스 경로에 Compile time있지만 클래스에 에 존재하지 않음을 의미합니다 Runtime.

이클립스를 사용하는 경우, 당신은이 있는지 확인 shapes, linepoints그리고 spaceobjects의 항목으로 .classpath파일.


답변

컴파일하고 실행하는 동안 다음 오류 중 하나가 발생한 경우 :

* NoClassDefFoundError

* Error: Could not find or load main class hello

* Exception in thread "main" java.lang.NoClassDefFoundError:javaTest/test/hello
(wrong name: test/hello)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

————————– 솔루션 ———————–

문제는 대부분 패키지 구성에 있습니다. 소스 코드의 패키지 분류와 관련하여 클래스를 폴더에 올바르게 배치해야합니다.

On Compiling process use this command:

javac -d . [FileName.java]

To Run the class please use this command:

java [Package].[ClassName]


답변

java.lang.NoClassDefFoundError

컴파일 타임 에 발견 되었지만 런타임 에는 발견 되지 않았 음을 나타냅니다 . 어쩌면 클래스 패스에 추가해야 할 수도 있습니다.


답변

클래스 경로에서 원하는 클래스를 찾을 수없는 경우 클래스 정의 예외 가 발생하지 않습니다. 컴파일 타임 클래스에서 : 클래스가 Java 컴파일러에서 생성되었지만 런타임에 종속 클래스를 찾을 수 없습니다.

하나의 간단한 예를 살펴 보겠습니다.

public class ClassA{
public static void main(String args[]){
     //Some gibberish Code...
     String text = ClassB.getString();
     System.out.println("Text is :" + text);
}

}

public class ClassB{
    public static String getString(){
      return "Testing Some Exception";
 }
}

위의 두 Java 소스 코드가 “NoClassDefinationFoundExceptionDemo”라고하는 일부 폴더에 있다고 가정 해 봅시다.

이제 쉘을여십시오 (Java가 이미 올바르게 설정되었다고 가정)

  1. “NoClassDefinationFoundExceptionDemo”폴더로 이동
  2. Java 소스 파일 컴파일 javac ClassB javac ClassA
  3. 두 파일 모두 성공적으로 컴파일되어 ClassA.class 및 ClassB.class와 동일한 폴더에 클래스 파일이 생성됨
  4. 이제 ClassPath를 현재 작업 디렉토리로 대체하므로 다음 명령 java -cp를 실행합니다
    . ClassA
    및 성공적으로 작동하면 화면에 출력이 표시됩니다.
  5. 이제 현재 디렉토리에서 ClassB.class 파일을 제거했습니다. 이제 명령을 다시 실행하십시오.
    java -cp. ClassA 이제 NoClassDefFoundException과 함께 인사합니다. ClassA에 대한 종속성 인 ClassB는 classpath (즉 현재 작업 디렉토리)에 없습니다.

답변

Java의 NoClassDefFoundError :

정의:

컴파일 시간 동안 클래스가 있지만 런타임 동안 Java 클래스 경로에서 사용할 수없는 경우 NoClassDefFoundError가 발생합니다. 일반적으로 NoClassDefFoundError가 발생하면 로그에 아래 줄이 표시됩니다. “main”스레드의 예외 java.lang.NoClassDefFoundError

가능한 원인들:

  1. 이 클래스는 Java 클래스 경로에서 사용할 수 없습니다.

  2. jar 명령을 사용하여 프로그램을 실행 중일 수 있으며 매니페스트 파일의 ClassPath 속성에 클래스가 정의되지 않았습니다.

  3. 모든 시작 스크립트가 Classpath 환경 변수를 대체합니다.

  4. NoClassDefFoundError는 java.lang.LinkageError의 서브 클래스이므로 네이티브 라이브러리와 같은 종속성 중 하나를 사용할 수없는 경우에도 발생할 수 있습니다.

  5. 로그 파일에서 java.lang.ExceptionInInitializerError를 확인하십시오. 정적 초기화 실패로 인한 NoClassDefFoundError는 매우 일반적입니다.

  6. J2EE 환경에서 여러 클래스 로더 중 클래스의 가시성보다 java.lang.NoClassDefFoundError가 발생할 수있는 경우보다 자세한 내용은 예제 및 시나리오 섹션을 참조하십시오.

가능한 해결 방법 :

  1. 필요한 모든 Java 클래스가 애플리케이션의 클래스 경로에 포함되어 있는지 확인하십시오. 가장 일반적인 실수는 일부 외부 라이브러리에 종속 된 Java 애플리케이션을 실행하기 전에 필요한 모든 클래스를 포함하지 않는 것입니다.

  2. 응용 프로그램의 클래스 경로는 정확하지만 응용 프로그램 실행 전에 클래스 경로 환경 변수가 대체됩니다.

  3. 위에서 언급 한 ExceptionInInitializerError가 애플리케이션의 스택 추적에 나타나지 않는지 확인하십시오.

자원:

Java J2EE에서 java.lang.NoClassDefFoundError를 해결하는 3 가지 방법

java.lang.NoClassDefFoundError – No Class Def Found 오류를 해결하는 방법