java.lang.NoClassDefFoundError: kon klasse XXX niet initialiseren

class PropHolderis een klasse op zich. De klasse bevindt zich in hetzelfde JAR-bestand van de hoofdklasse. Dus dat mag niet omdat er een JAR ontbreekt in classpath.

Als ik naar het JAR-bestand kijk door jar tf myjarfile, zie ik de PropHolder.classdaar vermeld.

Btw: de code werkt prima op mijn lokale computer. Maar kon niet werken als ik het met een of ander script op een Linux-server implementeerde. Dus ik denk dat het niet het probleem van de code is.
Maar om een of andere reden. het implementatieproces is erg moeilijk te volgen.

Wat zou het probleem kunnen zijn?


Antwoord 1, autoriteit 100%

Mijn beste gok is dat er hier een probleem is:

static {
    //code for loading properties from file
}

Het lijkt erop dat er een niet-afgevangen uitzondering is opgetreden en zich heeft verspreid naar de daadwerkelijke ClassLoader die probeert de klasse te laden. We hebben echter een stacktrace nodig om dit te bevestigen.

Dat of het gebeurde bij het maken van de statische variabele PropHolder.prop.


Antwoord 2, autoriteit 56%

Je krijgt een java.lang.NoClassDefFoundErrorwat NIET betekent dat je klasse ontbreekt (in dat geval zou je een java.lang.ClassNotFoundExceptionkrijgen) . De ClassLoader kwam een fout tegen tijdens het lezen van de klassedefinitie bij het proberen om de klasse te lezen.

Plaats een try/catch in je statische initializer en bekijk de uitzondering. Als u daar enkele bestanden leest en deze verschilt van uw lokale omgeving, is dit zeer waarschijnlijk de oorzaak van het probleem (misschien kan het bestand niet worden gevonden, geen rechten enz.).


Antwoord 3, autoriteit 14%

NoClassDefFoundError geeft niet echt een idee van wat er mis is gegaan in het statische blok. Het is een goede gewoonte om altijd een blok als dit in de statische { … } initialisatiecode te hebben:

static {
  try {
    ... your init code here
  } catch (Throwable t) {
    LOG.error("Failure during static initialization", t);
    throw t;
  }
}

Antwoord 4

Ik had dezelfde uitzondering, dit is hoe ik het probleem heb opgelost:

Voorwaarden:

  1. Junit-klasse (en test), die een andere klasse verlengde.

  2. ApplicationContext geïnitialiseerd met spring, waarmee het project wordt gestart.

  3. De toepassingscontext is geïnitialiseerd in de @Before-methode

Oplossing:

Initeer de toepassingscontext vanuit de @BeforeClass-methode, aangezien de bovenliggende klasse ook enkele klassen vereiste die werden geïnitialiseerd vanuit de toepassingscontext.

Ik hoop dat dit zal helpen.


Antwoord 5

Zoals hierboven vermeld, kan dit een aantal dingen zijn. In mijn geval had ik een statisch geïnitialiseerde variabele die afhankelijk was van een ontbrekende vermelding in mijn eigenschappenbestand. De ontbrekende vermelding toegevoegd aan het eigenschappenbestand en het probleem was opgelost.


Antwoord 6

Een paar dagen geleden kwam ik dezelfde vraag tegen, net als de jouwe. Alle code werkt goed op mijn lokale computer, maar er blijkt een fout te zijn (noclassdeffound&initialize).
Dus ik post mijn oplossing, maar ik weet niet waarom, ik breng alleen een mogelijkheid naar voren. Ik hoop dat iemand het weet zal dit uitleggen.@John Vint
Ten eerste zal ik je mijn probleem laten zien. Mijn code heeft statische variabele en statische blok beide. Toen ik dit probleem voor het eerst ontmoette, probeerde ik de oplossing van John Vint, en probeerde de uitzondering te vangen. Ik ving echter niets. Dus ik dacht dat het is omdat de statische variabele (maar nu ik weet dat ze hetzelfde zijn) en nog steeds niets vonden.
Dus ik probeer het verschil tussen de Linux-machine en mijn computer te vinden. Toen ontdekte ik dat dit probleem alleen gebeurt wanneer verschillende threads in één proces lopen (trouwens, de Linux-machine heeft dubbele kernen en dubbele processen). Dat betekent dat als er twee taken zijn (beide gebruikt de code die statisch blok of variabelen heeft) in hetzelfde proces uitvoeren, het gaat fout, maar als ze in verschillende processen lopen, zijn beide in orde.
In de Linux-machine gebruik ik

mvn -U clean  test -Dtest=path 

Om een ​​taak uit te voeren, en omdat mijn statische variabele een container (of misschien een nieuwe klasserlader initialiseert), zodat het blijft tot de JVM-stop, stopt de JVM alleen wanneer alle taken in één proces stoppen . Elke taak start een nieuwe container (of ClassLoader) en het maakt de JVM in de war. Als gevolg hiervan gebeurt de fout.
Dus, hoe het op te lossen? Mijn oplossing is om een ​​nieuw opdracht toe te voegen aan de MAVEN-opdracht en elke taak naar dezelfde container gaan.

-Dxxx.version=xxxxx #sorry can't post more

Misschien heb je dit probleem al opgelost, maar hoop nog steeds dat het anderen zal helpen die hetzelfde probleem ontmoeten.


Antwoord 7

Als u aan een Android-project werkt, moet u ervoor zorgen dat u geen statische methoden opneemt op Android-klassen. Ik gebruik alleen Junit + Mockito, dus misschien kunnen sommige andere frameworks je helpen het probleem helemaal te vermijden, ik weet het niet zeker.

Mijn probleem was het aanroepen van Uri.parse(uriString)als onderdeel van een statische initializer voor een unit-test. De Uri-klasse is een Android-API, daarom kon de unittest-build deze niet vinden. Ik heb deze waarde in plaats daarvan gewijzigd in nullen alles werd weer normaal.


Antwoord 8

Ik had dezelfde uitzondering – maar alleen in de foutopsporingsmodus,
zo heb ik het probleem opgelost (na 3 hele dagen):
in de build.gradle had ik:
“multiDexEnabled true” ingesteld in de sectie defaultConfig.

       defaultConfig {
    applicationId "com.xxx.yyy"
    minSdkVersion 15
    targetSdkVersion 28
    versionCode 5123
    versionName "5123"
    // Enabling multidex support.
    multiDexEnabled true
}

maar blijkbaar was dit niet genoeg.
maar toen ik veranderde:

public class MyAppClass  extends Application 

naar:

public class MyAppClass  extends MultiDexApplication 

dit heeft het opgelost.
hoop dat dit iemand zal helpen


Antwoord 9

Ik had dezelfde problemen:java.lang.NoClassDefFoundError: kon klasse com.xxx.HttpUtils niet initialiseren

static {
    //code for loading properties from file
}

het is het omgevingsprobleem. Dat betekent dat de eigenschappen in application.ymlonjuist of leeg zijn!


Antwoord 10

Ik heb hetzelfde probleem. Ik startte een bean-object in een statisch blok zoals hieronder:

static {
    try{
        mqttConfiguration = SpringBootBeanUtils.<MqttConfiguration>getBean(MqttConfiguration.class);
    }catch (Throwable e){
        System.out.println(e);
    }
 }

Alleen omdat het proces van de my bean obejct-initie een NPE veroorzaakte, krijg ik er problemen mee.
Dus ik denk dat je je statische codeblok zorgvuldig moet controleren.

Other episodes