public class PropHolder {
public static Properties prop;
static {
//code for loading properties from file
}
}
// Referencing the class somewhere else:
Properties prop = PropHolder.prop;
class PropHolder
to moja klasa. Klasa znajduje się w tym samym pliku JAR klasy głównej. Tak więc nie powinno, ponieważ w ścieżce klas brakuje żadnego pliku JAR.
Kiedy przeglądam plik JAR według jar tf myjarfile
, widzę PropHolder.class
tam listę.
Btw: kod działa dobrze na moim komputerze lokalnym. Ale nie mogłem działać, gdy wdrożyłem go z jakimś skryptem na serwerze Linux. Więc myślę, że to nie jest problem z kodem. Ale z jakiegoś powodu. proces wdrażania jest bardzo trudny do śledzenia.
Jaki może być problem?
Odpowiedzi:
Moim najlepszym rozwiązaniem jest to, że jest tutaj problem:
Wygląda na to, że wystąpił nieprzechwycony wyjątek i został propagowany do właściwego ClassLoadera próbującego załadować klasę. Potrzebowalibyśmy jednak śledzenia stosu, aby to potwierdzić.
Albo to, albo wystąpiło podczas tworzenia
PropHolder.prop
zmiennej statycznej.źródło
static
problemu. Co należy zrobić, aby rozwiązać problem?static
bloku. Aby go debugować, umieśćtry/catch(Exception e)
wokół całego bloku i zarejestruj wyjątek. Będziesz musiał naprawić ten wyjątek. Zazwyczaj Wyjątkiem będą rejestrowane, ale może być trudno znaleźć, ponieważ jest to istota zalogowany podczas classloading które mogą wydarzyć się bardzo wcześnietry catch
bloku i powiedziałFailed to initialize ClassA
. Myślę, że to jest problemJVM
. Uruchomiłem ponownie system i wszystko działało dobrze. Jak rozwiązać ten problem w przyszłości bez ponownego uruchamiania systemu i rozwiązać problem za pomocą prostego rozwiązania.cause
jeśli jest dostępny. ANoClassDefFoundError
jest zawsze powiązany z innym błędem, będziesz musiał poszukać go w dziennikach lub spróbować zalogować go bardziej poprawnie (np. Wymusić logowanie do nowego pliku w systemie plików)Otrzymujesz,
java.lang.NoClassDefFoundError
co NIE oznacza, że brakuje twojej klasy (w takim przypadku otrzymaszjava.lang.ClassNotFoundException
). ClassLoader napotkał błąd podczas odczytywania definicji klasy podczas próby odczytania klasy.Umieść try / catch wewnątrz swojego statycznego inicjatora i spójrz na wyjątek. Jeśli czytasz tam jakieś pliki i różni się to od lokalnego środowiska, jest to bardzo prawdopodobne, że przyczyną problemu (może nie można znaleźć pliku, brak uprawnień itp.).
źródło
@Stateless
, więc po prostu dodałem odpowiednią zależność i mogłem przejść dalej. Dzięki za wskazówkę!NoClassDefFoundError nie daje zbyt wielu wskazówek, co poszło nie tak wewnątrz bloku statycznego. Dobrą praktyką jest zawsze mieć taki blok w statycznym {...} kodzie inicjującym:
źródło
Miałem ten sam wyjątek, tak rozwiązałem problem:
Warunki wstępne:
Klasa Junit (i test), która rozszerzyła kolejną klasę.
ApplicationContext zainicjowany przy użyciu spring, który inicjuje projekt.
Kontekst aplikacji został zainicjowany w metodzie @Before
Rozwiązanie:
Zainicjuj kontekst aplikacji z metody @BeforeClass, ponieważ klasa nadrzędna również wymagała niektórych klas, które zostały zainicjowane z kontekstu aplikacji.
Mam nadzieję, że to pomoże.
źródło
Jak wspomniano powyżej, może to być kilka przyczyn. W moim przypadku miałem statycznie zainicjowaną zmienną, która opierała się na brakującym wpisie w moim pliku właściwości. Dodano brakujący wpis do pliku właściwości i problem został rozwiązany.
źródło
Zaledwie kilka dni temu spotkałem się z tym samym pytaniem, co twoje. Cały kod działa dobrze na mojej lokalnej maszynie, ale okazuje się, że wystąpił błąd (noclassdeffound & initialize). Dlatego publikuję swoje rozwiązanie, ale nie wiem dlaczego, po prostu przedstawiam możliwość. Mam nadzieję, że ktoś znajomy to wyjaśni. @ John Vint Najpierw pokażę Ci mój problem. Mój kod ma zarówno zmienną statyczną, jak i blok statyczny. Kiedy pierwszy raz spotkałem się z tym problemem, wypróbowałem rozwiązanie Johna Vinta i próbowałem złapać wyjątek. Jednak nic nie złapałem. Więc pomyślałem, że to dlatego, że zmienna statyczna (ale teraz wiem, że to to samo) i nadal nic nie znalazłem. Więc próbuję znaleźć różnicę między maszyną z systemem Linux a moim komputerem. Potem odkryłem, że ten problem występuje tylko wtedy, gdy kilka wątków działa w jednym procesie (nawiasem mówiąc, maszyna linux ma podwójne rdzenie i podwójne procesy). Oznacza to, że jeśli istnieją dwa zadania (oba używają kodu, który ma statyczny blok lub zmienne) uruchamiane w tym samym procesie, to idzie źle, ale jeśli działają w różnych procesach, oba są w porządku. W maszynie Linux używam
aby uruchomić zadanie, a ponieważ moja zmienna statyczna ma na celu uruchomienie kontenera (lub może zainicjujesz nowy program ładujący klasy), więc pozostanie on do zatrzymania jvm, a jvm zatrzyma się tylko wtedy, gdy zatrzymają się wszystkie zadania w jednym procesie. Każde zadanie uruchamia nowy kontener (lub classloader) i wprowadza zamieszanie w jvm. W rezultacie występuje błąd. Jak więc to rozwiązać? Moim rozwiązaniem jest dodanie nowego polecenia do polecenia maven i umieszczenie każdego zadania w tym samym kontenerze.
Być może już rozwiązałeś ten problem, ale nadal masz nadzieję, że pomoże on innym, którzy napotykają ten sam problem.
źródło
java.lang.ExceptionInInitializerError: null
oznacza to, że nie mogę znaleźć klasy w classloader lub nie wiem, którą załadować (chyba). Czy spotkałeś to?Miałem ten sam wyjątek - ale tylko podczas pracy w trybie debugowania, tak rozwiązałem problem (po 3 całych dniach): w pliku build.gradle miałem: "multiDexEnabled true" ustawione w sekcji defaultConfig.
ale najwyraźniej to nie wystarczyło. ale kiedy się zmieniłem:
do:
to go rozwiązało. mam nadzieję, że to komuś pomoże
źródło
Jeśli pracujesz nad projektem systemu Android, upewnij się, że nie wywołujesz żadnych metod statycznych na żadnych klasach systemu Android. Używam tylko JUnit + Mockito, więc może inne frameworki mogą pomóc ci całkowicie uniknąć problemu, nie jestem pewien.
Mój problem polegał na wywołaniu
Uri.parse(uriString)
w ramach statycznego inicjatora do testu jednostkowego. Klasa Uri to interfejs API systemu Android, dlatego kompilacja testów jednostkowych nie mogła jej znaleźć. Zmieniłem tę wartość nanull
zamiast i wszystko wróciło do normy.źródło
Miałem te same problemy :java.lang.NoClassDefFoundError: Nie można zainicjować klasy com.xxx.HttpUtils
jest to problem ze środowiskiem, co oznacza, że właściwości w pliku application.yml są nieprawidłowe lub puste!
źródło
Mam ten sam problem. Zainicjowałem obiekt fasoli w statycznym bloku, jak poniżej:
Tylko dlatego, że proces mojej instalacji bean spowodował NPE, mam w tym kłopoty. Więc myślę, że powinieneś dokładnie sprawdzić swój statyczny blok kodu.
źródło