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.java
plik 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 Main
klasę do graphics
pakietu (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.
java
exception
packages
noclassdeffounderror
Jonathan Lam
źródło
źródło
package graphics;
na górze). Czygraphics
głowa struktury twojej paczki? Czy Square mapackage graphics.shapes
na górze?Odpowiedzi:
Po skompilowaniu kodu powstają
.class
pliki dla każdej klasy w programie. Te pliki binarne są kodem bajtowym, który Java interpretuje w celu wykonania programu.NoClassDefFoundError
Wskazuje, że classloader (w tym przypadkujava.net.URLClassLoader
), który jest odpowiedzialny za ładowanie klas dynamicznie, nie może odnaleźć.class
pliku 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.NoClassDefFoundError
moż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 klasyFoo.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.
źródło
Chciałbym poprawić perspektywę innych
NoClassDefFoundError
.NoClassDefFoundError
może wystąpić z wielu powodów, takich jakW 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”?
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”?
Np .: Dwie klasy, A i B (rozszerza A). Kod ma
A a = Class.forName („B”). NewInstance ();
źródło
package app;
i ponownie skompilować, aby móc przenieść ją do aplikacji podkatalogu.NoClassDefFoundError
w tym przypadku: archive.is/YPbYI#selection-2107.0-2115.13NoClassDefFoundError
oznacza, że klasa jest obecna w ścieżce klasy wCompile time
, ale nie istnieje w ścieżce klasy wRuntime
.Jeśli używasz Eclipse, upewnij się
shapes
,linepoints
żespaceobjects
w.classpath
pliku znajdują się wpisy i .źródło
jeśli podczas kompilacji i uruchamiania wystąpił jeden z tych błędów:
-------------------------- 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.
źródło
wskazuje, że coś znaleziono podczas kompilacji, ale nie w czasie wykonywania . może po prostu musisz dodać to do ścieżki klas.
źródło
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:
}
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)
źródło
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:
Klasa nie jest dostępna w Java Classpath.
Być może uruchomiłeś program za pomocą komendy jar, a klasa nie została zdefiniowana w atrybucie ClassPath pliku manifestu.
Każdy skrypt startowy zastępuje zmienną środowiskową Classpath.
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.
Sprawdź, czy w pliku dziennika nie ma pliku java.lang.ExceptionInInitializerError NoClassDefFoundError z powodu niepowodzenia inicjalizacji statycznej jest dość powszechny.
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:
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.
Ścieżka klasy aplikacji jest poprawna, ale zmienna środowiskowa Classpath jest zastępowana przed wykonaniem aplikacji.
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
źródło
Jeśli twój projekt znajduje się w pakiecie podobnym do tej,
com.blahcode
a twoja klasa jest wywoływanaMain
, 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ść
cd
do tego, co zawieracom
jako podkatalog.źródło
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.
źródło
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ś.
źródło
Dzisiaj miałem do czynienia z tym problemem. Mam projekt na Androida i po jego włączeniu
multidex
projekt już się nie uruchamia.Powodem było to, że zapomniałem wywołać określoną metodę multidex, która powinna zostać dodana do
Application class
i wywołana przed wszystkim innym.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
źródło
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.
źródło
Moje dwa centy w tym łańcuchu:
Upewnij się, że ścieżka klasy zawiera pełne ścieżki (
/home/user/lib/some_lib.jar
zamiast~/lib/some_lib.jar
), w przeciwnym razie nadal możesz napotkaćNoClassDefFoundError
błąd.źródło
~
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żywaszbash
, możesz uzyskać „mieszane” wyniki. Na przykład spójrz na to, co dostajesz, gdy piszeszecho ~:~
w wierszu polecenia. Pierwszy~
jest rozszerzony, ale drugi nie.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.
źródło
Zdarzyło mi się to w Android Studio.
Rozwiązanie, które zadziałało: po prostu uruchom ponownie studio.
źródło
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.
źródło
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”
źródło
używam plugin do Eclipse FileSync więc mogę żyć debug na Tomcat i dostałam
NoClassFoundError
, bo dodał wpis synchronizacji dlabin
katalogu w obszarze roboczym Eclipse=> classes
wmetadata
dla Tomcat, ale nie dodała również synchronizację folderów doextlib
katalogu w Eclipse=>
C:\Users\Stuart\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\myApp\WEB-INF\lib
źródło
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.
źródło
jeśli ostatnio dodałeś obsługę multideksów w Android Studio w ten sposób:
więc Twoje rozwiązanie jest po prostu rozszerzane z MultiDexApplication zamiast Application
źródło
Jeśli używasz więcej niż jednego modułu, powinieneś go mieć
w pliku kompilacji.
źródło
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:
w metodzie Main działania onCrete dodaj część kodu testowego:
istnieje prosty sposób, aby to naprawić za pomocą handlerThread do inicjowania handlera:
źródło
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.
źródło
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:
pom:
źródło
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.
źródło
jeśli używasz
gradlew
, przejdź do./gradle/wrapper/gradle-wrapper.properties
i przejdźdistributionUrl
do poprawnej wersji gradle.Jeśli używasz JDK14, spróbuj
źródło
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.
źródło