Ant + JUnit: NoClassDefFoundError
Ok, je suis frustré! J'ai chassé autour d'un bon nombre d'heures et je suis encore perplexe.
Environnement: WinXP, Eclipse Galileo 3.5 (directement à installer - aucun des plugins supplémentaires).
Donc, j'ai un simple test JUnit. Il fonctionne très bien, il est interne, Eclipse, JUnit configuration d'exécution. Cette classe n'a pas de dépendances sur quoi que ce soit. Pour limiter ce problème, autant que possible, il contient tout simplement:
@Test
public void testX() {
assertEquals("1", new Integer(1).toString());
}
Pas de soucis jusqu'à présent. Maintenant je veux profiter de la super avancé à l'étape de l'exécution de ce cas de test à partir de l'intérieur de la Fourmi (le but final est d'intégrer avec d'Hudson).
Donc, j'ai créer 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 la Java nom du projet dans l'espace de travail qui contient la source, de classes et de construire de fichier. Tous les .de java et de l'build.xml sont dans ${basedir}/src. L' .les fichiers de classe sont dans ${basedir}/bin.
J'ai ajouté eclipse-install-dir/plugins/org.junit4_4.5.0.v20090423/junit.jar à la Fourmi d'Exécution Classpath via Windows /Préférences /Ant /Runtime /a Contribué Entrées. ant-junit.jar est en Ant la Maison des Entrées.
Donc, ce qui se passe quand je lance cette incroyablement complexe cible? 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)
Qu'est-ce que ce org.hamcrest.SelfDescribing classe? Quelque chose à faire avec des objets fantaisie? OK, très bien. Mais pourquoi la dépendance? Je ne fais rien du tout avec elle. C'est littéralement un projet Java avec pas de dépendance, autres que JUnit.
Perplexe (et frustré)!!
- Dans mon cas, ce problème est venu quand il est déplacé d'un projet à partir de la version 1.6 de java pour java 1.5. Je ne sais pas si cela est important.
Vous devez vous connecter pour publier un commentaire.
J'ai téléchargé JUnit 4.7 et mettre junit-4.7.jar dans mon build path (au lieu de l'ancienne version). Que résolu. Je n'ai pas touch ant.
ajouter aussi hamcrest.jar pour vos tests classpath
cd lib
etwget http://repo2.maven.org/maven2/org/hamcrest/hamcrest-all/1.1/hamcrest-all-1.1.jar
pour quelqu'un d'autre qui a obtenu ici de GoogleJ'ai trouvé la raison à un problème identique, mais seulement lors de l'exécution de l'essai avec Ant sur la ligne de commande.
Vous pouvez exécuter Ant dans le mode de débogage (
ant -d
) et de regarder pour cette déclaration:Im mon cas, ce POT a été ajouté à la fin de mon classpath lors de l'exécution de l'essai et de l'emportait sur mon JUnit référence dans mon script Ant.
Il s'est avéré que mon installation de Ant est livré avec un ensemble de vieux JUnit libs. J'ai dû enlever le junit4.jar ci-dessus afin de faire mon Ant classpath ref prennent effet.
Confronté exactement au même problème dans eclipse, mais résolus en suivant les étapes indiquées
Voila... le problème est disparu..
J'ai eu le même problème et essayé de nombreuses façons de modifier le classpath. La solution la plus simple pour moi a été d'utiliser le paramètre fourche="no" à la junit cible. Semble comme Eclipse peut "automagiquement" faire mieux que moi...
J'ai eu le même problème avec jUnit 4.11, la Fourmi et le Lierre.
Ce code fonctionne pour moi, mais vous devez vous assurer que vous avez hamcrest-core-1.3.jar (pour jUnit 4.11) dans votre dossier lib.
J'ai ajouté hamcrest et junit fichiers jar pour java/lib/ext répertoire et qu'il a bien fonctionné pour moi.
La classe que vous êtes absent est inclus dans junit partir de la version 4.4 et sur (lien).
Vérifier si une version plus ancienne de jUnit est dans votre classpath. 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 probablement ant utilise un jUnit version antérieure à la version 4.4
Mise à jour:
Regarder la ANT_HOME dossier. Cliquez droit sur un build.xml fichier, sélectionnez le deuxième "Ant" à l'Exécuter en tant Qu'.. boîte de dialogue. Une boîte de dialogue pour l'édition de la fourmi exécuter la configuration de l'ouvrir (Il pourrait y avoir un moyen plus facile pour l'ouvrir). Aller dans le chemin de l'onglet. Ajouter le nouveau junit dans le classpath (dossier lib de fourmi).
J'ai cherché dans le répertoire d'installation d'Eclipse à partir du plus haut niveau pour les "hamcrest.jar" (le caractère générique '*' autour de hamcrest apparaît pas dans ce poste web). J'ai ensuite ajouté que l'on trouve le jar fichier dans le chemin de la Fourmi build.xml. Fixe.
J'ai eu ce problème en essayant d'exécuter junit tests à partir d'Exécuter -> Exécuter en tant Qu' -> Test JUnit
(J'ai vérifié, et j'ai la dernière junit plugin (junit4_4.5.0) installé).
J'ai créé un nouveau répertoire (externalJars) dans l'eclipse installation répertoire principal, téléchargé les plus récentes junit pot (4.8.1) il y a des.
Ensuite, à partir d'Eclipse, avec le projet choisi, j'ai modifié les fichiers jar dans le build path (Projet --> Propriétés - > Java Build Path). Quand j'ai d'abord essayé junit, j'ai ajouté la junit fichier jar du plugin/org.junit4_4.5.0.v20090824 dossier. J'ai supprimé ce fichier jar, et j'ai ajouté externalJars/junit-4.8.1.jar (celui que je viens de télécharger) pour la construction de chemin d'accès en cliquant sur "Add External Jars" bouton.
hamcrest.org est une bibliothèque de "rapprochement". Vous pouvez trouver des informations sur:
http://code.google.com/p/hamcrest/
Fournit une bibliothèque de matcher des objets (aussi connu comme des contraintes ou des prédicats) permettant 'match' de règles définies de manière déclarative, pour être utilisé dans d'autres cadres. Scénarios typiques incluent le test de cadres, en se moquant des bibliothèques de l'INTERFACE et de règles de validation.
Hamcrest a été porté à Java, C++, Objective-C, Python et PhP.
Remarque: Hamcrest ce n'est pas une bibliothèque de test: il se trouve simplement que les allumettes sont très utiles pour les tests.
JUnit 4.5 inclut Hamcrest dans le cadre de son système de correspondance. Vous voudrez vous assurer que vous avez ce fichier JAR sur votre classpath trop
Je ne pense pas que c'est nécessaire pour ajouter de la JUnit bocal à votre Ant classpath. Au lieu de cela, vérifiez que vous avez les JUnit bibliothèque dans votre Java Build Path (Windows/Préférences/Java/Build Path/chemin de classe Variables).
OK. J'ai finalement travaillé autour de cette question. Je ne dis pas "résolu" puisque je suis encore assez confus quant à ce qu'il se passe. De toute façon...
J'ai téléchargé la dernière Fourmi (1.7.1) et JUnit (4.6) et a explosé dans un répertoire externe - PAS dans l'espace de travail ou "dans" Eclipse en aucune façon.
Ensuite, je suis allé Windows /Préférences /Ant /Runtime /Classpath /Ant les Entrées de la Maison et de tuer tous les existants (par défaut) les valeurs. Je les ai remplacées par le contenu de la nouvellement téléchargé Ant répertoire lib.
J'ai ensuite ajouté le téléchargé junit.jar dans Global des Entrées. Il contient de l'org.hamcrest classes, tout comme les junit.jar inclus avec Eclipse, donc je ne sais pas pourquoi cela est nécessaire, mais il est.
Que c'est. Mon junit tâche dans le fichier build fonctionne parfaitement.
Dans eclipse, ce qui se passe quand vous ajoutez la junit bocal à l'aide de la
Properties->Libaries->Add External JARs...
Plutôt que d'utiliser
Properties->Libaries->Add Library...
qui vous permet de sélectionnerJunit3 or Junit4
et ajoute automatiquement le hamcrest bibliothèque le chemin.J'ai eu un problème similaire qui je surmonter en mettant une copie de "hamcrest-core-1.3.jar" en vertu de l' \lib dossier.