web-dev-qa-db-fra.com

Ant + JUnit: NoClassDefFoundError

Ok, je suis frustré! J'ai chassé pendant un bon nombre d'heures et je suis toujours perplexe.

Environnement: WinXP, Eclipse Galileo 3.5 (installation directe - pas de plugins supplémentaires).

J'ai donc un simple test JUnit. Il fonctionne bien depuis sa configuration d'exécution interne Eclipse JUnit. Cette classe ne dépend de rien. Pour limiter ce problème autant que possible, il contient simplement:

@Test
public void testX() {
    assertEquals("1", new Integer(1).toString());
}

Pas de sueur jusqu'à présent. Maintenant, je veux passer à l'étape très avancée consistant à exécuter ce scénario de test depuis Ant (l'objectif final est d'intégrer Hudson).

Donc, je crée un build.xml:

<project name="Test" default="basic">
    <property name="default.target.dir" value="${basedir}/target" />
    <property name="test.report.dir" value="${default.target.dir}/test-reports" />

    <target name="basic">
        <mkdir dir="${test.report.dir}" />
        <junit fork="true" printSummary="true" showOutput="true">
            <formatter type="plain" />
            <classpath>
                <pathelement path="${basedir}/bin "/>
            </classpath>
            <batchtest fork="true" todir="${test.report.dir}" >
                <fileset dir="${basedir}/bin">
                    <include name="**/*Test.*" />
                </fileset>
            </batchtest>
        </junit>
    </target>
</project>

$ {basedir} est le nom du projet Java dans l'espace de travail contenant la source, les classes et le fichier de construction. Tous les fichiers .Java et build.xml sont dans $ {basedir}/src. Les fichiers .class sont dans $ {basedir}/bin.

J'ai ajouté le répertoire d'installation d'Eclipse/plugins/org.junit4_4.5.0.v20090423/junit.jar au chemin d'accès Class Runtime via Windows/Préférences/Ant/Runtime/Entrées contribuées. ant-junit.jar est dans les entrées Ant Home.

Alors, que se passe-t-il lorsque je lance cette cible incroyablement complexe? Mon fichier de rapport contient:

Testsuite: com.xyz.test.RussianTest
Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec

Testcase: initializationError took 0 sec
Caused an ERROR
org/hamcrest/SelfDescribing
Java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing
    at Java.lang.ClassLoader.defineClass1(Native Method)
    at Java.lang.ClassLoader.defineClass(Unknown Source)
    at Java.security.SecureClassLoader.defineClass(Unknown Source)
    at Java.net.URLClassLoader.defineClass(Unknown Source)
    at Java.net.URLClassLoader.access$000(Unknown Source)
    at Java.net.URLClassLoader$1.run(Unknown Source)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Java.net.URLClassLoader.findClass(Unknown Source)
    at Java.lang.ClassLoader.loadClass(Unknown Source)
    at Sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at Java.lang.ClassLoader.loadClass(Unknown Source)
    at Java.lang.ClassLoader.loadClassInternal(Unknown Source)
    at Java.lang.reflect.Constructor.newInstance(Unknown Source)
    Caused by: Java.lang.ClassNotFoundException: org.hamcrest.SelfDescribing
    at Java.net.URLClassLoader$1.run(Unknown Source)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Java.net.URLClassLoader.findClass(Unknown Source)
    at Java.lang.ClassLoader.loadClass(Unknown Source)
    at Sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at Java.lang.ClassLoader.loadClass(Unknown Source)
    at Java.lang.ClassLoader.loadClassInternal(Unknown Source)

Quelle est cette classe org.hamcrest.SelfDescribing? Quelque chose à voir avec des moqueurs? OK bien. Mais pourquoi la dépendance? Je ne fais rien du tout avec ça. Il s'agit littéralement d'un projet Java sans autre dépendance que JUnit.

Stumped (et frustré) !!

26
SteveT

J'ai téléchargé JUnit 4.7 et mis junit-4.7.jar dans mon chemin de construction (au lieu de l'ancienne version). Cela l'a résolu. Je n'ai pas touché ant.

14
JB

ajoutez également hamcrest.jar à votre chemin de classe de test

10
dfa

J'ai trouvé la raison d'un problème identique, mais uniquement lors de l'exécution du test avec Ant sur la ligne de commande.

Vous voudrez peut-être exécuter Ant en mode débogage (ant -d) et faire attention à cette déclaration:

[junit] Implicitly adding /usr/share/ant/lib/junit4.jar:...

Dans mon cas, ce fichier JAR a été ajouté à la fin de mon chemin de classe lors de l'exécution du test et a remplacé ma référence JUnit dans mon script Ant. 

Il s'est avéré que mon installation Ant était fournie avec un ensemble d'anciennes bibliothèques JUnit. Je devais supprimer le junit4.jar ci-dessus afin de rendre effective la référence de mon classpath Ant.

7
PålOliver

Fait face exactement au même problème dans Eclipse mais le résout en suivant les étapes indiquées

  1. Allez dans Préférences | Java | JUnit
  2. Cliquez sur "Ajouter un package" et ajoutez "org.hamcrest. *"

Voila ... le problème est parti ..

3
Niranjan

J'ai eu le même problème avec jUnit 4.11, Ant et Ivy. Ce code fonctionne pour moi, mais vous devez vous assurer que vous avez hamcrest-core-1.3.jar (pour jUnit 4.11) dans votre lib dossier.

<property name="lib.dir">lib</property>
<property name="test.dir">src/test/Java</property>
<property name="build.test">build/test/Java</property>

<path id="test.path.id">
    <path location="${build.test}" />
    <path refid="lib.path.id" />
</path>

<path id="lib.path.id">
    <fileset dir="${lib.dir}" />
</path>

<!-- ================================= 
              Runs Tests         
================================= -->
<target name="junit">
    <junit>
        <classpath refid="test.path.id" />
        <batchtest>
            <fileset dir="${test.dir}" />
        </batchtest>
        <formatter type="plain" usefile="false" />
    </junit>
</target>
2
Alexander Ivanov

J'ai eu le même problème et j'ai essayé de nombreuses façons de modifier le classpath. La solution la plus simple pour moi consistait à utiliser le paramètre fork = "no" à la cible Junit. On dirait qu'Eclipse peut "automagiquement" faire mieux que moi ...

2
Bananeweizen

J'ai ajouté des fichiers hamcrest et junit jar au répertoire Java/lib/ext et cela a bien fonctionné pour moi.

2
Dilip

La classe qui vous manque est incluse dans junit à partir de la version 4.4 et sur ( link ).

Vérifiez si une ancienne version de jUnit est dans votre chemin de classe. Essayez d'exécuter le script ant dans un shell de commande pour voir si vous obtenez la même erreur. Si vous le faites, alors ant utilise probablement une version de jUnit antérieure à 4.4.

Mise à jour:

Regardez le dossier ANT_HOME. Faites un clic droit sur un fichier build.xml, sélectionnez le deuxième "Génération Ant" dans la boîte de dialogue Exécuter en tant que. Une boîte de dialogue vous permettant d’éditer la configuration d’ant Ant s’ouvrira (il pourrait exister un moyen plus facile de l’ouvrir). Allez à l'onglet Classpath. Ajoutez le dernier junit au classpath (dossier lib de ant). 

1
kgiannakakis

J'ai effectué une recherche dans le répertoire d'installation Eclipse à partir du niveau supérieur pour " hamcrest . Jar" (le caractère générique '*' situé autour de hamcrest n'apparaissant pas dans cet article Web). J'ai ensuite ajouté le fichier jar trouvé au chemin d'accès aux classes dans Ant build.xml. Fixé. 

1
Rolf

J'ai eu ce problème en essayant d'exécuter des tests junit à partir de Run -> Run As -> JUnit Test (J'ai vérifié, et j'ai le dernier plugin Junit (junit4_4.5.0) installé).

J'ai créé un nouveau répertoire (externalJars) dans le répertoire principal d'installation d'Eclipse et y ai téléchargé le dernier fichier Junit (4.8.1).

Ensuite, dans Eclipse, avec le projet sélectionné, j'ai modifié les fichiers jar dans le chemin de construction (Projet -> Propriétés -> Chemin de construction Java). Lorsque j'ai utilisé Junit pour la première fois, j'ai ajouté le fichier jar Junit du dossier plugin/org.junit4_4.5.0.v20090824. J'ai supprimé ce fichier .jar et j'ai ajouté externalJars/junit-4.8.1.jar (celui que je viens de télécharger) au chemin de génération en cliquant sur le bouton "Ajouter des fichiers externes".

hamcrest.org est une bibliothèque de "matchers". Vous pouvez trouver des informations à:

http://code.google.com/p/hamcrest/

Fournit une bibliothèque d'objets de correspondance (également appelés contraintes ou prédicats) permettant de définir de manière déclarative les règles de correspondance, à utiliser dans d'autres frameworks. Les scénarios typiques incluent des frameworks de test, des bibliothèques mocking et des règles de validation de l'interface utilisateur.

Hamcrest a été porté en Java, C++, Objective-C, Python et PhP.

Remarque: Hamcrest n'est pas une bibliothèque de tests: il se trouve que les appareils de correspondance sont très utiles pour les tests. 

1
Jay Elston

D'ACCORD. J'ai finalement travaillé autour de ce problème. Je ne dirai pas "résolu" car je suis encore assez confus quant à ce qui se passe. En tous cas...

J'ai téléchargé les derniers Ant (1.7.1) et JUnit (4.6) et les ai éclatés dans un répertoire externe - PAS dans l'espace de travail ou "in" Eclipse de quelque manière que ce soit.

Je suis ensuite allé dans Windows/Préférences/Ant/Runtime/Classpath/Entrées Ant Home et je tue toutes les valeurs existantes (par défaut). Je les ai remplacés par le contenu du répertoire Ant lib récemment téléchargé.

J'ai ensuite ajouté le junit.jar téléchargé dans Global Entries. Il contient les classes org.hamcrest, tout comme le junit.jar inclus avec Eclipse, donc je ne sais pas pourquoi c'est nécessaire, mais c'est le cas.

C'est tout. Ma tâche Junit dans le fichier de construction fonctionne parfaitement.

0
SteveT

JUnit 4.5 inclut Hamcrest dans son système d’appariement. Vous voudrez vous assurer que vous avez aussi ce fichier JAR sur votre chemin de classe

0
tddmonkey

J'ai eu un problème similaire que j'ai surmonté en plaçant une copie de "hamcrest-core-1.3.jar" dans le dossier\lib.

0
Venkat Rao

Dans Eclipse, cela se produit lorsque vous ajoutez le junit jar à l’aide du Properties->Libaries->Add External JARs...

Plutôt que d'utiliser Properties->Libaries->Add Library... qui vous permet de sélectionner Junit3 or Junit4 et ajoute automatiquement la bibliothèque hamcrest au chemin.

0
Iñaqui

Je ne pense pas qu'il soit nécessaire d'ajouter le fichier JUnit à votre classpath Ant. Au lieu de cela, vérifiez que vous avez la bibliothèque JUnit dans votre chemin de construction Java (Windows/Préférences/Java/Chemin de construction/Variables de chemin de classe).

0
akf