Jak rozwiązać błąd java.lang.NoClassDefFoundError?

221

Próbowałem obu przykładów z samouczków Java Oracle . Oba kompilują się dobrze, ale w czasie wykonywania oba pojawiają się z tym błędem:

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

Myślę, że mogę mieć Main.javaplik w niewłaściwym folderze. Oto hierarchia katalogów:

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

A oto 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);
    }
}

Co ja tu robię źle?

AKTUALIZACJA

Po tym, jak wstawiłem Mainklasę do graphicspakietu (dodałem package graphics;do niej), ustawiłem ścieżkę klasy na „_test” (folder zawierający grafikę), skompilowałem ją i uruchomiłem używając java graphics.Main(z wiersza poleceń), działało.

Naprawdę późna AKTUALIZACJA # 2

Nie korzystałem z Eclipse (tylko Notepad ++ i JDK), a powyższa aktualizacja rozwiązała mój problem. Wydaje się jednak, że wiele z tych odpowiedzi dotyczy Eclipse i IntelliJ, ale mają one podobne koncepcje.

Jonathan Lam
źródło
1
Patrząc na swoją główną klasę, nie ma jej w pakiecie (miałbyś package graphics;na górze). Czy graphicsgłowa struktury twojej paczki? Czy Square ma package graphics.shapesna górze?
lreeder
1
Jesteś aukcji gdzie są pliki .java, ale od tego, co dostajesz to Runtime problem, czego faktycznie zainteresowany jest, gdy pliki .class są i czy są one na ścieżce klas, czy też nie. Jak sobie radzisz z klasą główną?
Thor84no
Wystarczy nacisnąć Shift + Ctrl + O w zaćmieniu, aby zorganizować import
happybuddha
Upewnij się, że poprawnie wpisałeś nazwę klasy. Wystąpił ten błąd, ponieważ nazwa klasy nie zaczęła się od
Jeremy Borg
Zdarza się to czasami w IntelliJ IDEA po dużym refaktoryzacji. Kliknij prawym przyciskiem myszy na projekcie i wybierz -> Compile moduł , a następnie ponownie uruchomić projekt i powinno działać ponownie.
Zar

Odpowiedzi:

223

Po skompilowaniu kodu powstają .classpliki dla każdej klasy w programie. Te pliki binarne są kodem bajtowym, który Java interpretuje w celu wykonania programu. NoClassDefFoundErrorWskazuje, że classloader (w tym przypadku java.net.URLClassLoader), który jest odpowiedzialny za ładowanie klas dynamicznie, nie może odnaleźć .classpliku dla klasy, który próbujesz użyć.

Twój kod nie skompilowałby się, gdyby wymagane klasy nie były obecne (chyba że klasy są ładowane z odbiciem), więc zwykle ten wyjątek oznacza, że ​​ścieżka klasy nie zawiera wymaganych klas. Pamiętaj, że moduł ładujący klasy (konkretnie java.net.URLClassLoader) będzie szukał klas w pakiecie abc w folderze a / b / c / w każdym wpisie ścieżki klasy. NoClassDefFoundErrormoże również wskazywać, że brakuje przejściowej zależności pliku .jar, który został skompilowany i próbujesz użyć.

Na przykład, jeśli miałeś klasę com.example.Foo, po skompilowaniu miałbyś plik klasy Foo.class. Powiedz na przykład, że twój katalog roboczy to .../project/. Ten plik klasy musi zostać umieszczony .../project/com/example, a ścieżka klasy będzie ustawiona na .../project/.

Uwaga dodatkowa: Polecam skorzystać z niesamowitego narzędzia, które istnieje dla języków Java i JVM. Nowoczesne IDE, takie jak Eclipse i IDEA, oraz narzędzia do zarządzania kompilacją, takie jak Maven lub Gradle, pomogą Ci nie martwić się o ścieżki klas (tyle) i skupić się na kodzie! To powiedziawszy, ten link wyjaśnia, jak ustawić ścieżkę klasy podczas wykonywania w wierszu polecenia.

Samuel
źródło
Czytam to z powodu błędu, który napotkałem podczas próby uruchomienia testu jednostkowego na Androidzie. Okazuje się, że NoClassDefFoundError, w moim przypadku, wystąpił w wyniku braku zależności w teście. Muszę pomyśleć o wstrzyknięciu zależności, aby zapobiec takim błędom. Dziękuję za wyszukaną odpowiedź.
typowy Danny
130

Chciałbym poprawić perspektywę innych NoClassDefFoundError.

NoClassDefFoundError może wystąpić z wielu powodów, takich jak

  1. ClassNotFoundException - nie znaleziono klasy dla tej klasy, do której istnieje odwołanie, niezależnie od tego, czy jest ona dostępna w czasie kompilacji, czy nie (tj. Klasa podstawowa / potomna).
  2. Plik klasy znajduje się, ale wystąpił wyjątek podczas inicjowania zmiennych statycznych
  3. Plik klasy znajduje się, zgłoszono wyjątek podczas inicjowania bloków statycznych

W pierwotnym pytaniu był to pierwszy przypadek, który można poprawić, ustawiając CLASSPATH na plik jar klas, do których istnieją odwołania, lub na jego folder pakietu.

Co to znaczy „dostępny w czasie kompilacji”?

  • Odwołana klasa jest używana w kodzie.
    Np .: Dwie klasy, A i B (rozszerza A). Jeśli odwołanie do B jest bezpośrednio przywoływane w kodzie, jest ono dostępne w czasie kompilacji, tj. A a = nowa B ();

Co to znaczy „niedostępny w czasie kompilacji”?

  • Klasa czasu kompilacji i klasa środowiska wykonawczego są różne, tzn. Na przykład klasa podstawowa jest ładowana przy użyciu nazwy klasy klasy potomnej, na przykład Class.forName („nazwa klasy”)
    Np .: Dwie klasy, A i B (rozszerza A). Kod ma
    A a = Class.forName („B”). NewInstance ();
p1nkrock
źródło
W moim przypadku skompilowałem klasę, która przeniosła ją do katalogu o nazwie app. Musiałem dodać linię package app;i ponownie skompilować, aby móc przenieść ją do aplikacji podkatalogu.
taco
1
Oprócz wyżej wymienionych 3, ClassLoaders może również powodować taki błąd, który jest w zasadzie ClassNotFoundException, w tym scenariuszu klasa może występować w ścieżce klas, ale próbuje załadować z innego ClassLoadera
Fahad
2 i 3 są specyficzne dla programu ładującego klasy. Według javadoc wyjątek jest przewidziany tylko z powodu 1.
Samuel
1
Testowałem przypadek 2 i przypadek 3, to nie jest NoClassDefFoundError, to ExceptionInInitializerError Przypadek 2.Class zlokalizowany, ale wyjątek zgłoszony podczas inicjowania zmiennych statycznych Przypadek 3. Lokalizowany plik klasy, zgłoszony wyjątek podczas inicjalizacji bloków statycznych
Michael
1
@Michael, ten link mówi, że twój stacktrace również pokaże NoClassDefFoundErrorw tym przypadku: archive.is/YPbYI#selection-2107.0-2115.13
Pacerier
15

NoClassDefFoundErroroznacza, że ​​klasa jest obecna w ścieżce klasy w Compile time, ale nie istnieje w ścieżce klasy w Runtime.

Jeśli używasz Eclipse, upewnij się shapes, linepointsże spaceobjectsw .classpathpliku znajdują się wpisy i .

Konstantin Yovkov
źródło
1
Jak sobie z tym poradzić w środowisku wykonawczym za pomocą try / catch ?
Maveň ツ
5
Ta odpowiedź nie jest poprawna w sposobie pisania. Prawidłowe byłoby: „JEDNA możliwa przyczyna tego błędu to ....” Ale mogą istnieć inne powody, dla których ten błąd występuje, na przykład podczas ładowania pliku JAR w czasie wykonywania za pomocą programu ładującego klasy.
Elmue
13

jeśli podczas kompilacji i uruchamiania wystąpił jeden z tych błędów:

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

-------------------------- ROZWIĄZANIE -----------------------

problem dotyczy głównie organizacji pakietów. Powinieneś uporządkować swoje zajęcia w folderach odpowiednio do klasyfikacji pakietów w kodzie źródłowym.

On Compiling process use this command:

javac -d . [FileName.java]

To Run the class please use this command:

java [Package].[ClassName]
Sami
źródło
„-D”. w komendzie javac załatwia sprawę, tworząc strukturę folderów pakietów zamiast umieszczać wszystkie pliki .class w katalogu głównym, dzięki!
Jorge Sampayo,
9
java.lang.NoClassDefFoundError

wskazuje, że coś znaleziono podczas kompilacji, ale nie w czasie wykonywania . może po prostu musisz dodać to do ścieżki klas.

sschrass
źródło
15
Jak to zrobić?
Narendra Singh,
zależy od kontekstu, o który prosisz.
sschrass,
6

Brak definicji klasy Wyjątek występuje, gdy klasy docelowej nie znaleziono w ścieżce klasy. W klasie czasu kompilacji: klasa została wygenerowana z kompilatora Java, ale jakoś w czasie wykonywania nie znaleziono klasy zależnej.

Przejdźmy przez jeden prosty przykład:

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";
 }
}

Teraz Załóżmy, że powyższe dwa kody źródłowe Java są umieszczone w folderze, powiedzmy „NoClassDefinationFoundExceptionDemo”

Teraz otwórz powłokę (przy założeniu, że Java jest już poprawnie konfigurowana)

  1. Przejdź do folderu „NoClassDefinationFoundExceptionDemo”
  2. Skompiluj pliki źródłowe Java javac ClassB javac ClassA
  3. Oba pliki zostały pomyślnie skompilowane i wygenerowały pliki klas w tym samym folderze co ClassA.class i ClassB.class
  4. Teraz Ponieważ nadpisujemy ClassPath do bieżącego katalogu roboczego, dlatego wykonujemy następującą komendę java -cp. Klasa A i działało pomyślnie, a na ekranie zobaczysz wynik
  5. Powiedzmy teraz, że usunąłeś plik ClassB.class z Present Directory. a teraz ponownie wykonujesz polecenie. java -cp. ClassA Teraz przywita Cię wyjątkiem NoClassDefFoundException. ponieważ klasa B, która jest zależnością dla klasy A, nie znajduje się w ścieżce klasy (tj. w bieżącym katalogu roboczym).
Bharatj
źródło
5

NoClassDefFoundError w Javie:

Definicja:

NoClassDefFoundError pojawi się, jeśli klasa była obecna w czasie kompilacji, ale nie była dostępna w ścieżce klas Java w czasie wykonywania. Zwykle w dzienniku pojawi się następujący wiersz, gdy pojawi się NoClassDefFoundError: Wyjątek w wątku „main” java.lang.NoClassDefFoundError

Możliwe przyczyny:

  1. Klasa nie jest dostępna w Java Classpath.

  2. Być może uruchomiłeś program za pomocą komendy jar, a klasa nie została zdefiniowana w atrybucie ClassPath pliku manifestu.

  3. Każdy skrypt startowy zastępuje zmienną środowiskową Classpath.

  4. Ponieważ NoClassDefFoundError jest podklasą java.lang.LinkageError, może również przyjść, jeśli jedna z jej zależności, takich jak natywna biblioteka, może nie być dostępna.

  5. Sprawdź, czy w pliku dziennika nie ma pliku java.lang.ExceptionInInitializerError NoClassDefFoundError z powodu niepowodzenia inicjalizacji statycznej jest dość powszechny.

  6. Jeśli pracujesz w środowisku J2EE, widoczność klasy wśród wielu Classloadera może również powodować błąd java.lang.NoClassDefFoundError, zobacz sekcję przykładów i scenariuszy, aby uzyskać szczegółowe omówienie.

Możliwe rozdzielczości:

  1. Sprawdź, czy wszystkie wymagane klasy Java są zawarte w ścieżce klasy aplikacji. Najczęstszym błędem nie jest uwzględnienie wszystkich niezbędnych klas przed rozpoczęciem wykonywania aplikacji Java zależnej od niektórych bibliotek zewnętrznych.

  2. Ścieżka klasy aplikacji jest poprawna, ale zmienna środowiskowa Classpath jest zastępowana przed wykonaniem aplikacji.

  3. Sprawdź, czy wyżej wspomniany wyjątek ExceptionInInitializerError nie pojawia się w stosie aplikacji.

Zasoby:

3 sposoby rozwiązania java.lang.NoClassDefFoundError w Javie J2EE

java.lang.NoClassDefFoundError - Jak rozwiązać problem Nie znaleziono błędu klasy Def

Affy
źródło
3

Jeśli twój projekt znajduje się w pakiecie podobnym do tej, com.blahcodea twoja klasa jest wywoływana Main, skompilowane pliki mogą być wyprowadzane w takiej strukturze katalogów jak ./out/com/blahcode/Main.class. Jest to szczególnie prawdziwe w przypadku IntelliJ IDEA.

Podczas próby uruchomienia z powłoki lub cmd, musisz przejść cddo tego, co zawiera comjako podkatalog.

cd out
java -classpath . com.blahcode.Main
Hipershadsy
źródło
1

Po wielu miesiącach pracy nad projektem NetBeans nagle otrzymałem komunikat NoClassDefFoundError wkrótce po otrzymaniu alertu „Niska pamięć”. Wykonanie czystej przebudowy nie pomogło, ale całkowite zamknięcie Netbeans i ponowne otwarcie projektu nie było raportów o błędach.

Ed S.
źródło
1

Ta odpowiedź jest specyficzna dla błędu java.lang.NoClassDefFoundError występującego w usłudze :

Mój zespół ostatnio widział ten błąd po aktualizacji rpm, która dostarczyła usługę. Rpm i zawarte w nim oprogramowanie zostało zbudowane z Maven, więc wydawało się, że mamy zależność czasu kompilacji, która po prostu nie została uwzględniona w rpm.

Jednak podczas badania klasa, która nie została znaleziona, znajdowała się w tym samym module, co kilka klas w śladzie stosu. Co więcej, nie był to moduł, który został niedawno dodany do kompilacji. Fakty te wskazują, że może to nie być problem zależności Maven.

Ostateczne rozwiązanie: Uruchom ponownie usługę!

Wygląda na to, że aktualizacja rpm unieważniła uchwyt pliku usługi w pliku jar. Usługa następnie zobaczyła klasę, która nie została załadowana do pamięci, szukała jej na liście uchwytów plików jar i nie udało się jej znaleźć, ponieważ uchwyt pliku, z którego mogła załadować klasę, został unieważniony. Ponowne uruchomienie usługi zmusiło ją do ponownego załadowania wszystkich uchwytów plików, co pozwoliło następnie załadować klasę, której nie znaleziono w pamięci zaraz po aktualizacji rpm.

Mam nadzieję, że ten konkretny przypadek pomoże komuś.

John Chesshir
źródło
1

Dzisiaj miałem do czynienia z tym problemem. Mam projekt na Androida i po jego włączeniu multidexprojekt już się nie uruchamia.

Powodem było to, że zapomniałem wywołać określoną metodę multidex, która powinna zostać dodana do Application classi wywołana przed wszystkim innym.

 MultiDex.install(this);

Postępuj zgodnie z tym samouczkiem, aby poprawnie włączyć multideks. https://developer.android.com/studio/build/multidex.html

Powinieneś dodać te linie do swojej klasy aplikacji

 @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
CROSP
źródło
1

W moim projekcie rozwiązaniem problemu było to, że przeglądarka Chrome i chromedriver nie były kompatybilne. Miałem bardzo starą wersję sterownika, która nie mogła nawet otworzyć przeglądarki. Właśnie pobrałem najnowszą wersję obu i problem został rozwiązany. Jak odkryłem problem? Ponieważ prowadziłem projekt przy użyciu natywnego sterownika firefox Selenium ze starą wersją FF wprowadzonego z moją aplikacją, zdałem sobie sprawę, że problemem była niezgodność między przeglądarką a sterownikiem.

Mam nadzieję, że może to pomóc każdemu z podobnym problemem jak mój, który wygenerował ten sam komunikat o błędzie.

Kyon Perez
źródło
0

Moje dwa centy w tym łańcuchu:

Upewnij się, że ścieżka klasy zawiera pełne ścieżki ( /home/user/lib/some_lib.jarzamiast ~/lib/some_lib.jar), w przeciwnym razie nadal możesz napotkać NoClassDefFoundErrorbłąd.

Khkarens
źródło
Jest to częściowo prawdą, ale jest bardziej skomplikowane. 1) Użytkownik może używać ścieżek względnych w ścieżce klasy, ale muszą one być rozpoznawana przez JVM ... w stosunku do bieżącego katalogu na JVM. To czyni je kruchymi . 2) Podczas ustawiania zmiennej środowiskowej classpath można używać ~innych znaków meta powłoki, ale tylko pod warunkiem, że mechanizm używany do ustawiania zmiennej rozszerza je na rzeczywiste nazwy ścieżek. Jeśli używasz bash, możesz uzyskać „mieszane” wyniki. Na przykład spójrz na to, co dostajesz, gdy piszesz echo ~:~w wierszu polecenia. Pierwszy ~jest rozszerzony, ale drugi nie.
Stephen C
0

Dostaję NoClassFoundError, gdy klasy ładowane przez moduł ładujący środowisko wykonawcze nie mogą uzyskać dostępu do klas już załadowanych przez program ładujący root Java. Ponieważ różne moduły ładujące znajdują się w różnych domenach bezpieczeństwa (zgodnie z Javą), Jvm nie zezwoli na rozpoznanie klas już załadowanych przez program ładujący root w przestrzeni adresowej modułu ładującego środowisko wykonawcze.

Uruchom swój program z „java -javaagent: tracer.jar [YOUR java ARGS]”

Generuje dane wyjściowe pokazujące załadowaną klasę i środowisko env loadera, które załadowało klasę. Bardzo pomocne jest śledzenie, dlaczego nie można rozwiązać klasy.

// 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;
            }
        });
    }
}
codeDr
źródło
0

Zdarzyło mi się to w Android Studio.

Rozwiązanie, które zadziałało: po prostu uruchom ponownie studio.

zniknąć
źródło
0

Miałem ten sam problem z tworzeniem Androida za pomocą Android Studio. Dostarczone rozwiązania są ogólne i nie pomogły mi (przynajmniej dla mnie). Po wielu godzinach badań znalazłem następujące rozwiązanie i mogę pomóc programistom Androida, którzy robią programowanie za pomocą Android Studio. zmodyfikuj ustawienie zgodnie z poniższym opisem Preferencje -> Kompilacja, wykonanie, wdrożenie -> Natychmiastowe uruchomienie -> odznacz pierwszą opcję.

Po tej zmianie jestem gotowy do działania. Mam nadzieję, że to pomoże moim deweloperom.

maska
źródło
0

Jednym źródłem błędu dla tego wyjątku może być niespójna definicja Proguard, np. Brak

-libraryJars „ścieżka.to.a.missing.jar.library”.

To wyjaśnia, dlaczego kompilacja i uruchamianie działa dobrze, biorąc pod uwagę, że słoik jest tam, podczas gdy czyszczenie i kompilacja nie działają. Pamiętaj, aby zdefiniować nowo dodane biblioteki jar w konfiguracji proguard!

Zauważ, że komunikaty o błędach z Proguard naprawdę nie są standardowe, ponieważ łatwo je pomylić z podobnymi komunikatami mrówek przybywającymi, gdy słoika w ogóle nie ma. Tylko na samym dole będzie niewielka nuta proguardu w tarapatach. Dlatego logiczne jest rozpoczęcie wyszukiwania tradycyjnych błędów ścieżki klas itp., Ale na próżno.

Oczywiście wyjątkiem NoClassDefFound będą wyniki podczas uruchamiania, np. Zbudowany wynikowy słoik wykonywalny zbudowany i oparty na braku spójności proguard. Niektórzy nazywają to postępem „Piekło”

carl
źródło
0

używam plugin do Eclipse FileSync więc mogę żyć debug na Tomcat i dostałam NoClassFoundError, bo dodał wpis synchronizacji dla binkatalogu w obszarze roboczym Eclipse => classesw metadatadla Tomcat, ale nie dodała również synchronizację folderów do extlibkatalogu w Eclipse=>

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

Stuart Cardall
źródło
0

Tworzę aplikację opartą na Eclipse znaną również jako RCP (Rich Client Platform) . I napotkałem ten problem po refaktoryzacji (przeniesieniu jednej klasy z wtyczki do nowej).

Czyszczenie projektu i aktualizacja Maven nie pomogły.

Problem został spowodowany przez aktywator pakietów, który nie był aktualizowany automatycznie. Ręczna aktualizacja aktywatora pakietów w MANIFEST.MF w nowej wtyczce naprawiła mój problem.

Aleksandr Chomenko
źródło
0

jeśli ostatnio dodałeś obsługę multideksów w Android Studio w ten sposób:

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

więc Twoje rozwiązanie jest po prostu rozszerzane z MultiDexApplication zamiast Application

public class MyApp extends MultiDexApplication {
do01
źródło
0

Jeśli używasz więcej niż jednego modułu, powinieneś go mieć

dexOptions {
    preDexLibraries = false
}

w pliku kompilacji.

Matin Petrulak
źródło
0

Sprawdź, czy masz statyczny moduł obsługi w swojej klasie. Jeśli tak, należy zachować ostrożność, ponieważ program obsługi statycznej może być inicjowany tylko w wątku, który ma looper, awaria może zostać wywołana w następujący sposób:

1. po pierwsze, stwórz klasę w prostym wątku i złap katastrofę.

2. następnie wywołaj metodę Field klasy w głównym wątku, otrzymasz NoClassDefFoundError.

oto kod testowy:

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

w metodzie Main działania onCrete dodaj część kodu testowego:

@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
}

istnieje prosty sposób, aby to naprawić za pomocą handlerThread do inicjowania handlera:

private static Handler mHandler;
private static HandlerThread handlerThread = new HandlerThread("newthread");
static {
    handlerThread.start();
    mHandler = new Handler(handlerThread.getLooper(), mHandlerCB);
}
Michael
źródło
0

Nie używaj klas testowych poza modułem

Nie mam rozwiązania, tylko inny smak przypadku „obecny przy kompilacji, nieobecny w czasie wykonywania”.

Próbowałem użyć bardzo wygodnej metody z klasy testowej JUnit z innej klasy testowej, która znajduje się w innym module. To nie-nie, ponieważ kod testowy nie jest częścią spakowanego słoika, ale nie zdawałem sobie z tego sprawy, ponieważ wydaje się widoczny dla klasy użytkownika z poziomu Eclipse.

Moim rozwiązaniem było umieszczenie metody w istniejącej klasie narzędzi, która jest częścią kodu produkcyjnego.

manuelvigarcia
źródło
0

W moim środowisku ten problem występuje w teście jednostkowym. Po dodaniu jednej zależności biblioteki do * .pom jest to naprawione.

na przykład:

Komunikat o błędzie:

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

pom:

<dependency>
    <groupId>com.abc.def</groupId>
    <artifactId>foo</artifactId>
    <scope>test</scope>
</dependency>
Mystic Lin
źródło
0

Wystąpił ten błąd po zmianie oddziału Git. W konkretnym przypadku Eclipse w katalogu .settings brakowało linii dla pliku org.eclipse.wst.common.component. Jak widać poniżej

Pomocne byłoby przywrócenie zależności projektu za pomocą Maven Install.

wprowadź opis zdjęcia tutaj

Leonardo
źródło
0

jeśli używasz gradlew, przejdź do ./gradle/wrapper/gradle-wrapper.propertiesi przejdź distributionUrldo poprawnej wersji gradle.

Jeśli używasz JDK14, spróbuj

distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip
ehacinom
źródło
-1

To się często zdarza w przypadku moich urządzeń genymotion. Upewnij się, że masz wystarczająco dużo pamięci na dysku, na którym zainstalowano Genymotion.

totteire
źródło
Czy masz na to jakieś odniesienia?
Wai Ha Lee
Nie, po prostu regularnie brakuje mi miejsca na dysku i dopóki nie zwolnię dużej ilości + usuń / ponownie zainstaluj urządzenie wirtualne Genymotion, nadal pojawia się ten błąd.
totteire 13.01.16