web-dev-qa-db-fra.com

Java ClassNotFoundException avec dépendance maven

J'obtiens des exceptions ClassNotFoundException et NoClassDefFoundError lorsque je tente d'exécuter mon application avec une dépendance définie par maven.

J'ai ajouté ma dépendance maven pour le fichier jar en question à mon fichier pom.xml avec la déclaration suivante:

<dependency>
    <groupId>spy</groupId>
    <artifactId>spymemcached</artifactId>
    <version>2.8.4</version>
    <scope>provided</scope>
</dependency>

Cela a ajouté le fichier JAR correspondant à mon dossier Maven Dependencies dans Eclipse. Je peux accéder aux classes en code mais je reçois les exceptions mentionnées une fois l'application lancée.

Le fichier jar est référencé dans mon chemin de génération Java sous les dépendances Maven:

Java build path

Mon référentiel Maven local est ajouté à mon chemin de classe:

screenshot

Lorsque j'essaie d'exécuter l'application, j'obtiens les deux exceptions suivantes:

Java.lang.NoClassDefFoundError: Lnet/spy/memcached/MemcachedClient;

Java.lang.ClassNotFoundException: net.spy.memcached.MemcachedClient

Est-ce que quelqu'un peut-il me montrer la bonne direction?

34
Vex

Remplacez provided par compile

À condition de

Cela ressemble beaucoup à la compilation, mais indique que vous vous attendez à ce que le JDK ou un conteneur fournisse la dépendance au moment de l'exécution. Par exemple, lors de la création d'une application Web pour Java Enterprise Edition, vous devez définir la dépendance de l'API Servlet et des API Java EE associées sur la portée fournie, car le conteneur Web fournit ces classes. Cette portée est uniquement disponible sur le chemin de classe de compilation et de test et n'est pas transitive.

33
Jigar Joshi
<scope>provided</scope>

La portée "Fourni" implique que les dépendances ne soient disponibles que pendant la phase de compilation et qu'elles soient disponibles ailleurs pendant l'exécution et que Maven ne devrait pas les regrouper avec le reste des fichiers jar et des classes de l'application actuelle. 

Votre dépendance ne semble pas être de la "portée". Supprimez cette étendue de votre définition de dépendance et les pots seront présents dans votre pot/guerre/oreille emballé.

9
Vikdor

Je faisais face au même problème mais je n'avais pas l'étiquette définie sur mon POM, cela fonctionnait toujours bien jusqu'au jour où tout d'un coup, j'ai commencé à me donner cette erreur sur ma machine locale sans raison, la dépendance était correctement configurée dans le POM et le pot était présent dans le référentiel Maven local.

J'ai essayé de nettoyer le projet et de mettre à jour le projet Maven mais rien, aucune des solutions suggérées pour les autres postes ne fonctionnait pour moi non plus.

J'ai finalement réussi à le résoudre en accédant à l'onglet serveurs -> clic droit sur Tomcat v8.0 -> parcourir l'emplacement de déploiement 

cela devrait vous conduire à un dossier temporaire comme

.metadata.plugins\org.Eclipse.wst.server.core\tmp1\wtpwebapps

puis vous naviguez dans votre dossier de projet -> WEB-INF -> lib -> ici, j’ai découvert que le fichier jar de la bibliothèque qui donnait l’erreur était manquant; je l’ai donc simplement copié à partir de .m2\repository

Le serveur a redémarré et il a recommencé à fonctionner normalement.

J'espère que cela aide un corps confronté au même problème.

1
MFJ

Ajouter ci-dessous Dépendance, cela résoudra le problème. 

<!-- https://mvnrepository.com/artifact/info.cukes/cucumber-jvm-deps -->
<dependency>
    <groupId>info.cukes</groupId>
    <artifactId>cucumber-jvm-deps</artifactId>
    <version>1.0.3</version>
    <scope>provided</scope>
</dependency>
0
Arpan Saini

Répondez à un problème lié à votre problème, mais pouvez quand même aider les autres.
Ajouter <scope>compile</scope> à la dépendance n'était pas suffisant dans mon cas. J'ai également dû ajouter <packaging>jar</packaging> au pom du module cible.

0
adamjankovec