197 votes

Java.lang.NoClassDefFoundError: Impossible d'initialiser la classe XXX

public class PropHolder {
  public static Properties prop;

  static {
    //code for loading properties from file
  }
}

// Référencement de la classe ailleurs :
Properties prop = PropHolder.prop;

class PropHolder est une classe de ma propre création. La classe réside dans le même fichier JAR que la classe principale. Donc cela ne devrait pas être dû à un JAR manquant dans le classpath.

Quand je regarde dans le fichier JAR avec jar tf monfichierjar, je peux voir le PropHolder.class répertorié là-bas.

À propos : le code fonctionne parfaitement sur ma machine locale. Mais il ne fonctionne pas lorsque je le déploie avec un script sur un serveur Linux. Je pense donc que ce n'est pas un problème de code. Mais pour une raison quelconque, le processus de déploiement est très difficile à suivre.

Quel pourrait être le problème ?

0 votes

Est-ce que la structure de répertoire appropriée dans votre jar correspond au package de classe ?

0 votes

Besoin de voir certaines sources, de nombreuses choses peuvent causer cela. par exemple, une déclaration 'package' mais le fichier ne réside pas réellement dans le chemin correspondant

4 votes

Une cause est une exception pendant l'initialisation--y a-t-il une autre sortie d'erreur?

2voto

MonkeyKing Points 43

Il y a seulement quelques jours, j'ai rencontré la même question que la vôtre. Tout le code fonctionne bien sur ma machine locale, mais finit par afficher une erreur (noclassdeffound&initialize). J'ai donc posté ma solution, mais je ne sais pas pourquoi, j'ai simplement avancé une possibilité. J'espère que quelqu'un qui sait l'expliquera. @John Vint Tout d'abord, je vais vous montrer mon problème. Mon code a à la fois une variable statique et un bloc statique. Lorsque j'ai rencontré ce problème pour la première fois, j'ai essayé la solution de John Vint, et j'ai essayé d'attraper l'exception. Cependant, je n'ai rien attrapé. J'ai donc pensé que cela était dû à la variable statique (mais maintenant je sais que ce sont les mêmes choses) et je n'ai toujours rien trouvé. Donc, j'ai essayé de trouver la différence entre la machine linux et mon ordinateur. Ensuite, j'ai découvert que ce problème se produit uniquement lorsque plusieurs threads s'exécutent dans un même processus. Cela signifie que si deux tâches (utilisant toutes les deux le code qui a un bloc statique ou des variables statiques) s'exécutent dans le même processus, cela échoue, mais si elles s'exécutent dans des processus différents, les deux fonctionnent. Sur la machine Linux, j'utilise

mvn -U clean  test -Dtest=chemin 

pour exécuter une tâche, et comme ma variable statique sert à démarrer un conteneur (ou peut-être initialiser un nouveau classloader), elle restera active jusqu'à l'arrêt de la JVM, et la JVM s'arrête seulement lorsque toutes les tâches dans un processus s'arrêtent. Chaque tâche va démarrer un nouveau conteneur (ou classloader) et cela perturbe la JVM. En conséquence, l'erreur se produit. Alors, comment résoudre ce problème? Ma solution est d'ajouter une nouvelle commande à la commande maven, et de faire en sorte que chaque tâche aille dans le même conteneur.

-Dxxx.version=xxxxx #désolé, je ne peux pas en dire plus

Vous avez peut-être déjà résolu ce problème, mais j'espère quand même que cela aidera d'autres personnes qui rencontrent le même problème.

0 votes

De plus, lorsque le code s'exécute sur la machine linux, suivez l'erreur ci-dessus, il y a un autre problème : java.lang.ExceptionInInitializerError: null, cela signifie qu'il ne peut pas trouver la classe dans le chargeur de classes, ou ne sait pas laquelle charger (je suppose). Avez-vous rencontré cela ?

1voto

lifeson106 Points 503

Si vous travaillez sur un projet Android, assurez-vous de ne pas appeler de méthodes statiques sur les classes Android. Je n'utilise que JUnit + Mockito, donc peut-être que d'autres frameworks pourraient vous aider à éviter le problème complètement, je ne suis pas sûr.

Mon problème était d'appeler Uri.parse(uriString) en tant qu'initialiseur statique pour un test unitaire. La classe Uri est une API Android, c'est pourquoi la version du test unitaire ne pouvait pas la trouver. J'ai changé cette valeur en null à la place et tout est revenu à la normale.

1voto

Elad Points 441

J'ai eu la même exception - mais seulement en mode debug, voici comment j'ai résolu le problème (après 3 jours entiers) : dans le fichier build.gradle j'avais : "multiDexEnabled true" configuré dans la section defaultConfig.

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

mais apparemment ce n'était pas suffisant. mais quand j'ai changé :

public class MyAppClass  extends Application 

à :

public class MyAppClass  extends MultiDexApplication 

cela a résolu le problème. j'espère que cela aidera quelqu'un

0voto

user8503957 Points 1

J'ai eu les mêmes problèmesjava.lang.NoClassDefFoundError: Impossible d'initialiser la classe com.xxx.HttpUtils

static {
    //code pour charger les propriétés depuis un fichier
}

C'est un problème d'environnement. Cela signifie que les propriétés dans application.yml sont incorrectes ou vides!

0voto

lai nan Points 11

Je rencontre le même problème. J'ai initié un objet bean dans un bloc statique comme ci-dessous :

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

Juste parce que le processus d'initialisation de mon objet bean a provoqué une NPE, j'ai eu des problèmes avec cela. Je pense donc que vous devriez vérifier soigneusement votre bloc de code statique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X