web-dev-qa-db-fra.com

Problème de compilation de Maven 3 et JUnit 4: le paquet org.junit n'existe pas

J'essaie de construire un projet Java simple avec Maven. Dans mon fichier pom, je déclare JUnit 4.8.2 comme seule dépendance. Toujours Maven insiste pour utiliser JUnit version 3.8.1. Comment je le répare?

Le problème se manifeste par un échec de compilation: "le package org.junit n'existe pas". Cela est dû à la déclaration d'importation dans mon code source. Le nom correct du paquet dans JUnit 4. * est org.junit. * Dans la version 3. * c'est junit.framework. *

Je pense avoir trouvé de la documentation sur la racine du problème sur http://maven.Apache.org/plugins/maven-surefire-plugin/examples/junit.html mais le conseil semble être destiné à Maven experts. Je n'ai pas compris quoi faire.

66
Arthur Huxley

@ Dennis Roberts: Vous aviez absolument raison: ma classe de test était située dans src/main/Java. La valeur de l'élément "scope" dans le POM pour JUnit était "test", bien que ce soit censé l'être. Le problème était que j'avais été bâclé lors de la création de la classe de test dans Eclipse, ce qui a entraîné sa création dans src/main/Java au lieu de src/test/Java. Cela est devenu plus facile à voir dans la vue Explorateur de projets d'Eclipse après avoir exécuté "mvn Eclipse: eclipse", mais votre commentaire est ce qui m'a fait le voir en premier. Merci.

39
Arthur Huxley

Juste pour avoir une réponse avec la solution complète pour aider les visiteurs:

Tout ce que vous devez faire est d’ajouter la dépendance Junit à pom.xml. N'oubliez pas le <scope>test</scope>

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>
42
Renato Lochetti

mon problème était une ligne dans mon pom.xml j'avais la ligne <sourceDirectory>${basedir}/src</sourceDirectory> en supprimant cette ligne faite maven utiliser des dossiers de structure régulière qui résout mon problème

16
oak

supprimer la balise scope dans pom.xml pour Junit a fonctionné.

14

Comment avez-vous déclaré la version?

<version>4.8.2</version>

Soyez conscient de la signification de cette déclaration expliquée ici (voir NOTES) :

Lors de la déclaration d'une version "normale" telle que 3.8.2 pour Junit, elle est représentée en interne par "autoriser tout, mais préfère 3.8.2". Cela signifie que lorsqu'un conflit est détecté, Maven est autorisé à utiliser les algorithmes de conflit pour choisir la meilleure version. Si vous spécifiez [3.8.2], cela signifie que seul 3.8.2 sera utilisé et rien d'autre. 

Pour forcer en utilisant la version 4.8.2, essayez

<version>[4.8.2]</version>

Comme vous n'avez pas d'autres dépendances dans votre projet, aucun conflit ne devrait causer votre problème. La première déclaration devrait fonctionner pour vous si vous pouvez obtenir cette version à partir d'un référentiel. Avez-vous hérité des dépendances d'un pom parent?

4
FrVaBe

J'ai eu le même problème. Tout ce que je faisais était - Du fichier pom.xml, j'ai supprimé la dépendance pour Junit 3.8 et ajouté une nouvelle dépendance pour Junit 4.8. Ensuite, j'ai installé Maven Clean et Maven. Ça a fait l'affaire. Pour vérifier, après l'installation de maven, je suis allé à projet-> properties-build path-> maven et j'ai constaté que le jar Junit 3.8 est parti! cool!!. Maintenant, mon test fonctionne comme un charme .. J'espère que cela aide en quelque sorte ..

3
Steer360

Ajoutez cette dépendance à votre fichier pom.xml:

http://mvnrepository.com/artifact/junit/junit-dep/4.8.2

<!-- https://mvnrepository.com/artifact/junit/junit-dep -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit-dep</artifactId>
    <version>4.8.2</version>
</dependency>
3
tokhi

Mes fichiers se trouvaient aux bons endroits et le simple fait de retirer <scope>test</scope> de l'entrée de dépendance JUnit a résolu le problème (j'utilise JUnit 4.12). Je crois qu'avec la portée test, la dépendance était simplement ignorée pendant la phase de compilation. Maintenant, tout fonctionne même lorsque j'appelle mvn test.

2
mljrg

Mon cas était un simple oubli.

J'ai placé la déclaration de dépendance JUnit dans <dependencies> sous le nœud <dependencyManagement/> au lieu de <project/> dans le fichier POM. Manière correcte est:

<project>
<!-- Other elements -->
    <dependencies>
    <!-- Other dependencies-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
    </dependencies>
<project>
2
White hawk

J'ai eu un problème assez similaire dans un projet "test-utils" (ajout de fonctionnalités, de règles et d'assertions à JUnit) enfant d'un projet parent injectant des dépendances . La classe dépendant du paquetage org.junit.rules était dans src/principal/Java.

J'ai donc ajouté une dépendance à Junit sans portée de test et le problème a été résolu:

pom.xml du projet test-util:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
</dependency>

pom.xml du projet parent:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <scope>test</scope>
</dependency>
2
Bludwarf

J'ai également rencontré ce problème - j'essayais d'extraire un objet d'une source et cela fonctionnait dans le code de test mais pas dans le code src. Pour approfondir le test, j'ai copié un bloc de code du test et l'ai déposé dans le code src, puis immédiatement supprimé les lignes JUnit afin que je sache comment le test extrayait l'objet. Puis, tout à coup, mon code n'a pas été compilé. 
Le problème était que lorsque j'ai déposé le code, Eclipse a utilement résolu toutes les classes, de sorte que les appels JUnit provenaient de mon code src, ce qui n’était pas correct. J'aurais dû remarquer les avertissements concernant les importations inutilisées, mais j'ai négligé de les voir. 
Une fois que j'ai supprimé les importations JUnit inutilisées dans mon fichier src, tout a fonctionné à merveille. 

1
LConrad

J’ai eu un problème similaire avec la compilation de mon code par Eclipse, mais Maven a échoué lors de la compilation des tests à chaque fois, alors que JUnit était dans ma liste de dépendances et que les tests étaient dans/src/test/Java /.

Dans mon cas, j’avais la mauvaise version de JUnit dans ma liste de dépendances. J'ai écrit des tests JUnit4 (avec des annotations) mais j'avais JUnit 3.8.x comme dépendance. Entre la version 3.8.x et la version 4 de JUnit, ils ont changé le nom du paquet de junit.framework en org.junit, raison pour laquelle Maven continue de compiler à l'aide d'un fichier jar JUnit.

Je ne suis toujours pas tout à fait sûr de savoir pourquoi Eclipse a été compilé avec succès. Il doit avoir sa propre copie de JUnit4 quelque part dans le classpath. J'espère que cette solution alternative est utile aux gens. J'ai atteint cette solution après avoir suivi le lien d'Arthur ci-dessus.

1
BrionS

Changer la version de Junit a corrigé cela pour moi. On dirait que la version 3.8.1 ne fonctionne pas dans mon cas. Problème résolu lors du passage à 4.12

0
Vamsi Vegesna

Moi aussi j'ai eu le même problème que celui montré ci-dessous.

 enter image description here

Pour résoudre le problème, les lignes ci-dessous sont ajoutées à la section dependencies dans le fichier build.gradle du niveau de l'application.

compile 'junit:junit:4.12'
androidTestCompile 'com.Android.support.test:runner:0.5'

Gradle build a ensuite signalé l'avertissement suivant. 

Warning:Conflict with dependency 'com.Android.support:support-annotations'. 
Resolved versions for app (25.1.0) and test app (23.1.1) differ. 
See http://g.co/androidstudio/app-test-app-conflict for details.

Pour résoudre cet avertissement, la section suivante est ajoutée au build.gradle du niveau de l'application.

configurations.all {
    resolutionStrategy {
        force 'com.Android.support:support-annotations:23.1.1'
    }
}
0
MNS

Trouvez la solution à cette erreur si vous avez du code dans src/main/Java Utils

<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.9.1</version>
</dependency>
0
hemraj chouhan