102 votes

Eclipse - java.lang.ClassNotFoundException

Lorsque j'essaie de lancer mon test JUnit à partir d'Eclipse, j'obtiens une "ClassNotFoundException". Lorsque j'exécute "mvn test" à partir de la console, tout fonctionne correctement. De même, aucun problème n'est signalé dans Eclipse.

La structure de mon projet est la suivante :

  • projet parent (pom-packaging)
    • Projet Web (war-packaging - mon test JUnit est ici)
    • Projet Flex
    • Projet de configuration

edit : Comment la classe peut-elle être introuvable ? Il s'agit d'une simple application HelloWorld sans aucune bibliothèque particulière.

Voici la configuration d'exécution de mon JUnit : texte alt http://www.walkner.biz/_temp/runconfig.png


Testclass (mais comme je l'ai dit, cela ne fonctionne pas non plus avec un simple HelloWorld...) :

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import biz.prognoserechnung.domain.User;
import biz.prognoserechnung.domain.UserRepository;
import biz.prognoserechnung.domain.hibernate.UserHibernateDao;

public class UserDaoTest {
/**
 * the applicationcontext.
 */
private ApplicationContext ctx = null;

/**
 * the user itself.
 */
private User record = null;

/**
 * Interface for the user.
 */
private UserRepository dao = null;

@Before
public void setUp() throws Exception {
String[] paths = { "WEB-INF/applicationContext.xml" };
ctx = new ClassPathXmlApplicationContext(paths);
dao = (UserHibernateDao) ctx.getBean("userRepository");
}

@After
public void tearDown() throws Exception {
dao = null;
}

@Test
public final void testIsUser() throws Exception {
Assert.assertTrue(dao.isUser("John", "Doe"));
}

@Test
    public final void testIsNoUser() throws Exception {
    Assert.assertFalse(dao.isUser("not", "existing"));
        Assert.assertFalse(dao.isUser(null, null));
        Assert.assertFalse(dao.isUser("", ""));
    }
}

3 votes

J'obtiens la même erreur en essayant d'exécuter une simple classe HelloWorld sans JUnit... Plus exactement : java.lang.NoClassDefFoundError : HelloWorld Caused by : java.lang.ClassNotFoundException : HelloWorld

0 votes

Une exception ClassNotFoundException est levée lors de la réflexion sur une classe. NoClassDefFoundError est levée lorsque vous essayez d'utiliser la classe dans un appel de méthode normal.

0 votes

Pouvez-vous montrer le code de votre classe de test ?

201voto

Carlos Points 1421

J'ai rencontré cette situation à plusieurs reprises et, après de nombreuses tentatives, j'ai trouvé la solution.

Vérifiez le chemin de construction de votre projet et activez des dossiers de sortie spécifiques pour chaque dossier. Parcourez un par un chaque dossier source de votre projet et définissez le dossier de sortie que maven utilisera.

Par exemple, le fichier src/main/java aurait dû target/classes sous le projet web, les classes de test doivent avoir target/test-classes également sous le projet web et ainsi de suite.

L'utilisation de cette configuration vous permettra d'exécuter des tests unitaires dans Eclipse.

Encore un conseil, si les tests de votre projet web nécessitent des fichiers de configuration qui se trouvent sous les ressources, assurez-vous d'inclure ce dossier en tant que dossier source et de configurer le chemin d'accès de compilation de manière appropriée.

1 votes

Bonjour Carlos, merci beaucoup pour vos conseils. Mais cela ne m'a pas aidé, malheureusement. J'ai ajouté /src/main/java (target/classes) et /src/test/java (target/test-classes) aux dossiers source ainsi que src/main/resources (applicationContext.xml, quelques propriétés - target/classes). Même problème - lorsque je démarre mon src/test/java/UserDaoTest.java en tant que test JUnit depuis Eclipse, j'obtiens "Class not found UserDaoTest java.lang.ClassNotFoundException : UserDaoTest". Au moins, c'est un peu différent du message d'erreur original...

5 votes

Vous êtes sur la bonne voie, vérifiez si la classe UserDaoTest se trouve dans le dossier de sortie correspondant dans votre système de fichiers (comme vous le savez peut-être, Eclipse compile tous vos fichiers sources et les place dans le dossier de sortie spécifié, entre autres, pour pouvoir lancer les tests). Si la classe n'apparaît pas dans le dossier de sortie, vérifiez les filtres d'inclusion/exclusion du chemin de compilation pour ce dossier spécifique. Nous vous souhaitons bonne chance.

0 votes

Pour moi, cela n'a pas résolu le problème. Il s'est avéré qu'il s'agissait d'un problème lié à AspectJ. Si vous utilisez AspectJ, essayez de supprimer et de lire les capacités AspectJ - cela a fonctionné pour moi.

47voto

CoffeJunky Points 658

L'approche de Carlos a porté ses fruits ! Eclipse - java.lang.ClassNotFoundException

Essayez de vérifier le classpath de la configuration de junit run :

  1. Ouvrez vos configurations d'exécution
  2. Cliquez sur le test jUnit que vous voulez démarrer
  3. aller dans l'onglet classpath
  4. Essayez d'ajouter un dossier (cliquez sur user entries, cliquez sur advanced, cliquez sur add folders, cliquez sur ok et cherchez dans le dossier de sortie vos classes de test (celles que vous trouvez sous projektproperties java build path, source)).

fonctionne pour moi.

2 votes

N'est-ce pas très étrange ? Cela a fonctionné pour moi, mais le répertoire des classes cibles fait partie du classpath de construction du projet. Cela n'a pas beaucoup de sens que vous ayez besoin d'ajouter une classe spécifique.

0 votes

Je ne pense pas que cette action ajoute nécessairement un répertoire nécessaire, mais plutôt qu'elle déclenche le rechargement de quelque chose. Vous pouvez probablement supprimer immédiatement le répertoire nouvellement ajouté après une exécution réussie et cela devrait fonctionner normalement. De plus, le commentaire ci-dessus est juste. Il se peut que l'on veuille aussi mettre un upvote à la recommandation référencée de Carlos.

0 votes

La réponse à une autre question sur le SO m'a semblé plus utile pour résoudre ce problème : stackoverflow.com/a/5718520/901641

17voto

akf Points 23518

Le classpath de votre build est correct, c'est pourquoi vous pouvez compiler. le classpath de votre JUnit doit être vérifié. allez dans le menu Run et choisissez "open run dialog". vous devriez voir un arbre sur la gauche avec JUnit comme option. ouvrez ce nœud et trouvez et sélectionnez votre test. sur le panneau de droite, vous verrez un onglet pour classpath. jetez un coup d'œil pour vous assurer que votre classe que le test essaie d'instancier sera trouvée.

éditer :

Il semble qu'il s'agisse d'un problème lié à maven et à son comportement après qu'une version a modifié les dossiers de sortie par défaut d'Eclipse.

  • placer maven dans le bootclasspath AU-DESSUS du jre fonctionne, ou
  • en cours d'exécution mvn clean test fait l'affaire ou
  • l'actualisation de tous vos projets Eclipse, en provoquant une reconstruction, corrige le problème
  • aller dans votre projet et sélectionner Maven->Mise à jour de la configuration résout le problème.

avec les trois premiers, il y a eu des rapports sur la récurrence du problème. le dernier me semble le meilleur, mais s'il ne fonctionne pas, essayez les autres.

aquí y aquí Voici quelques informations

1 votes

Malheureusement, "Maven => Update Configuration" ne résout pas du tout le problème... l'inverse est vrai ; il supprime les configurations du chemin de construction... Ou est-ce que cela signifie qu'une autre configuration est mauvaise ?

0 votes

Exactement comme l'a souligné @swalkner : Maven => La configuration de la mise à jour va ruiner la configuration du chemin de construction. Pour une raison qui m'échappe, le plugin met en place des filtres d'exclusion que je dois toujours supprimer manuellement après avoir lancé la commande

0 votes

Allez dans le menu "Exécuter" et choisissez "Ouvrir la boîte de dialogue d'exécution". Hein ?? Qu'est-ce que c'est que ça ?

8voto

user3018906 Points 441

Habilitation [x] Utiliser un JAR temporaire pour spécifier le classpath (pour éviter les limitations de longueur du classpath) à l'intérieur du Onglet Classpath de la Exécuter la configuration a fait l'affaire pour moi.

Si votre projet est énorme et que vous avez beaucoup de dépendances provenant d'autres projets frères et de dépendances maven, vous risquez de vous heurter aux limites de longueur du classpath et ceci semble être la seule solution (à part raccourcir le répertoire de votre repo maven local (le nôtre commence déjà à c:/m2)).

enter image description here

5voto

EvilFish Points 21

Le problème peut provenir de l'absence du fichier de classe dans votre dossier de construction. Une solution consiste à nettoyer le projet et à le reconstruire.

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