Dlaczego otrzymuję NoClassDefFoundError w Javie?

530

Otrzymuję komunikat o NoClassDefFoundErroruruchomieniu aplikacji Java. Co zazwyczaj jest tego przyczyną?

John Meagher
źródło
1
Wierzę, że może się tak zdarzyć, jeśli nie uruchomisz programu Java z poprawną składnią. Na przykład musisz wywołać klasę z folderu głównego kosza z pełną nazwą pakietu (np. My.package.myClass). Byłbym bardziej konkretny, gdybym mógł, ale nie jestem facetem z javy. Pamiętam tylko, że popsułem to kilka razy.
Frank Hadder
17
@BoltClock Potrzebujemy pytania kanonicznego, aby wskazać liczne duplikaty. Dlaczego to nie może być to?
Raedwald
21
Czy zastanawiałeś się nad zmianą zaakceptowanej odpowiedzi, aby ta, którą społeczność uznała za bardziej wartościową, znajdowała się na górze?
Martin Smith

Odpowiedzi:

264

Jest to spowodowane, gdy istnieje plik klasy, od którego zależy Twój kod, i jest on obecny w czasie kompilacji, ale nie można go znaleźć w czasie wykonywania. Sprawdź różnice w czasie kompilacji i ścieżkach klas środowiska wykonawczego.

Kpina
źródło
1
Ten błąd wystąpił podczas umieszczania pliku źródłowego w niewłaściwej przestrzeni nazw / pakiecie. Pomyślałem, że mogę to po prostu umieścić w dowolnym miejscu, a kompilator był szczęśliwy. Okazuje się, że powinienem być bardziej pracowity, aby środowisko wykonawcze również było szczęśliwe.
CenterOrbit
1
Miałem ten błąd jeden raz, gdy na serwerze zabrakło pamięci podczas przesyłania pliku. Za każdym razem, gdy próbowałem przesłać, pojawiał się inny błąd. W końcu powiedziało mi, że nie mam wystarczająco dużo miejsca na stosy.
James M. Lay
81
Ta odpowiedź niekoniecznie jest prawdziwa i będzie wprowadzać w błąd wielu ludzi! Zobacz lepszą odpowiedź od Jareda poniżej.
Dave L.
4
@DaveL. Dzięki! Odpowiedź Jareda z ponad 400 głosami jest o wiele niższa! Jedna odpowiedź z -4 głosami w górę (w dół?) Jest znacznie powyżej. W logice porządkowej odpowiedzi SO jest coś podejrzanego.
Saurabh Patil
1
Jest to dla kogoś dalekosiężne, ale napotkałem ten błąd, ponieważ klasa, o której mowa, zawierała SimpleDateFormat, który został zainicjowany niepoprawnym znakiem (miałem T na środku zamiast „T”).
Ryan D
817

Chociaż możliwe jest, że jest to spowodowane niedopasowaniem ścieżki klasowej między czasem kompilacji a czasem wykonywania, niekoniecznie jest to prawda.

W tym przypadku ważne jest zachowanie dwóch lub trzech różnych wyjątków:

  1. java.lang.ClassNotFoundException Ten wyjątek wskazuje, że klasa nie została znaleziona w ścieżce klasy. Oznacza to, że próbowaliśmy załadować definicję klasy, a klasa nie istniała w ścieżce klasy.

  2. java.lang.NoClassDefFoundError Ten wyjątek wskazuje, że JVM szukał definicji swojej klasy w wewnętrznej strukturze danych definicji klasy i jej nie znalazł. Jest to inne niż stwierdzenie, że nie można go załadować ze ścieżki klas. Zwykle oznacza to, że poprzednio próbowaliśmy załadować klasę ze ścieżki klas, ale z jakiegoś powodu nie udało się - teraz próbujemy ponownie użyć tej klasy (i dlatego musimy ją załadować, ponieważ poprzednio nie powiodła się), ale „ nawet nie będziemy próbować go załadować, ponieważ nie udało nam się go wcześniej załadować (i mamy uzasadnione podejrzenia, że ​​znowu się nie powiedziemy). Wcześniejszym niepowodzeniem może być ClassNotFoundException lub ExceptionInInitializerError (wskazujący błąd w bloku statycznej inicjalizacji) lub dowolną liczbę innych problemów. Chodzi o to, że NoClassDefFoundError niekoniecznie jest problemem ścieżki klasowej.

Jared
źródło
30
Dzięki, że podałeś przyczynę NoClassDefFoundError, bardzo mi to pomogło! W moim przypadku zgłoszono wcześniej wyjątek ExceptionInInitializerError, dzięki temu dowiedziałem się o błędach w blokach statycznych.
Thomas
@Jared, Kiedy dostanę Error: Could not find or load main class, zostanie zaklasyfikowany do jakiej kategorii błędu?
Vikram
@Pops: Zwiększono poziom szczegółowości języka, aby określić obiekty czasowników „try” :)
Jared,
1
@Vikram „nie można znaleźć lub załadować głównej klasy” nie jest wyjątkiem Java, jest spowodowany przez program uruchamiający (który sprawdza plik JAR i główny atrybut manifestu).
eckes
2
ClassNotFoundException jest także zgłaszany, gdy klasa ma inicjalizację statyczną, która zgłasza błąd lub wyjątek. Prawdopodobnie powinni byli wybrać inną nazwę dla tego wydarzenia.
coladict
124

Oto kod do zilustrowania java.lang.NoClassDefFoundError. Zobacz odpowiedź Jareda do szczegółowego wyjaśnienia.

NoClassDefFoundErrorDemo.java

public class NoClassDefFoundErrorDemo {
    public static void main(String[] args) {
        try {
            // The following line would throw ExceptionInInitializerError
            SimpleCalculator calculator1 = new SimpleCalculator();
        } catch (Throwable t) {
            System.out.println(t);
        }
        // The following line would cause NoClassDefFoundError
        SimpleCalculator calculator2 = new SimpleCalculator();
    }

}

SimpleCalculator.java

public class SimpleCalculator {
    static int undefined = 1 / 0;
}
Xli
źródło
3
A powodem jest to, że po pierwszej próbie jvm już wie, że nie zadziała i nie rzuci innego wyjątku za drugim razem?
ikamen
@ikamen Najwyraźniej zachowało gdzieś nieudaną inicjalizację klasy SimpleCalculatorpo podzieleniu przez zero? Czy ktoś ma odniesienie do oficjalnej dokumentacji tego zachowania?
ᴠɪɴᴄᴇɴᴛ
4
@PhilipRego Nie jestem pewien, co rozumiesz przez „czysty” NoClassDefFoundError. Przy pierwszym new SimpleCalculator()wywołaniu pojawia się wyjątek ExceptionInInitializerError spowodowany wyjątkiem ArithmeticException. Przy drugim wywołaniu new SimpleCalculator()otrzymasz NoClassDefFoundError tak czysty jak każdy inny. Chodzi o to, że możesz uzyskać NoClassDefFoundError z innego powodu niż SimpleCalculator.class, który nie znajduje się w ścieżce klas w czasie wykonywania.
harperska
36

NoClassDefFoundError W Javie

Definicja:

  1. Java Virtual Machine nie jest w stanie znaleźć konkretnej klasy w czasie wykonywania, która była dostępna w czasie kompilacji.

  2. Jeśli klasa była obecna w czasie kompilacji, ale nie była dostępna w ścieżce klas Java w czasie wykonywania.

wprowadź opis zdjęcia tutaj

Przykłady:

  1. Klasy nie ma w Classpath, nie ma pewnej szansy, aby ją poznać, ale wiele razy możesz po prostu wydrukować System.getproperty („java.classpath”) i wydrukuje ścieżkę klasy stamtąd, co najmniej możesz uzyskać pomysł na faktyczną ścieżkę klas środowiska wykonawczego.
  2. Prostym przykładem NoClassDefFoundError jest to, że klasa należy do brakującego pliku JAR lub JAR nie został dodany do ścieżki klasy lub czasami nazwa jar została zmieniona przez kogoś takiego jak w moim przypadku jeden z moich kolegów zmienił tibco.jar na tibco_v3.jar, a program jest błąd z java.lang.NoClassDefFoundError i zastanawiałem się, co jest nie tak.

  3. Po prostu spróbuj uruchomić z jawnie opcją -classpath ze ścieżką klasy, która Twoim zdaniem będzie działać, a jeśli działa, to jest to pewnie krótki znak, że ktoś przesłonił ścieżkę klasy Java.

  4. Problem z uprawnieniami do pliku JAR może również powodować NoClassDefFoundError w Javie.
  5. Literówka w konfiguracji XML może również powodować NoClassDefFoundError w Javie.
  6. gdy twoja skompilowana klasa zdefiniowana w pakiecie nie pojawia się w tym samym pakiecie podczas ładowania, jak w przypadku JApplet, wyrzuci NoClassDefFoundError w Javie.

Możliwe rozwiązania:

  1. Klasa nie jest dostępna w Java Classpath.
  2. Jeśli pracujesz w środowisku J2EE, widoczność klasy wśród wielu Classloaderów może również powodować błąd java.lang.NoClassDefFoundError, zobacz sekcję przykładów i scenariuszy, aby uzyskać szczegółowe omówienie.
  3. Sprawdź, czy w pliku dziennika nie ma java.lang.ExceptionInInitializerError NoClassDefFoundError z powodu niepowodzenia inicjalizacji statycznej jest dość powszechny.
  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. Każdy skrypt startowy zastępuje zmienną środowiskową Classpath.
  6. Być może uruchomiłeś program za pomocą komendy jar, a klasa nie została zdefiniowana w atrybucie ClassPath pliku manifestu.

Zasoby:

3 sposoby rozwiązania NoClassDefFoundError

java.lang.NoClassDefFoundError Wzorce problemów

Affy
źródło
1
Świetna odpowiedź. Myślę, że próbowałem wszystkiego, co sugerujesz, i nadal mam ten problem. Mogę wykluczyć niektóre z nich ze względu na słoik działający ze sprężyną, ale java.sql wydaje się nie lubić (w moim przypadku sterownik db SAP dla Hana).
JE Carter II
W rzeczywistości nazywa się System.getproperty („java.class.path”)
RIJIK,
33

Odkryłem, że czasami pojawia się błąd NoClassDefFound, gdy kod jest kompilowany z niekompatybilną wersją klasy znalezioną w czasie wykonywania. Konkretne wystąpienie, które pamiętam, dotyczy biblioteki osi apache. W mojej ścieżce klas środowiska wykonawczego były w rzeczywistości 2 wersje, które pobierały nieaktualną i niekompatybilną wersję, a nie poprawną, powodując błąd NoClassDefFound. To było w aplikacji wiersza poleceń, w której korzystałem z polecenia podobnego do tego.

set classpath=%classpath%;axis.jar

Byłem w stanie uzyskać odpowiednią wersję, używając:

set classpath=axis.jar;%classpath%;
shsteimer
źródło
4
Miałem ten sam problem. Okazuje się, że skompilowałem plik wojenny z Java7, ale moja instalacja Tomcat używała Java6. Musiałem zaktualizować moje zmienne środowiskowe
duvo
4
Jeśli tak się stanie, to powiem, że Java jest w chaosie. +2, jeśli to prawda. Nie mogę tego jeszcze zweryfikować. Jeśli uznany za prawdziwy, zrobi + 1 ponownie (w komentarzach)
supernowa
7

To najlepsze rozwiązanie jakie do tej pory znalazłem.

Załóżmy, że mamy pakiet o nazwie org.mypackagezawierający klasy:

  • HelloWorld (klasa główna)
  • SupportClass
  • UtilClass

a pliki definiujące ten pakiet są przechowywane fizycznie w katalogu D:\myprogram(w systemie Windows) lub/home/user/myprogram (w systemie Linux).

Struktura pliku będzie wyglądać następująco: wprowadź opis zdjęcia tutaj

Kiedy wzywamy Java, możemy określić nazwę aplikacji do uruchomienia: org.mypackage.HelloWorld. Musimy jednak powiedzieć Javie, gdzie szukać plików i katalogów definiujących nasz pakiet. Aby uruchomić program, musimy użyć następującego polecenia: wprowadź opis zdjęcia tutaj

Ram Patra
źródło
6

Korzystałem z Spring Framework z Maven i rozwiązałem ten błąd w moim projekcie.

W klasie wystąpił błąd czasu wykonywania. Czytałem właściwość jako liczbę całkowitą, ale kiedy odczytała wartość z pliku właściwości, jej wartość była podwójna.

Wiosna nie dała mi pełnego śladu stosu, w której linii wystąpił błąd środowiska wykonawczego. Po prostu powiedział NoClassDefFoundError. Ale kiedy wykonałem go jako natywną aplikację Java (biorąc go z MVC), dałemExceptionInInitializerError która była prawdziwa przyczyna i w jaki sposób wyśledziłem błąd.

Odpowiedź @ xli dała mi wgląd w to, co może być źle w moim kodzie.

Nikhil Sahu
źródło
1
To samo zdarzyło mi się podczas programowania serwletu ( NoClassDefFoundErrortak naprawdę było spowodowane przez ExceptionInInitalizerError, co było spowodowane przez DateTimeParseException). To trochę mylące, prawda? Wiem, że prawdopodobnie mieli ku temu powody, ale tak miło byłoby mieć chociaż małą podpowiedź, która NoClassDefFoundErrorbyła wynikiem innego wyjątku, bez potrzeby wnioskowania. ExceptionInInitializerErrorPonowne rzucenie byłoby znacznie wyraźniejsze. Czasami związek między nimi może nie być tak oczywisty.
Bartłomiej Zieliński
5

Dostaję NoClassFoundError, gdy klasy ładowane przez moduł ładujący środowiska wykonawczego 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 pozwoli 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
1
Link nie działa. Wypróbuj zarchiwizowaną wersję: web.archive.org/web/20131216000019/https://blogs.oracle.com/…
avgvstvs
5

Ciekawym przypadkiem, w którym możesz wiele zobaczyć, NoClassDefFoundErrorsjest:

  1. throwRuntimeExceptionw staticbloku klasyExample
  2. Przechwyć to (lub jeśli to nie ma znaczenia, jakby zostało rzucone w przypadku testowym )
  3. Spróbuj utworzyć instancję tej klasy Example

static class Example {
    static {
        thisThrowsRuntimeException();
    }
}

static class OuterClazz {

    OuterClazz() {
        try {
            new Example();
        } catch (Throwable ignored) { //simulating catching RuntimeException from static block
            // DO NOT DO THIS IN PRODUCTION CODE, THIS IS JUST AN EXAMPLE in StackOverflow
        }

        new Example(); //this throws NoClassDefFoundError
    }
}

NoClassDefErrorzostanie wyrzucony w towarzystwie z ExceptionInInitializerErrorbloku statycznego RuntimeException.


Jest to szczególnie ważny przypadek, gdy widzisz NoClassDefFoundErrorsw TESTACH JEDNOSTKI .

W pewien sposób „udostępniasz” staticwykonanie bloku między testami, ale początkowa ExceptionInInitializerErrorbędzie tylko w jednym przypadku testowym. Pierwszy, który korzysta z problematycznej Exampleklasy. Inne przypadki testowe korzystające z tej Exampleklasy po prostu rzucą NoClassDefFoundErrors.

Bartek Lipiński
źródło
4
To jest cholernie przydatna rada w prawdziwym życiu. Właśnie miałem taką samą sytuację z inicjalizatorami atrybutów klas. Tylko raz masz szansę zobaczyć rzeczywisty problem w dzienniku. Po załadowaniu (lub próbie) klasy musisz zrestartować wszystko.
DailyFrankPeter,
4

Poniższa technika pomogła mi wiele razy:

System.out.println(TheNoDefFoundClass.class.getProtectionDomain().getCodeSource().getLocation());

gdzie TheNoDefFoundClass to klasa, która może zostać „utracona” z powodu preferencji dla starszej wersji tej samej biblioteki używanej przez twój program. Zdarza się to najczęściej w przypadkach, gdy oprogramowanie klienckie jest wdrażane w dominującym kontenerze, uzbrojonym we własne moduły ładujące klasy i mnóstwo starożytnych wersji najpopularniejszych bibliotek.

Aram Paronikyan
źródło
3

W przypadku wygenerowania kodu (EMF itp.) Może być zbyt wiele statycznych inicjatorów, które zajmują całe miejsce na stosie.

Zobacz pytanie Przepełnienie stosu Jak zwiększyć rozmiar stosu Java? .

Aykut Kllic
źródło
„EMF” ? Masz na myśli MEF ?
Peter Mortensen
2
Nie. EMf jako środowisko modelowania Eclipse. W branży motoryzacyjnej możemy napotkać ten błąd podczas uruchamiania generowanego kodu.
Aykut Kllic
1

Rozwiązałem problem, wyłączając preDexLibraries dla wszystkich modułów:

dexOptions {
        preDexLibraries false
        ...
Michał
źródło
1

NoClassDefFoundErrormoże również wystąpić, gdy inicjator statyczny próbuje załadować pakiet zasobów, który nie jest dostępny w środowisku wykonawczym, na przykład plik właściwości, który klasa, której dotyczy problem, próbuje załadować z META-INFkatalogu, ale go nie ma. Jeśli nie złapiesz NoClassDefFoundError, czasami nie będziesz w stanie zobaczyć pełnego śladu stosu; Aby temu zaradzić, możesz tymczasowo użyć catchklauzuli, aby Throwable:

try {
    // Statement(s) that cause the affected class to be loaded
} catch (Throwable t) {
    Logger.getLogger("<logger-name>").info("Loading my class went wrong", t);
}
ᴠɪɴᴄᴇɴᴛ
źródło
To jest niepoprawne. Brak zasobu nie spowoduje wystąpienia tego błędu. Otrzymasz go tylko wtedy, gdy brakuje klasy .
Stephen C
@StephenC Może powinienem bardziej podkreślić tę część, ale napisałem for example a properties file that the affected class tries to load from the META-INF directory. Tak się właściwie stało i udało mi się rozwiązać NoClassDefFoundError, dodając brakujący plik właściwości. Dodałem tę odpowiedź właśnie dlatego, że nie można oczekiwać tego błędu w wyżej wymienionych okolicznościach.
ᴠɪɴᴄᴇɴᴛ
1
Pominąłeś wtedy coś bardzo ważnego w wyjaśnieniu, ponieważ jedynym sposobem, w jaki brakujący plik zasobów może wywołać ten wyjątek, jest próba załadowania pliku zasobów podczas staticinicjalizacji ... co spowodowało niesprawdzony wyjątek i spowodowało inicjację nie zdać. Zrobiłby to każdy niesprawdzony wyjątek propagowany z inicjalizacji statycznej.
Stephen C
Jeśli się mylę (tj. Nie wynika to z nieudanej staticinicjalizacji), chciałbym zobaczyć rzeczywisty przykład (np. MCVE), który demonstruje zachowanie.
Stephen C
1
@StephenC Masz absolutną rację :( Sprawdziłem przypadek, w którym napotkałem ten problem i rzeczywiście dotyczył on statycznego inicjalizatora próbującego załadować pakiet zasobów. Poprawię / poprawię opis przyczyny. Dziękujemy za wskazanie tego obecnie
ᴠɪɴᴄᴇɴᴛ
1

Wystąpił ten błąd, gdy dodałem zależność Maven od innego modułu do mojego projektu, problem został w końcu rozwiązany przez dodanie -Xss2mdo opcji JVM mojego programu (domyślnie jest to jeden megabajt od JDK5.0). Uważa się, że program nie ma wystarczającego stosu, aby załadować klasę.

Alan Ackart
źródło
0

Jeśli ktoś tu przychodzi z powodu java.lang.NoClassDefFoundError: org/apache/log4j/Loggerbłędu, w moim przypadku został on utworzony, ponieważ użyłem log4j 2 (ale nie dodałem wszystkich plików, które są z nim związane), a niektóre biblioteki zależności wykorzystały log4j 1. Rozwiązaniem było dodanie Log4j Most 1.x: słoik log4j-1.2-api-<version>.jardostarczany z log4j 2. Więcej informacji na temat migracji log4j 2 .

ST7
źródło
0

Dwie różne kopie kasy tego samego projektu

W moim przypadku problemem była niezdolność Eclipse do rozróżnienia dwóch różnych kopii tego samego projektu. Mam jeden zablokowany na pniu (kontrola wersji SVN), a drugi pracuje w jednej gałęzi na raz. Wypróbowałem jedną zmianę w kopii roboczej jako przypadek testowy JUnit, która obejmowała wyodrębnienie prywatnej klasy wewnętrznej, aby sama była klasą publiczną i podczas gdy działała, otwieram drugą kopię projektu, aby rozejrzeć się po innej część kodu, która wymagała zmian. W pewnym momencieNoClassDefFoundError wyskoczyli narzekając, że nie ma prywatnej klasy wewnętrznej; dwukrotne kliknięcie śledzenia stosu doprowadziło mnie do pliku źródłowego w niewłaściwej kopii projektu.

Zamknięcie kopii projektu i ponowne uruchomienie skrzynki testowej pozbyło się problemu.

manuelvigarcia
źródło
0

Ten błąd może być spowodowany niesprawdzonymi wymaganiami dotyczącymi wersji Java .

W moim przypadku udało mi się rozwiązać ten błąd, budując głośny projekt open source, przechodząc z Java 9 na Java 8 za pomocą SDKMAN! .

sdk list java
sdk install java 8u152-zulu
sdk use java 8u152-zulu

Następnie wykonaj czystą instalację, jak opisano poniżej.


Kiedy używasz Maven jako narzędzia do kompilacji, czasem pomocne jest - i zwykle satysfakcjonujące - wykonanie czystej kompilacji „instaluj” z wyłączonym testowaniem .

mvn clean install -DskipTests

Teraz, gdy wszystko zostało zbudowane i zainstalowane, możesz przejść testy i przeprowadzić je.

mvn test
nobar
źródło
0

Wystąpiły błędy NoClassDefFound, gdy nie wyeksportowałem klasy na karcie „Zamów i eksportuj” na ścieżce kompilacji Java mojego projektu. Pamiętaj, aby zaznaczyć znacznik wyboru na karcie „Zamów i eksportuj” wszystkich zależności dodanych do ścieżki kompilacji projektu. Zobacz ostrzeżenie Eclipse: XXXXXXXXXXX.jar nie zostanie wyeksportowany ani opublikowany. Może to spowodować wyjątki Runtime ClassNotFoundExceptions .

Steve Stilson
źródło
0

Może to być również spowodowane tym, że skopiujesz plik kodu z IDE z określoną nazwą pakietu i chcesz spróbować uruchomić go za pomocą terminala. Najpierw musisz usunąć nazwę pakietu z kodu. To mi się przydarza.

off99555
źródło
0

W moim przypadku występował ten błąd z powodu niedopasowania w wersjach JDK. Kiedy próbowałem uruchomić aplikację z Intelij, to nie działało, ale działało z wiersza poleceń. Wynika to z faktu, że Intelij próbował uruchomić go z zainstalowanym pakietem JDK Java 11, ale w wierszu komend uruchomiono go z pakietem JDK Java 8. Po zmianie tego ustawienia w Plik> Struktura projektu> Ustawienia projektu> Zestaw SDK projektu, zadziałało to dla mnie.

Ben Waters
źródło
0

Wszyscy mówią tutaj o niektórych kwestiach związanych z konfiguracją Java, problemami z JVM itp. W moim przypadku błąd nie był w ogóle związany z tymi tematami i miał bardzo trywialny i łatwy do rozwiązania powód: miałem niepoprawną adnotację w punkcie końcowym w moim kontrolerze ( Aplikacja Spring Boot).

bdskfsdk321dsad3
źródło
0

Miałem interesujący problem z NoClassDefFoundError w JavaEE współpracującym z serwerem Liberty. Korzystałem z adapterów zasobów IMS, a mój plik server.xml miał już adapter zasobów dla imsudbJXA.rar. Kiedy dodałem nowy adapter do imsudbXA.rar, zacząłem otrzymywać ten błąd na przykład dla obiektów DLIException, IMSConnectionSpec lub SQLInteractionSpec. Nie mogłem zrozumieć, dlaczego, ale rozwiązałem ten problem, tworząc nowy server.xml do mojej pracy, używając tylko imsudbXA.rar. Jestem pewien, że używanie wielu adapterów zasobów w pliku server.xml jest w porządku, po prostu nie miałem czasu, aby się tym zająć.

piksel
źródło
-1

Java nie mogła znaleźć klasy A w środowisku wykonawczym. Klasa A była w projekcie maven ArtClient z innego obszaru roboczego. Zaimportowałem więc ArtClient do mojego projektu Eclipse. Dwa moje projekty wykorzystywały ArtClient jako zależność. Zmieniłem odwołanie do biblioteki na odwołanie do projektu dla tych (Ścieżka kompilacji -> Konfiguruj ścieżkę kompilacji).

Problem zniknął.

Pekmezli Dürüm
źródło
-1

Miałem ten sam problem i miałem zapas na wiele godzin.

Znalazłem rozwiązanie. W moim przypadku zdefiniowano z tego powodu metodę statyczną. JVM nie może utworzyć kolejnego obiektu tej klasy.

Na przykład,

private static HttpHost proxy = new HttpHost(proxyHost, Integer.valueOf(proxyPort), "http");
sudar
źródło
-6

Otrzymałem ten komunikat po usunięciu dwóch plików z biblioteki SRC, a kiedy je przywróciłem, nadal widziałem ten komunikat o błędzie.

Moje rozwiązanie brzmiało: Uruchom ponownie Eclipse. Od tego czasu nie widziałem tego komunikatu ponownie :-)

Eliran
źródło
4
Wyjaśnia to najczęściej głosowana odpowiedź: kiedy po raz pierwszy skompilowałeś, pliki tam były, potem usunąłeś niektóre pliki, klasy zostały usunięte, więc w czasie wykonywania dostałeś ClassNotFound, a następnie przeszyłeś je z powrotem, ale Eclipse nie zauważ, że generowane klasy wciąż brakowały, ale po zrestartowaniu środowiska Eclipse obszar roboczy został odświeżony i klasy były ponownie dostępne, ale ogólnie rzecz biorąc, nie jest to rozwiązanie ani obejście, rozwiązanie polega na znalezieniu brakującej klasy / słoika w środowisku wykonawczym ścieżka klasy.
Jose Manuel Gomez Alvarez
-7

Upewnij się, że mecze w module:appi module:lib:

android {
    compileSdkVersion 23
    buildToolsVersion '22.0.1'
    packagingOptions {
    }

    defaultConfig {
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 11
        versionName "2.1"
    }
Alex
źródło
3
W jaki sposób Twoje rozwiązanie jest w jakikolwiek sposób powiązane z tym powszechnym problemem?
Taavi Ilves
Przykładowa konfiguracja nie jest zrównoważona (trzy {si dwa }). Czy możesz to naprawić?
Peter Mortensen