Kompilierungsproblem von Maven 3 und JUnit 4: Paket org.junit existiert nicht

80

Ich versuche mit Maven ein einfaches Java-Projekt zu erstellen. In meiner POM-Datei deklariere ich JUnit 4.8.2 als einzige Abhängigkeit. Trotzdem besteht Maven darauf, JUnit Version 3.8.1 zu verwenden. Wie behebe ich das?

Das Problem äußert sich in einem Kompilierungsfehler: "Paket org.junit existiert nicht". Dies liegt an der Importanweisung in meinem Quellcode. Der korrekte Paketname in JUnit 4. * lautet org.junit. * In Version 3. * ist es junit.framework. *

Ich glaube, ich habe unter http://maven.apache.org/plugins/maven-surefire-plugin/examples/junit.html eine Dokumentation zur Wurzel des Problems gefunden, aber der Rat dort scheint für Maven-Experten gedacht zu sein. Ich habe nicht verstanden, was ich tun soll.

Sind Husby
quelle
21
Ich habe nicht mit Maven 3 gearbeitet, aber meine erste Vermutung wäre, dass sich Ihre Testklasse in src / main / java befindet und Ihr POM junit als Testabhängigkeit definiert (dh der Wert des Elements "scope" ist "test" "). Ich kann es nicht mit Sicherheit sagen, ohne Ihren POM zu sehen und die Struktur Ihres Projekts zu kennen.
Sarah Roberts
2
Maven besteht nicht auf JUnit, dass einer, der es tut, Sie sein muss ... es hört sich so an, als hätten Sie Ihre Testklassen nicht an der richtigen Stelle src / test / java gefunden ... und natürlich wäre der Pom äußerst hilfreich.
Khmarbaise

Antworten:

52

Nur um eine Antwort mit der Komplettlösung zu haben, die den Besuchern hilft:

Sie müssen lediglich die Junit-Abhängigkeit hinzufügen pom.xml. Vergiss das nicht<scope>test</scope>

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>
Renato Lochetti
quelle
1
Ja, die Version Ihres Junits ist wichtig. Ich habe es von 3.8.1 auf 4.11 aktualisiert und mein Problem behoben.
Mahsa2
hat es von 3.11 auf 4.11 geändert und es funktioniert auch, aber ich frage mich, wie das für die frühere Version junit passiert ist.
Tiina
45

@ Tennis Roberts: Sie hatten absolut Recht: Meine Testklasse befand sich in src / main / java. Auch der Wert des Elements "scope" im POM für JUnit war "test", obwohl es so sein soll. Das Problem war, dass ich beim Erstellen der Testklasse in Eclipse schlampig war, was dazu führte, dass sie in src / main / java insted von src / test / java erstellt wurde. Dies wurde in der Projekt-Explorer-Ansicht von Eclipse nach dem Ausführen von "mvn eclipse: eclipse" einfacher zu sehen, aber Ihr Kommentar hat mich dazu gebracht, es zuerst zu sehen. Vielen Dank.

Sind Husby
quelle
Ich habe einige Dateien von Test nach Main verschoben, und mein Junit Assert hat einen Fehler ausgelöst. Das Löschen des <scope> -Tests </ scope> hat das Problem behoben. Danke!
pMan
Ich habe eine Testdatei von main nach test verschoben. Dann kompilieren Sie maven erfolgreich mit junit <scope> test </ scope>. Vielen Dank
eleforest
Unglaublich, ich hatte das gleiche Problem. Und da Jenkins sich nicht um meinen Test in src / main kümmerte, bemerkte ich es nicht einmal.
Pieter De Bie
18

Mein Problem war eine Zeile in meiner. pom.xmlIch hatte die Zeile <sourceDirectory>${basedir}/src</sourceDirectory>, die diese Zeile entfernte, damit Maven reguläre Strukturordner verwendet, die mein Problem lösen

Eiche
quelle
1
Es funktioniert für mich, nachdem <sourceDirectory> src << sourceDirectory> entfernt wurde. Es funktioniert
prashant thakre
12

Das Entfernen des Scope-Tags in pom.xml für junit hat funktioniert.

Manishankar Parameswaran
quelle
4
Diese Lösung ist schlecht, weil Sie jetzt Ihre Junit-Testklassen in Ihre Prod-Binärdatei senden.
avgvstvs
4

Ich hatte das gleiche Problem. Alles was ich getan habe war - Aus der Datei pom.xml habe ich die Abhängigkeit für junit 3.8 gelöscht und eine neue Abhängigkeit für junit 4.8 hinzugefügt. Dann habe ich Maven sauber gemacht und Maven installiert. Es hat den Trick gemacht. Um zu überprüfen, ging ich nach der Installation von maven zu project-> properties-build path-> maven dependencies und sah, dass jetzt das junit 3.8 jar weg ist! Stattdessen wird junit 4.8 jar aufgelistet. cool!!. Jetzt läuft mein Test wie ein Zauber. Hoffe das hilft irgendwie ..

Steer360
quelle
Ja, aber die Antwort von @ FrVaBe macht es so, dass Ihr Kollege, wenn er Ihren Code (und Ihre pom.xml) erhält, Ihre Lösung nicht noch einmal herausfinden muss. Es wird einfach richtig funktionieren.
Russ Bateman
4

Mein Fall war ein einfaches Versehen.

Ich habe die JUnit-Abhängigkeitsdeklaration nicht in der POM-Datei, sondern <dependencies>unter dem <dependencyManagement/>Knoten <project/>abgelegt. Der richtige Weg ist:

<project>
<!-- Other elements -->
    <dependencies>
    <!-- Other dependencies-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
    </dependencies>
<project>
Weißer Falke
quelle
4

Wie haben Sie die Version deklariert?

<version>4.8.2</version>

Beachten Sie die Bedeutung dieser hier erläuterten Erklärung (siehe ANMERKUNGEN) :

Wenn Sie eine "normale" Version wie 3.8.2 für Junit deklarieren, wird dies intern als "alles zulassen, aber 3.8.2 bevorzugen" dargestellt. Dies bedeutet, dass Maven bei Erkennung eines Konflikts die Konfliktalgorithmen verwenden darf, um die beste Version auszuwählen. Wenn Sie [3.8.2] angeben, bedeutet dies, dass nur 3.8.2 verwendet wird und sonst nichts.

Um die Verwendung der Version 4.8.2 zu erzwingen, versuchen Sie es

<version>[4.8.2]</version>

Da Sie keine anderen Abhängigkeiten in Ihrem Projekt haben, sollten keine Konflikte auftreten, die Ihr Problem verursachen. Die erste Deklaration sollte für Sie funktionieren, wenn Sie diese Version aus einem Repository abrufen können. Erben Sie Abhängigkeiten von einem übergeordneten POM?

FrVaBe
quelle
1
Wäre es nicht <version>[4.8.2,)</version>besser, zumindest diese Version zu erzwingen ?
Joachim Sauer
3
@Joachim Sauer Durch die Verwendung von Versionsbereichen werden derzeit auch SNAPSHOT-Versionen ( Link ) aufgelöst - und es wird sehr kontrovers diskutiert, ob dies ein gutes Konzept ist. Wenn es Ihnen nichts ausmacht, eine SNAPSHOT-Version zu erhalten, ist Ihr Vorschlag durchaus brauchbar.
FrVaBe
3

Ich hatte meine Dateien an den richtigen Stellen und nur das Entfernen <scope>test</scope>aus dem JUnit-Abhängigkeitseintrag löste das Problem (ich verwende JUnit 4.12). Ich glaube, dass mit dem testUmfang die Abhängigkeit während der Kompilierungsphase einfach ignoriert wurde. Jetzt funktioniert alles auch wenn ich anrufe mvn test.

mljrg
quelle
3

Ich hatte ein ziemlich ähnliches Problem in einem "Test-Utils" -Projekt (Hinzufügen von Funktionen, Regeln und Zusicherungen zu JUnit), einem Kind eines übergeordneten Projekts, das Abhängigkeiten injiziert. Die Klasse, die vom Paket org.junit.rules abhängt, befand sich in src / main / java.

Also habe ich eine Abhängigkeit von junit ohne Testumfang hinzugefügt und das Problem gelöst:

pom.xml des Test-Util-Projekts:

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

pom.xml des übergeordneten Projekts:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <scope>test</scope>
</dependency>
Bludwarf
quelle
1

Ich hatte ein ähnliches Problem damit, dass Eclipse meinen Code gut kompilierte, aber Maven schlug beim Kompilieren der Tests jedes Mal fehl, obwohl JUnit in meiner Abhängigkeitsliste enthalten war und sich die Tests in / src / test / java / befanden.

In meinem Fall hatte ich die falsche Version von JUnit in meiner Abhängigkeitsliste. Ich habe JUnit4-Tests (mit Anmerkungen) geschrieben, aber JUnit 3.8.x als meine Abhängigkeit. Zwischen Version 3.8.x und 4 von JUnit wurde der Paketname von junit.framework in org.junit geändert, weshalb Maven das Kompilieren mit einem JUnit-JAR immer noch unterbricht.

Ich bin mir immer noch nicht ganz sicher, warum Eclipse erfolgreich kompiliert wurde. Es muss irgendwo im Klassenpfad eine eigene Kopie von JUnit4 haben. Hoffe, diese alternative Lösung ist nützlich für die Menschen. Ich habe diese Lösung erreicht, nachdem ich dem obigen Link von Arthur gefolgt bin.

BrionS
quelle
1

Ich bin auch auf dieses Problem gestoßen - ich habe versucht, ein Objekt aus einer Quelle abzurufen, und es funktionierte im Testcode, aber nicht im Quellcode. Zum weiteren Testen habe ich einen Codeblock aus dem Test kopiert und in den Quellcode eingefügt. Dann habe ich sofort die JUnit-Zeilen entfernt, sodass ich nur wusste, wie der Test das Objekt hineingezogen hat. Dann würde mein Code plötzlich nicht mehr kompiliert.
Das Problem war, dass Eclipse, als ich den Code ablegte, alle Klassen hilfreich auflöste, sodass ich JUnit-Aufrufe von meinem src-Code bekam, was nicht richtig war. Ich hätte die Warnungen oben über nicht verwendete Importe bemerken sollen, aber ich habe es versäumt, sie zu sehen.
Nachdem ich die nicht verwendeten JUnit-Importe in meiner src-Datei entfernt hatte, funktionierte alles wunderbar.

LConrad
quelle
1

Auch ich hatte das gleiche Problem wie unten gezeigt.

Geben Sie hier die Bildbeschreibung ein

Um das Problem zu beheben, werden die folgenden Zeilen zum dependenciesAbschnitt in build.gradle auf App-Ebene hinzugefügt.

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

Gradle Build wurde dann nach der Warnung gemeldet.

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.

Um diese Warnung zu beheben, wird der folgenden Abschnitt zur App-Ebene build.gradle hinzugefügt.

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

Finden Sie die eine Lösung für diesen Fehler, wenn Sie Code in src / main / java Utils haben

<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.9.1</version>
</dependency>
Hemraj Chouhan
quelle
0

Das Ändern der Junit-Version hat dies für mich behoben. Scheint, als hätte Version 3.8.1 in meinem Fall nicht funktioniert. Problem beim Ändern auf 4.12 behoben

Vamsi Vegesna
quelle
-1

Standardmäßig durchsucht maven diese Ordner nach Java- bzw. Testklassen - src / main / java und src / test / java

Wenn der src mit den Testklassen unter source angegeben wird und der Bereich für die Junit-Abhängigkeit in pom.xml als test angegeben wird, wird org.unit von maven nicht gefunden.

abhimanyu.varma
quelle