Problem z kompilacją Maven 3 i JUnit 4: pakiet org.junit nie istnieje

80

Próbuję zbudować prosty projekt Java za pomocą Maven. W moim pliku pom deklaruję JUnit 4.8.2 jako jedyną zależność. Wciąż Maven nalega na używanie JUnit w wersji 3.8.1. Jak to naprawić?

Problem objawia się niepowodzeniem kompilacji: „pakiet org.junit nie istnieje”. Dzieje się tak z powodu instrukcji importu w moim kodzie źródłowym. Prawidłowa nazwa pakietu w JUnit 4. * to org.junit. *, Natomiast w wersji 3. * to junit.framework. *

Wydaje mi się, że znalazłem dokumentację dotyczącą źródła problemu na http://maven.apache.org/plugins/maven-surefire-plugin/examples/junit.html, ale ta rada wydaje się być przeznaczona dla ekspertów Maven. Nie rozumiem, co mam robić.

Czy Husby
źródło
21
Nie pracowałem z Maven 3, ale moje pierwsze przypuszczenie byłoby takie, że twoja klasa testowa znajduje się w src / main / java, a twój POM definiuje junit jako zależność testową (to znaczy, że wartość elementu "scope" to "test ”). Nie mogę jednak powiedzieć na pewno bez zobaczenia twojego POM i znajomości struktury twojego projektu.
Sarah Roberts
2
Maven nie nalega na JUnit, że tym, który to robi, musi być ty ... wygląda na to, że nie umieściłeś swoich klas testowych we właściwej lokalizacji src / test / java ... i oczywiście pom byłby wyjątkowo pomocny.
khmarbaise

Odpowiedzi:

52

Wystarczy, że otrzymam odpowiedź z kompletnym rozwiązaniem, które pomoże odwiedzającym:

Wszystko, co musisz zrobić, to dodać zależność junit do pom.xml. Nie zapomnij o<scope>test</scope>

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>
Renato Lochetti
źródło
1
Tak, wersja twojej junit ma znaczenie. Zaktualizowałem go z 3.8.1 do 4.11 i to rozwiązało mój problem.
Mahsa2,
zmienił go z 3.11 na 4.11 i to też działa, ale zastanawiam się, jak to się stało z wcześniejszą wersją junit.
Tiina
45

@Dennis Roberts: Miałeś absolutną rację: moja klasa testowa znajdowała się w src / main / java. Również wartością elementu „scope” w POM dla JUnit była wartość „test”, chociaż tak powinno być. Problem polegał na tym, że byłem niechlujny podczas tworzenia klasy testowej w Eclipse, co spowodowało, że została utworzona w src / main / java zamiast src / test / java. Stało się to łatwiejsze do zobaczenia w widoku Eksploratora projektów Eclipse po uruchomieniu „mvn eclipse: eclipse”, ale Twój komentarz sprawił, że zobaczyłem go jako pierwszy. Dzięki.

Czy Husby
źródło
Przeniosłem niektóre pliki z testu do głównego i mój junit Assert zaczął zgłaszać błąd. Usunięcie <scope> testu </scope> rozwiązało problem. Dzięki!
pMan
przeniosłem jeden plik testowy z głównego do testowego. Następnie kompilacja Maven zakończyła się sukcesem za pomocą junit <scope> test </scope>.
Wielkie
Niewiarygodne, miałem ten sam problem. A ponieważ Jenkins nie przejmował się moim testem w src / main, nawet tego nie zauważyłem.
Pieter De Bie,
19

mój problem był wiersz w moim pom.xmlmiałem linię <sourceDirectory>${basedir}/src</sourceDirectory>usunięcie tej linii sprawiło Maven regularne foldery strukturę, która rozwiązuje mój problem

dąb
źródło
1
Działa dla mnie po usunięciu <sourceDirectory> src <<sourceDirectory> działa
prashant thakre
12

usunięcie tagu zakresu w pom.xml dla junit zadziałało.

Manishankar Parameswaran
źródło
4
To rozwiązanie jest złe, ponieważ teraz wysyłasz swoje klasy testowe junit do pliku binarnego prod.
avgvstvs
5

Miałem ten sam problem. Wszystko, co zrobiłem, to - z pliku pom.xml usunąłem zależność dla junit 3.8 i dodałem nową zależność dla junit 4.8. Potem zrobiłem Maven Clean i Maven Install. To załatwiło sprawę. Aby to sprawdzić, po instalacji mavena przeszedłem project-> properties-build path-> maven dependencies i zobaczyłem, że teraz junit 3.8 jar zniknął!, Zamiast tego pojawia się junit 4.8 jar. fajne!!. Teraz mój test działa jak urok .. Mam nadzieję, że to jakoś pomoże ..

Steer360
źródło
Tak, ale odpowiedź @ FrVaBe sprawia, że ​​kiedy kolega otrzyma Twój kod (i Twój pom.xml), nie będzie musiał od nowa wymyślać rozwiązania. Po prostu będzie działać poprawnie.
Russ Bateman
5

Dodaj tę zależność do swojego pom.xmlpliku:

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>
tokhi
źródło
4

Mój przypadek był prostym przeoczeniem.

Włożyłem zależności JUnit deklaracji wnętrze <dependencies>pod <dependencyManagement/>węzłem zamiast <project/>w pliku POM. Prawidłowy sposób to:

<project>
<!-- Other elements -->
    <dependencies>
    <!-- Other dependencies-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
    </dependencies>
<project>
Biały jastrząb
źródło
4

Jak zadeklarowałeś wersję?

<version>4.8.2</version>

Bądź świadomy znaczenia tej deklaracji wyjaśnionej tutaj (patrz UWAGI) :

Podczas deklarowania „normalnej” wersji, takiej jak 3.8.2 dla Junit, wewnętrznie jest to reprezentowane jako „zezwalaj na wszystko, ale preferuj 3.8.2”. Oznacza to, że w przypadku wykrycia konfliktu Maven może użyć algorytmów konfliktu, aby wybrać najlepszą wersję. Jeśli podasz [3.8.2], oznacza to, że zostanie użyty tylko 3.8.2 i nic więcej.

Aby wymusić użycie wersji 4.8.2 spróbuj

<version>[4.8.2]</version>

Ponieważ nie masz żadnych innych zależności w swoim projekcie, nie powinno być żadnych konfliktów, które powodują Twój problem. Pierwsza deklaracja powinna zadziałać, jeśli możesz pobrać tę wersję z repozytorium. Czy dziedziczysz zależności od rodzica pom?

FrVaBe
źródło
1
Czy nie <version>[4.8.2,)</version>byłoby lepiej wymusić przynajmniej tę wersję?
Joachim Sauer
3
@Joachim Sauer Używanie zakresów wersji obecnie rozwiązuje również wersje SNAPSHOT ( link ) - i jest to bardzo kontrowersyjne omawiane, czy to dobra koncepcja. Jeśli nie masz nic przeciwko uzyskaniu wersji SNAPSHOT, Twoja sugestia jest całkiem użyteczna.
FrVaBe
3

Moje pliki znajdowały się we właściwych miejscach i samo usunięcie <scope>test</scope>z wpisu zależności JUnit rozwiązało problem (używam JUnit 4.12). Uważam, że w przypadku testzakresu zależność była po prostu ignorowana podczas fazy kompilacji. Teraz wszystko działa, nawet gdy dzwonię mvn test.

mljrg
źródło
3

Miałem dość podobny problem w projekcie "test-utils" (dodawanie funkcji, reguł i asercji do JUnit) potomkiem projektu nadrzędnego wstrzykującego zależności. Klasa zależna od pakietu org.junit.rules znajdowała się w katalogu src / main / java.

Dodałem więc zależność od junit bez zakresu testowego i rozwiązałem problem:

pom.xml projektu test-util:

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

pom.xml projektu nadrzędnego:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <scope>test</scope>
</dependency>
Bludwarf
źródło
1

Miałem podobny problem z Eclipse kompilacją mojego kodu, ale Maven zawiódł podczas kompilowania testów za każdym razem, mimo że JUnit był na mojej liście zależności, a testy były w / src / test / java /.

W moim przypadku na mojej liście zależności miałem złą wersję JUnit. Napisałem testy JUnit4 (z adnotacjami), ale miałem JUnit 3.8.x jako moją zależność. Pomiędzy wersją 3.8.x a 4 JUnit zmienili nazwę pakietu z junit.framework na org.junit, dlatego Maven wciąż przerywa kompilację przy użyciu JUnit jar.

Nadal nie jestem do końca pewien, dlaczego Eclipse zostało pomyślnie skompilowane. Musi mieć swoją własną kopię JUnit4 gdzieś w ścieżce klas. Mam nadzieję, że to alternatywne rozwiązanie jest przydatne dla ludzi. Dotarłem do tego rozwiązania po skorzystaniu z linku Arthura powyżej.

BrionS
źródło
1

Napotkałem również ten problem - próbowałem pobrać obiekt ze źródła i działał on w kodzie testowym, ale nie w kodzie źródłowym. Aby dalej testować, skopiowałem blok kodu z testu i wrzuciłem go do kodu src, a następnie natychmiast usunąłem wiersze JUnit, więc po prostu miałem jak test wciąga obiekt. Wtedy nagle mój kod nie mógł się skompilować.
Problem polegał na tym, że kiedy upuściłem kod, Eclipse pomogło rozwiązać wszystkie klasy, więc miałem wywołania JUnit pochodzące z mojego kodu src, co nie było właściwe. Powinienem był zauważyć ostrzeżenia u góry o niewykorzystanym imporcie, ale ich nie widziałem.
Po usunięciu nieużywanych importów JUnit z mojego pliku src wszystko działało pięknie.

LConrad
źródło
1

Ja też miałem ten sam problem, jak pokazano poniżej.

wprowadź opis obrazu tutaj

Aby rozwiązać ten problem, poniższe wiersze zostały dodane do dependenciessekcji w pliku build.gradle na poziomie aplikacji.

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

Kompilacja Gradle zgłosiła następujące ostrzeżenie.

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.

Aby rozwiązać to ostrzeżenie, do pliku build.gradle na poziomie aplikacji dodano następującą sekcję.

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-annotations:23.1.1'
    }
}
MNS
źródło
0

Znajdź jedno rozwiązanie tego błędu, jeśli masz kod w src / main / java Utils

<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.9.1</version>
</dependency>
hemraj chouhan
źródło
0

Zmiana wersji junit rozwiązała ten problem. Wygląda na to, że wersja 3.8.1 nie działała w moim przypadku. Problem rozwiązany po zmianie na 4.12

Vamsi Vegesna
źródło
-1

Domyślnie maven przegląda te foldery odpowiednio pod kątem klas java i testowych - src / main / java i src / test / java

Gdy src jest określony z klasami testowymi w źródle, a zakres zależności junit w pom.xml jest określony jako test - maven nie znajdzie org.unit.

abhimanyu.varma
źródło