Eclipse - java.lang.ClassNotFoundException


95

Lorsque j'essaye de démarrer mon JUnit-Test en dehors d'Eclipse, j'obtiens une "ClassNotFoundException". Lors de l'exécution de "mvn test" à partir de la console - tout fonctionne bien. De plus, aucun problème n'a été signalé dans Eclipse.

La structure de mon projet est la suivante:

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

edit: Comment la classe ne peut-elle pas être trouvée? C'est une simple application HelloWorld sans bibliothèques spéciales.

Voici la configuration d'exécution de mon JUnit: texte alternatif 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
J'obtiens la même erreur en essayant d'exécuter une classe HelloWorld simple sans JUnit inclus ... Plus exactement: java.lang.NoClassDefFoundError: HelloWorld Causé par: java.lang.ClassNotFoundException: HelloWorld
swalkner

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

pouvez-vous afficher le code de votre classe de test?
akf

avez-vous automatiquement activé ou désactivé la compilation?
Jon

build est activé automatiquement
swalkner

Réponses:


194

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 utiliserait.

Par exemple, votre projet Web src/main/javadevrait avoir target/classessous le projet Web, les classes de test devraient target/test-classeségalement avoir sous le projet Web et ainsi de suite.

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

Juste un conseil de plus, 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 correctement le chemin de construction.

J'espère que ça aide.


1
Salut Carlos, merci beaucoup pour vos conseils. Mais cela n'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 - lors du démarrage de mon src / test / java / UserDaoTest.java en tant que JUnit-test d'Eclipse, j'obtiens "Classe non trouvée UserDaoTest java.lang.ClassNotFoundException: UserDaoTest". Au moins, c'est un peu différent du message d'erreur d'origine ...
swalkner

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

Pour moi, cela n'a pas résolu le problème. Il s'est avéré que c'était un problème AspectJ. Si vous utilisez AspectJ, essayez de supprimer et de lire les fonctionnalités AspectJ - a fonctionné pour moi
Stefan Haberl

1
Eu le même problème. Je pense que c'est un projet eclipse - maven - problème git. Cela ne le restreint pas vraiment, mais effacer tous les dossiers de métadonnées (.project, .whatever ...), supprimer le projet et réimporter uniquement en tant que projet maven a fonctionné pour moi. J'ai également trouvé quelque chose que je ne savais pas qu'eclipse-junit pouvait faire: mettre en évidence la méthode de test et sélectionner RunAs-Junit n'exécute que cette méthode de test particulière, pas tout le test! Plus de @Ignoreraccourcis partout et d'interface graphique!
bgs

Face au même problème, j'ai simplement utilisé Eclipse -> Project -> clean et cela a fonctionné. Mvn clean n'a pas fonctionné.
Nutan

46

L'approche de Carlos a aidé! Eclipse - java.lang.ClassNotFoundException

Essayez de vérifier le classpath de la configuration d'exécution junit:

  1. Ouvrez vos configurations d'exécution
  2. Cliquez sur le jUnit-Test que vous souhaitez démarrer
  3. aller dans l'onglet classpath
  4. Essayez d'ajouter un dossier (cliquez sur les entrées utilisateur, cliquez sur avancé, cliquez sur ajouter des dossiers, cliquez sur ok et recherchez dans le dossier de sortie vos classes de test (celles que vous trouvez sous projektproperties chemin de construction java, source))

travaille pour moi.


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

Je ne pense pas que cette action ajoute nécessairement un répertoire nécessaire autant que déclenche quelque chose à recharger. Vous pouvez probablement supprimer immédiatement le répertoire nouvellement ajouté après une exécution réussie et cela devrait fonctionner normalement. En outre, le commentaire ci-dessus est exact. Peut-être voudra-t-il également voter pour l'éloge référencé de Carlos.
2012

J'ai trouvé la réponse à une autre question SO pour être plus utile avec ce problème: stackoverflow.com/a/5718520/901641
ArtOfWarfare

16

votre chemin de classe de construction est correct, c'est pourquoi vous pouvez compiler. le chemin de classe de votre JUnit doit être vérifié. allez dans le menu Exécuter et choisissez «ouvrir la boîte de dialogue d'exécution». là-dedans, vous devriez voir un arbre sur la gauche avec JUnit en option. ouvrez ce nœud et recherchez et sélectionnez votre test. dans le volet droit, vous verrez un onglet pour classpath. jetez un œil pour vous assurer que la classe que le test tente d'instancier sera trouvée.

Éditer:

cela semble être un problème avec maven et son comportement après qu'une version ait changé les dossiers de sortie par défaut d'Eclipse. j'ai vu des solutions décrites où

  • placer maven dans le bootclasspath AU-DESSUS du jre fonctionne, ou
  • courir mvn clean testfait l'affaire ou
  • actualiser tous vos projets éclipse, provoquant une reconstruction résout le problème
  • aller à votre projet et sélectionner Maven-> Mettre à jour la configuration résoudre le problème

avec les trois premiers, il y avait des rapports de la question récurrente. le dernier me semble le mieux, mais s'il ne fonctionne pas, essayez les autres.

ici et voici quelques infos


1
malheureusement, "Maven => Mettre à jour la configuration" ne résout pas du tout le problème ... l'inverse est vrai; il supprime les configurations du chemin de construction ... Ou cela signifie-t-il qu'une autre configuration est mauvaise?
swalkner

Exactement comme @swalkner l'a souligné: Maven => La configuration de la mise à jour ruinera la configuration du chemin de construction. Pour une raison qui m'échappe, le plugin définira des filtres d'exclusion que je dois toujours supprimer manuellement après l'exécution de la commande
Stefan Haberl

"Allez dans le menu Exécuter et choisissez" Ouvrir la boîte de dialogue d'exécution ". Ouh ?? Où est-ce?
Berit Larsen

4

Le problème peut être le fichier de classe manquant dans votre dossier de construction. Une solution consiste à nettoyer le projet et à le reconstruire.


4

L'activation de [x] Utiliser un JAR temporaire pour spécifier le chemin de classe (pour éviter les limitations de longueur de chemin de classe ) dans l' onglet Chemin de classe de la configuration Exécuter a fait l'affaire pour moi.

Si votre projet est énorme et que vous avez beaucoup de dépendances d'autres projets frères et dépendances maven, vous pourriez atteindre les limites de longueur du chemin de classe et cela semble être la seule solution (à part raccourcir le répertoire de votre dépôt local maven (le nôtre commence déjà à c: / m2)

entrez la description de l'image ici


3

Il y a de nombreuses suggestions alambiquées ici.

J'ai rencontré ce problème plusieurs fois avec des projets Maven après avoir déplacé des ressources par glisser-déposer, ou avoir refactoré les noms de classe.

Si cela se produit, copiez simplement (ne déplacez pas) le cas de test ( .java) via le terminal / navigateur de fichiers vers un autre emplacement, right-click -> Deletedans Eclipse et choisissez de supprimer sur le disque lorsque l'option est donnée, déplacez / copiez le fichier copié vers l'emplacement du fichier d'origine, puis sélectionnez votre projet dans Eclipse et appuyez sur F5 pour actualiser les ressources.

C'est rapide et facile à faire, et a résolu le problème de façon permanente pour moi à chaque fois.


Je suis tenté de demander si cela a résolu votre problème de façon permanente , ou à chaque fois ... mais je comprends ce que vous voulez dire, et, étonnamment, cela a fait l'affaire pour moi.
Amos M. Carpenter

3

J'ai eu exactement le même problème mais je l'ai compris! Accédez à votre fichier de projet et faites un clic droit dessus, puis cliquez Refreshou appuyez sur F5. Ensuite, essayez de l'exécuter. Si cela ne fonctionne toujours pas, oubliez-le, car j'ai eu le même problème EXACT et cela signifie simplement que votre version d'Eclipse est une poubelle.



2

Le droit de Sachin: même avec un chemin de classe correct, l'onglet Problèmes montrera que certaines dépendances ou la Ressource / projet a une erreur qui doit être corrigée pour que maven crée et crée automatiquement des classes lorsque vous créez ou effectuez une modification dans votre classe de test .

"Salut,

C'est très vieux juillet (quelle année) mais j'ai eu le même problème.

Le problème réel a révélé qu'eclipse n'était pas en mesure de générer un fichier de classe pour le fichier java, le chemin de classe était correct.

Consultez l'onglet Problème et vérifiez s'il manque quelque chose / fichier dans votre projet. vous pouvez créer un nouveau projet et ajouter des fichiers un par un et les construire jusqu'à ce qu'il arrête de compiler et de créer des classes (vérifiez le dossier workspace / proj / bin / package / pour les classes)

son étrange mais vrai, ecplise échouait dans la compliation parce que 4 des 20 fichiers java utilisaient une seule image qui manquait. et par conséquent, aucun des fichiers java n'a été compilé.

CLASSPATH n'est pas un problème ici. "


2

Nous avons eu l'exception exacte (en utilisant SpringSource Tools, tomcat, sur Win7) et la cause était que nous avions refactoré un nom de fichier (renommé un fichier) de SubDomain.java à Subdomain.java (D vs d) et d'une manière ou d'une autre il est entré en collision si SpringSource était affichant le nouveau nom Subdomain.java. La solution était de supprimer le fichier (via SpringSource) et de le recréer sous le nom Subdomain.java et de copier-coller son ancien contenu. Aussi simple que cela.


J'ai toujours exécuté des cas de test junit, jusqu'à ce que j'exécute le programme qui vérifie la compatibilité du PC avant de mettre à niveau Windows. Cela semble casser quelque chose, je ne peux pas exécuter à nouveau les cas de test JUnit. (et toutes les réponses existantes ne fonctionnent pas)
CoffeDeveloper

2

Je résolve ce chemin Bulit ---> bibliothèques ---> ajouter une bibliothèque ---> Junit check junit4


1

cliquez sur project->properties->Java build path->Sourceet vérifiez que chaque srcdossier est toujours valide existe ou récemment supprimé. Corrigez tout chemin manquant ou chemin incorrect, reconstruisez et exécutez le test. Cela résoudra le problème.


1

Tout ce que j'ai fait était Propriétés -> Chemin de construction Java -> Ordre et exportation -> Activé toutes les cases non cochées -> Déplacement de Junit tout en haut


1

A essayé

Link : [here][1]

Open your run configurations
Click on the jUnit-Test you want to start
go to the classpath tab
Try to add a folder (click on user entries, click on advanced, click on add folders,click on ok and search the outputfolder for your test classes(those you find under projektproperties java build path, source))

travaillé après

Maven 2 LifeCycle >> test


1

J'avais essayé toutes les solutions de cette page: actualiser le projet, reconstruire, nettoyer tous les projets, redémarrer Eclipse, réimporter (même) les projets, reconstruire maven et actualiser. Rien n'a fonctionné. Ce qui a fonctionné, c'est de copier la classe sous un nouveau nom qui fonctionne bien - bizarre mais vrai.

Après avoir supporté cela pendant un certain temps, je viens de le réparer en:

  1. Via le Runmenu
  2. Sélectionner Run Configurations
  3. Choisissez la configuration d'exécution associée à votre test unitaire.
  4. Suppression de l'entrée du Run Configurationen appuyant sur Supprimer ou en cliquant sur le X rouge.

Quelque chose a dû être foiré avec la configuration d'exécution en cache.


1
Après trop de temps perdu, j'ai fini par suivre les étapes ci-dessus. J'ai alors pris la décision héroïque de supprimer toutes les configurations de test d'exécution et maintenant aucun de mes tests ne peut être trouvé dans le chemin de classe même si la nouvelle configuration d'exécution montre clairement le projet (avec les dépendances maven en dessous). J'oublie toujours à quel point l'éclipse est fragile. Après cela, aucun test n'a pu être exécuté avec eclipse (avant que je puisse sélectionner un test particulier - ok). Enfin, j'ai essayé la suggestion KomodoDave ci-dessous. Cela a corrigé les choses ... incroyable les boucles que vous devez franchir avec cette idée (la dernière d'une série ..)
justin

1

La suppression du projet de eclipse (pas du disque dur) qui en quelque sorte nettoie l'espace de travail et réimporte le projet dans eclipse a de nouveau fonctionné pour moi.


1

Habituellement, ce problème se produit lors de l'exécution de l' javaoutil d' application Java incapable de trouver le fichier de classe.

Surtout dans le projet maven, nous voyons ce problème parce que le problème de synchronisation Eclipse-Maven . Pour résoudre ce problème: Maven-> Mettre à jour la configuration


0

Avez-vous essayé de faire un clic droit sur la racine de votre projet, en sélectionnant "propriétés" et en vous assurant que le CLASSPATH est correct? Si je me souviens bien, c'est ainsi que vous procédez.

Quelque chose sur la façon dont Eclipse exécute les tests unitaires qui vous oblige à ajouter le JAR junit au CLASSPATH d'exécution d'une manière spéciale?

J'utilise IntelliJ, donc je n'ai pas ces problèmes.

Je vérifierais Eclipse moi-même, mais je préfère ne pas l'avoir sur mon bureau.


d'accord, sans mener à une discussion Eclipse vs IntelliJ; J'aimerais l'avoir dans Eclipse en cours d'exécution ... et j'ai vérifié le Java Build Path - le Java JDK est là, et je n'ai besoin de rien d'autre pour mon exemple HelloWorld ... Je pense que ça a quelque chose à voir avec 'dossiers source sur le chemin de construction' ... Je les ai mis dans le dossier où mon paquet commence ... Je suppose que c'est correct.
swalkner

Vous avez besoin de quelque chose en plus du JDK - c'est le chemin vers HelloWorld.class, non? "dossiers source sur le chemin de construction" - sonne mieux. Pas besoin de supposer, soyez expérimentateur et essayez-le. Eclipse vous dira si vous avez raison.
duffymo

0

Hmm, ça a l'air un peu bizarre, essayez de l'exécuter avec l'annotation suivante en haut de la classe:

@RunWith(SpringJUnit4ClassRunner.class)
public class UserDaoTest {
}

et dites-moi comment vous vous en sortez.

Vérifiez que la compilation est également activée automatiquement. Si vous voulez vous assurer que vos classes de test sont correctement compilées, effacez le dossier cible Maven (et tout dossier bin utilisé par Eclipse). Utilisez-vous également m2eclipse, car je trouve que c'est un peu problématique.


merci beaucoup pour votre réponse, mais néanmoins: ça ne marche pas non plus; d'abord, je dois inclure spring-test.jar, puis une autre dépendance n'est pas remplie. Je ne comprends pas pourquoi cela ne fonctionne pas avec une simple classe helloworld dans le même package. et là, je n'ai pas besoin d'un "hack" comme celui suggéré par vous ... quelque chose ne va pas avec "classpath" ou quelque chose de similaire, mais je n'obtiens pas où / ce que je dois vérifier ...
swalkner

0

La solution à mon problème qui était similaire: les bibliothèques n'étaient pas valides. Si vous regardez dans le fichier .classpath du projet, vous verrez des balises classpathentry avec la clé / valeur kind = "lib". Certains des miens étaient incorrects.

Je ne l'ai découvert que lorsque j'ai désactivé les paramètres de validation. Autrement dit, il y avait tellement d'erreurs dans les fichiers JSP, etc., que les erreurs de chemin de classe n'étaient pas évidentes (ni même apparaissaient). En conséquence, rien n'était compilé dans les dossiers de sortie de destination, mais aucune erreur utile expliquant pourquoi.


0

Veuillez pointer le JDK correct à partir de Windows> Préférences> Java> JRE installé.

Ne pointez pas vers jre, pointez vers un JDK approprié. J'ai indiqué le JDK 1.6U29 et actualisé le projet.

Par la suite, le problème a disparu et les tests jUnit fonctionnent correctement.

Merci,
-Tapas


0

J'ai récemment rencontré la même erreur dans Eclipse, c'est-à-dire que l'EDI Eclipse n'a pas pu trouver la classe de test unitaire, peu importe comment je change les configurations. En apprenant des articles précédents ici et sur d'autres sites Web, j'ai vérifié et triplé le chemin de classe et les informations sur la source, et j'ai déplacé de haut en bas le dossier source et les bibliothèques, à la fois dans la "Configuration d'exécution" et dans le "Chemin de construction Java "config windows, et j'ai également nettoyé le projet et l'ai reconstruit, mais aucune des astuces ne fonctionne pour moi. Le projet Java spécifique est un ancien projet compilé ANT et contient de nombreux fichiers JAR dans la bibliothèque Eclipse.

Ensuite, j'ai changé la classe de test unitaire pour ajouter une méthode main () et cliquez dessus avec le bouton droit de la souris pour "Exécuter en tant que" une application Java au lieu de tester JUnit, et soudain, Eclipse semble se réveiller et a identifié la classe correctement. Ensuite, je suis retourné à une application de test unitaire, et cela fonctionne toujours.

Cela semble être un bogue dans Eclipse, je suppose que le grand nombre de bibliothèques (> 260) peut perturber la capacité de la JVM à localiser ma classe JUnit.


0

J'ai également été touché par ce problème et j'ai pu trouver une solution suffisante pour mon cas. Si votre projet Eclipse a un fichier .classpath à la racine de votre projet (voyez-le dans la vue Navigateur au lieu de la vue Explorateur de packages), assurez-vous que votre chemin de classe Maven apparaît avant votre chemin de classe de conteneur JRE.

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
</classpath>

Si votre projet ne possède pas de fichier .classpath, vous pouvez modifier le chemin de génération Java de votre projet pour changer l'ordre et l'exportation. Si votre projet a le fichier .classpath et que vous ne modifiez votre ordre que dans le chemin de compilation Java, vous verrez que l'ordre n'est pas affecté et le problème continuera à se produire.

Et un projet -> nettoyer ne fait jamais de mal aux choses après avoir effectué le changement.


0

Assurez-vous que votre configuration de lancement de test ne contient PAS les lignes suivantes, OU essayez d'activer la gestion automatisée des dépendances Maven.

<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.maven.ide.eclipse.launchconfig.classpathProvider"/>
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.maven.ide.eclipse.launchconfig.sourcepathProvider"/>

0

J'ai essayé tout ce que j'ai lu dans ce long article et, incroyablement, ce qui a fonctionné pour moi était, plutôt que de cliquer sur la classe de test et de sélectionner Run as JUnit test, de cliquer sur la méthode de test et d'exécuter en tant que JUnit test. Je ne sais pas pourquoi?


0

Le test JUnit de l'intérieur de l'éclipse m'a également donné NoClassDefFoundError. L'exécution de 'mvn clean test' à partir de la ligne de commande m'a donné l'erreur suivante sur plusieurs jars: en-tête LOC invalide (mauvaise signature) La suppression de ces jars du référentiel m2 local et l'exécution de 'mvn clean test' ont à nouveau résolu mon problème.


0

J'ai eu le même problème. Tout ce que j'ai fait était,

je). Artefacts Eclipse générés

mvn clean eclipse:eclipse

ii). Actualisez le projet et réexécutez votre test junit. Cela devrait fonctionner correctement.


0

En outre, DOUBLE-VÉRIFIEZ la boîte de dialogue "Web Deployment Assembly" de l'éclipse.

Cela peut être trouvé: Propriétés du projet-> Assemblée de déploiement.

Récemment, un plugin eclipse a modifié l'un de mes projets Web, et il a ajouté ~ mystérieusement ~ les répertoires de test maven / src / test / java, / src / test / resources à l'assembly de déploiement. UGGGG !!!

C'est pourquoi mon projet a bien fonctionné quand j'ai construit et déployé juste maven directement sur tomcat, pas d'exceptions ClassNotFound ... Cependant, quand j'ai fait le déploiement via Eclipse, Whammo !! Je commence à recevoir des ClassNotFoundExceptions car le TestCode est en cours de déploiement.

Eric


0

Cela signifie que votre pom.xml a des problèmes non résolus. Ouvrez la vue des problèmes résoudre en conséquence. Ensuite, vous pourrez exécuter les cas de test avec succès sans rencontrer l'exception classnotfoundexception.


0

La modification de l'ordre des artefacts de chemin de classe dans le chemin de construction Java l'a résolu pour moi.

  1. Cliquez avec le bouton droit sur le projet et accédez au chemin de construction du projet.
  2. Accédez à l'onglet Order and Export et déplacez la bibliothèque système JRE après les sources.

Cela devrait le réparer.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.