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


221

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에 대한 것으로 보이지만 유사한 개념을 가지고 있습니다.


1
메인 클래스를 살펴보면 패키지에 들어 있지 않습니다 ( package graphics;맨 위에 있을 것입니다 ). 가 graphics패키지 구조의 헤드는? 스퀘어가 package graphics.shapes맨 위에 있습니까?
lreeder

1
.java 파일의 위치를 ​​나열하고 있지만 런타임 문제이므로 실제로 관심이있는 것은 .class 파일의 위치와 클래스 경로에 있는지 여부입니다. 메인 클래스를 어떻게 운영하고 있습니까?
Thor84no

이클립스에서 Shift + ctrl + o를 누르면 수입을 정리할 수 있습니다
happybuddha

클래스 이름을 올바르게 입력했는지 확인하십시오. 내가 대문자와 클래스 이름을 시작하지 않았기 때문에이 오류를 얻고 있었다
제레미 보그에게

이것은 때때로 주요 리팩토링 후 IntelliJ IDEA에서 발생합니다. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고-> 컴파일 모듈 을 선택한 다음 프로젝트를 다시 시작하면 다시 작동합니다.
Zar

답변:


223

코드를 컴파일 한 후에 .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과 같은 빌드 관리 도구를 사용하면 클래스 경로에 대해 걱정할 필요가 없으며 코드에 집중할 수 있습니다! 즉, 말했다 링크는 명령 줄에서 실행할 때 클래스 경로를 설정하는 방법에 대해 설명합니다.


Android에서 단위 테스트를 실행하는 동안 발생한 오류로 인해 이것을 읽고 있습니다. 필자의 경우 테스트에서 종속성이 누락되어 NoClassDefFoundError가 발생했습니다. 이와 같은 오류를 방지하기 위해 의존성 주입에 대해 생각해야합니다. 정교한 답변에 감사드립니다.
전형적인 대니

130

에 다른 사람의 관점을 수정하고 싶습니다 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 ();

필자의 경우 클래스를 컴파일하여 app이라는 디렉토리로 옮겼습니다. package app;하위 디렉토리 앱으로 옮기기 전에 줄을 추가 하고 다시 컴파일해야했습니다.
taco

1
위에 나열된 3 외에도 ClassLoaders는 이러한 오류를 일으킬 수 있습니다. 기본적으로 ClassNotFoundException입니다.이 시나리오에서는 클래스가 클래스 경로에 있지만 다른 ClassLoader에서로드를 시도 할 수 있습니다.
Fahad

2와 3은 클래스 로더에 따라 다릅니다. javadoc에 따르면 예외는 이유 1만을위한 것입니다.
Samuel

1
사례 2와 사례 3을 테스트했습니다. NoClassDefFoundError가 아닙니다. ExceptionInInitializerError 사례 2.Class 파일이 있지만 정적 변수를 초기화하는 동안 예외가 발생했습니다. 사례 3.Class 파일이 있습니다. 정적 블록을 초기화하는 동안 예외가 발생했습니다
Michael

1
@Michael,이 링크는이 NoClassDefFoundError경우에 해당하는
추적 추적

15

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

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


1
try / catch 를 통해 런타임에서 처리하는 방법은 무엇입니까?
Maveň ツ

5
이 답변은 글을 쓰는 방식이 정확하지 않습니다. 올바른 방법은 다음과 같습니다. "이 오류의 가능한 원인은 다음과 같습니다 ...."그러나 런타임에 JAR 파일을 클래스 로더로로드 할 때이 오류가 발생하는 다른 이유가있을 수 있습니다.
Elmue

13

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

* 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]

"-d" javac 명령에서 트릭을 수행하여 루트 디렉토리에 모든 .class 파일을 넣는 대신 패키지의 폴더 구조를 만듭니다. 감사합니다!
Jorge Sampayo

9
java.lang.NoClassDefFoundError

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


15
그렇게하는 방법?
Narendra Singh

당신이 요구하는 상황에 달려 있습니다.
sschrass

6

클래스 경로에서 원하는 클래스를 찾을 수없는 경우 클래스 정의 예외 가 발생하지 않습니다. 컴파일 타임 클래스에서 : 클래스가 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 (즉 현재 작업 디렉토리)에 없습니다.

5

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 오류를 해결하는 방법


3

프로젝트가 같은 패키지에 com.blahcode있고 클래스가 호출 Main되면 컴파일 된 파일은와 같은 디렉토리 구조로 출력 될 수 있습니다 ./out/com/blahcode/Main.class. IntelliJ IDEA의 경우 특히 그렇습니다.

쉘이나 cmd에서 실행하려고 할 때 , 서브 디렉토리로 cd포함되어 있어야합니다 com.

cd out
java -classpath . com.blahcode.Main

1

NetBeans 프로젝트에서 수개월 동안 작업 한 후 "메모리 부족"경고가 나타난 직후 갑자기 NoClassDefFoundError 메시지가 나타납니다. Clean 재 구축은 도움이되지 않았지만 Netbeans을 모두 닫고 프로젝트를 다시 열면 오류 보고서가 없었습니다.


1

이 답변은 서비스 에서 발생하는 java.lang.NoClassDefFoundError에만 해당됩니다 .

우리 팀은 최근 서비스를 제공 한 rpm을 업그레이드 한 후이 오류를 발견했습니다. rpm과 그 안의 소프트웨어는 Maven으로 빌드되었으므로 rpm에 포함되지 않은 컴파일 시간 종속성이있는 것 같습니다.

그러나 조사 할 때 발견되지 않은 클래스는 스택 추적의 여러 클래스와 동일한 모듈에있었습니다. 또한 이것은 최근에 빌드에 추가 된 모듈이 아닙니다. 이러한 사실은 Maven 종속성 문제가 아닐 수도 있음을 나타냅니다.

최종 솔루션 : 서비스를 다시 시작하십시오!

rpm 업그레이드가 기본 jar 파일에서 서비스 파일 핸들을 무효화 한 것으로 보입니다. 그런 다음 서비스는 메모리에로드되지 않은 클래스를보고 jar 파일 핸들 목록에서 해당 클래스를 검색했으며 클래스를로드 할 수있는 파일 핸들이 무효화되어이를 찾지 못했습니다. 서비스를 다시 시작하면 모든 파일 핸들이 다시로드되어 rpm 업그레이드 직후 메모리에서 찾지 못한 클래스를로드 할 수있었습니다.

특정 사례가 누군가를 돕기를 바랍니다.


1

나는 오늘 문제에 직면했다. Android 프로젝트가 있는데 프로젝트를 활성화 multidex한 후에 는 더 이상 시작되지 않습니다.

그 이유는 내가 추가해야하고 Application class다른 모든 것보다 먼저 호출 해야하는 특정 멀티 덱스 메소드를 호출하는 것을 잊었 기 때문 입니다.

 MultiDex.install(this);

이 안내서에 따라 멀티 덱스를 올바르게 활성화하십시오. https://developer.android.com/studio/build/multidex.html

이 줄을 Application 클래스에 추가해야합니다

 @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }

1

내 프로젝트에서 문제를 해결 한 것은 Chrome 브라우저와 chromedriver가 호환되지 않았다는 것입니다. 브라우저를 열 수없는 매우 오래된 버전의 드라이버가있었습니다. 방금 최신 버전을 다운로드하여 문제를 해결했습니다. 문제를 어떻게 발견 했습니까? 내 응용 프로그램과 함께 이전 버전의 FF가있는 Selenium 기본 파이어 폭스 드라이버를 사용하여 프로젝트를 실행했기 때문에 문제는 브라우저와 드라이버 간의 비 호환성이라는 것을 깨달았습니다.

이것이 동일한 오류 메시지를 생성 한 비슷한 문제가있는 사람에게 도움이되기를 바랍니다.


0

이 체인에 내 두 센트 :

클래스 경로에 ( 대신 ) 전체 경로 가 포함되어 있는지 확인하십시오. 그렇지 않으면 여전히 오류가 발생할 수 있습니다 ./home/user/lib/some_lib.jar~/lib/some_lib.jarNoClassDefFoundError


이것은 부분적으로 사실이지만 더 복잡합니다. 1) 클래스 경로에서 상대 경로를 사용할 있지만 JVM의 현재 디렉토리를 기준으로 JVM에서 해결할 수 있어야합니다. 이것은 그들을 연약 하게 만듭니다 . 2) 클래스 경로 환경 변수를 설정할 때 및 기타 쉘 메타 문자를 사용할 ~ 있지만 변수를 설정하는 데 사용하는 메커니즘이 실제 경로 이름으로 확장되는 경우에만 가능합니다. 를 사용하는 경우 bash"혼합 된"결과를 얻을 수 있습니다. 예를 들어, echo ~:~명령 행에 입력 할 때 얻는 것을보십시오 . 첫번째~ 는 확장되었지만 두 는 확장되지 않았습니다.
Stephen C

0

런타임 클래스 로더가로드 한 클래스가 Java 루트 로더가 이미로드 한 클래스에 액세스 할 수없는 경우 NoClassFoundError가 발생합니다. java에 따라 다른 클래스 로더가 다른 보안 도메인에 있기 때문에 jvm은 루트 로더에 의해 이미로드 된 클래스가 런타임 로더 주소 공간에서 분석되는 것을 허용하지 않습니다.

'java -javaagent : tracer.jar [YOUR java ARGS]'로 프로그램을 실행하십시오.

로드 된 클래스와 클래스를로드 한 로더 env를 표시하는 출력을 생성합니다. 클래스를 확인할 수없는 이유를 추적하면 매우 유용합니다.

// ClassLoaderTracer.java
// From: https://blogs.oracle.com/sundararajan/entry/tracing_class_loading_1_5

import java.lang.instrument.*;
import java.security.*;

// manifest.mf
// Premain-Class: ClassLoadTracer

// jar -cvfm tracer.jar manifest.mf ClassLoaderTracer.class

// java -javaagent:tracer.jar  [...]

public class ClassLoadTracer 
{
    public static void premain(String agentArgs, Instrumentation inst) 
    {
        final java.io.PrintStream out = System.out;
        inst.addTransformer(new ClassFileTransformer() {
            public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {

                String pd = (null == protectionDomain) ? "null" : protectionDomain.getCodeSource().toString();
                out.println(className + " loaded by " + loader + " at " + new java.util.Date() + " in " + pd);

                // dump stack trace of the thread loading class 
                Thread.dumpStack();

                // we just want the original .class bytes to be loaded!
                // we are not instrumenting it...
                return null;
            }
        });
    }
}

0

Android Studio에서 나에게 일어났습니다.

나를 위해 일한 솔루션 : 스튜디오를 다시 시작하십시오.


0

Android 스튜디오를 사용하는 Android 개발과 동일한 문제가있었습니다. 제공된 솔루션은 일반적이며 도움이되지 않았습니다 (적어도 나를 위해). 몇 시간의 연구 끝에 다음과 같은 해결책을 발견했으며 Android Studio를 사용하여 개발하는 Android 개발자에게 도움이 될 수 있습니다. 환경 설정-> 빌드, 실행, 배포-> 즉시 실행-> 첫 번째 옵션을 선택 취소하십시오.

이 변경으로 나는 시작하고 실행 중입니다. 이것이 내 친구에게 도움이되기를 바랍니다.


0

이 예외의 한 가지 오류 원인은 Proguard에 대한 일관성없는 정의 (예 : 누락)에서 비롯 될 수 있습니다.

-library : "path.to.a.missing.jar.library"입니다.

이것은 jar가 있고 clean & build가 실패하는 경우 컴파일 및 실행이 잘 작동하는 이유를 설명합니다. proguard 설정에서 새로 추가 된 jar 라이브러리를 정의해야합니다!

항아리가 없을 때 도착하는 유사한 개미 메시지와 쉽게 혼동되기 때문에 Proguard의 오류 메시지는 실제로 표준이 아닙니다. 맨 아래에만 문제를 예방할 수있는 작은 힌트가있을 것입니다. 따라서 전통적인 클래스 경로 오류 등을 검색하는 것은 매우 논리적 인 일이지만 헛된 일입니다.

명백히, NoClassDefFound 예외는 예를 들어 생성 된 실행 가능한 jar 파일이 생성되고 proguard 일관성 부족에 기반하여 실행될 때의 결과 일 것입니다. 어떤 사람들은 "지옥"을 지킨다 고 부릅니다


0

Eclipse 용 FileSync 플러그인을 사용하여 Tomcat에서 실시간 디버그를 할 수 있으며 Tomcat 의 Eclipse 작업 공간 에 디렉토리에 NoClassFoundError대한 동기화 항목을 추가했지만 Eclipse 의 디렉토리에 대한 폴더 동기화를 추가하지 않았기 때문에 수신 했습니다.bin=> classesmetadataextlib=>

C:\Users\Stuart\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\myApp\WEB-INF\lib


0

RCP (Rich Client Platform) 로 알려진 Eclipse 기반 응용 프로그램을 개발 중 입니다. 그리고 리팩토링 후 (이 클래스를 플러그인에서 새 클래스로 이동)이 문제에 직면했습니다.

프로젝트와 Maven 업데이트를 청소해도 도움이되지 않았습니다.

Bundle-Activator 가 자동으로 업데이트되지 않아서 문제가 발생했습니다 . 새 플러그인의 MANIFEST.MF 에서 Bundle-Activator를 수동으로 업데이트하면 문제점이 해결되었습니다.


0

최근에 다음과 같이 android studio에서 멀티 덱스 지원을 추가 한 경우 :

// To Support MultiDex
implementation 'com.android.support:multidex:1.0.1'

따라서 솔루션은 응용 프로그램 대신 MultiDexApplication에서 확장됩니다.

public class MyApp extends MultiDexApplication {


0

클래스에 정적 핸들러가 있는지 확인하십시오. 그렇다면 루 퍼가있는 스레드에서만 정적 핸들러 만 시작할 수 있으므로 다음과 같은 방식으로 충돌이 발생할 수 있습니다.

1. 먼저 간단한 스레드에서 클래스 인스턴스를 만들고 충돌을 잡으십시오.

그런 다음 메인 스레드에서 Class의 field 메소드를 호출하면 NoClassDefFoundError가 발생합니다.

테스트 코드는 다음과 같습니다.

public class MyClass{
       private static  Handler mHandler = new Handler();
       public static int num = 0;
}

기본 활동의 onCrete 메소드에서 테스트 코드 파트를 추가하십시오.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //test code start
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                MyClass myClass = new MyClass();
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
    }).start();

    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    MyClass.num = 3;
    // end of test code
}

handlerThread to in handler를 사용하여 수정하는 간단한 방법이 있습니다.

private static Handler mHandler;
private static HandlerThread handlerThread = new HandlerThread("newthread");
static {
    handlerThread.start();
    mHandler = new Handler(handlerThread.getLooper(), mHandlerCB);
}

0

모듈 외부에서 테스트 클래스를 사용하지 마십시오

나는 해결책이 없다. "런타임에는 없다"는 컴파일의 또 다른 맛이다.

다른 모듈에있는 다른 테스트 클래스의 JUnit 테스트 클래스에서 매우 편리한 메소드를 사용하려고했습니다. 테스트 코드는 패키지 된 jar의 일부가 아니기 때문에 아니오입니다.하지만 Eclipse 내에서 사용자 클래스가 볼 수 있기 때문에 몰랐습니다.

내 솔루션은 생산 코드의 일부인 기존 유틸리티 클래스에 메소드를 배치하는 것이 었습니다.


0

내 환경에서는 단위 테스트 에서이 문제가 발생합니다. * .pom에 하나의 라이브러리 종속성을 추가 한 후에 수정되었습니다.

예 :

에러 메시지:

java.lang.NoClassDefFoundError: com/abc/def/foo/xyz/Iottt

치어 :

<dependency>
    <groupId>com.abc.def</groupId>
    <artifactId>foo</artifactId>
    <scope>test</scope>
</dependency>

0

Git 브랜치 변경 후이 오류가 발생했습니다. Eclipse의 특정 경우, org.eclipse.wst.common.component 파일의 .settings 디렉토리에 누락 된 행이 있습니다. 아래에서 볼 수 있듯이

Maven Install을 사용하여 프로젝트 종속성을 복원하면 도움이됩니다.

여기에 이미지 설명을 입력하십시오


0

를 사용하는 gradlew경우 이동하여 ./gradle/wrapper/gradle-wrapper.properties변경하십시오.distributionUrl Gradle을 올바른 버전으로.

JDK14를 사용하는 경우 시도하십시오

distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip

-1

내 genymotion 장치에서 많이 발생합니다. Genymotion이 설치된 드라이브에 사용 가능한 메모리가 충분한 지 확인하십시오.


그것에 대한 참조가 있습니까?
Wai Ha Lee

아니요, 정기적으로 디스크 공간이 부족하며 좋은 양을 비우지 않고 Genymotion 가상 장치를 제거 / 재설치하지 않으면이 오류가 계속 발생합니다.
totteire
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.