Maven 3 и JUnit 4 проблема компиляции: пакет org.junit не существует

Я пытаюсь построить простой проект Java с Maven. В моем pom-файле я объявляю JUnit 4.8.2 единственной зависимостью. Тем не менее Maven настаивает на использовании JUnit версии 3.8.1. Как это исправить?

проблема проявляется в сбое компиляции: "package org.junit не существует". Это связано с инструкцией import в моем исходном коде. Правильное имя пакета в JUnit 4.* is org.тесты JUnit.* в то время как в версии 3.* он является JUnit.рамки.*

думаю, я нашел документация по корню проблемы на http://maven.apache.org/plugins/maven-surefire-plugin/examples/junit.html но совет там, кажется, предназначен для экспертов Maven. Я не понимал, что делать.

15 ответов


@Dennis Roberts: Вы были абсолютно правы: мой тестовый класс находился в src/main/java. Также значение элемента " scope "в POM для JUnit было" test", хотя так и должно быть. Проблема заключалась в том, что я был небрежен при создании тестового класса в Eclipse, в результате чего он был создан в src/main/java вместо src/test/java. Это стало легче увидеть в представлении Project Explorer Eclipse после запуска "mvn eclipse: eclipse", но ваш комментарий сделал меня сначала посмотри. Спасибо.


просто получить ответ с полным решением, чтобы помочь посетителям:

все, что вам нужно сделать, это добавить зависимость junit в pom.xml. Не забудьте <scope>test</scope>

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>

моя проблема была внутри моей pom.xml У меня была строка <sourceDirectory>${basedir}/src</sourceDirectory> удаление этой строки заставило maven использовать обычные папки структуры, которые решают мою проблему


удаление тега области в pom.xml для junit работал..


Как вы объявили версию?

<version>4.8.2</version>

имейте в виду значение этого объясненного заявления здесь (см. Примечания):

при объявлении "нормальной" версии, такой как 3.8.2 для Junit, внутренне это представляется как "разрешить что-либо, но предпочитают 3.8.2."Это означает, что при обнаружении конфликта Maven может использовать алгоритмы конфликта для выбора лучшей версии. Если вы укажете [3.8.2], это означает, что будет использоваться только 3.8.2 и больше ничего.

для принудительного использования версии 4.8.2 попробуйте

<version>[4.8.2]</version>

поскольку у вас нет других зависимостей в вашем проекте, не должно быть никаких конфликтов, которые вызывают вашу проблему. Первое объявление должно работать для вас, если вы можете получить эту версию из репозитория. Вы наследуете зависимости от родительского pom?


У меня была та же проблема. Все, что я сделал с пом.xml-файл я удалил зависимость для junit 3.8 и добавил новую зависимость для junit 4.8. Затем я сделал Maven clean и Maven install. Это сработало. Чтобы проверить, после установки maven я пошел project - >properties-build path - >Maven dependencies и увидел, что теперь junit 3.8 jar ушел !, вместо junit 4.8 jar указан. круто!!. Теперь мой тест проходит как по волшебству.. Надеюсь, это как-то поможет..


добавьте эту зависимость в свой :

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>

у меня были мои файлы в правильных местах, и просто удаление <scope>test</scope> из записи зависимостей JUnit решена проблема (я использую JUnit 4.12). Я верю, что с test scope зависимость просто игнорировалась на этапе компиляции. Теперь все работает, даже когда я звоню mvn test.


мой случай был простой недосмотр.

Я поместил объявление зависимости JUnit внутри <dependencies> под <dependencyManagement/> узел вместо <project/> в файле POM. Правильный путь:

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

у меня была довольно похожая проблема в проекте "test-utils" (добавление функций, правил и утверждений в JUnit) дочернего родительского проекта, вводящего зависимости. Класс В зависимости от организации.тесты JUnit.пакет правил был в src / main / java.

поэтому я добавил зависимость от junit без тестовой области, и это решило проблему:

пом.xml проекта test-util:

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

пом.xml родительского проекта:

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

У меня была аналогичная проблема компиляции моего кода Eclipse, но Maven не удалось при компиляции тестов каждый раз, несмотря на то, что JUnit был в моем списке зависимостей, и тесты были в /src/test/java/.

в моем случае, у меня была неправильная версия JUnit в моем списке зависимостей. Я написал тесты JUnit4 (с аннотациями), но имел JUnit 3.8.X как моя зависимость. Между версии 3.8.x и 4 JUnit они изменили имя пакета с junit.основы орг.junit, который почему Maven все еще ломает компиляцию с помощью JUnit jar.

Я все еще не совсем уверен, почему Eclipse успешно скомпилирован. У него должна быть своя копия JUnit4 где-то в пути к классам. Надеюсь, это альтернативное решение будет полезно людям. Я достиг этого решения, следуя ссылке Артура выше.


Я также столкнулся с этой проблемой - я пытался вытащить объект из источника, и он работал в тестовом коде, но не в коде src. Для дальнейшего тестирования я скопировал блок кода из теста и опустил его в код src, а затем немедленно удалил строки JUnit, поэтому я просто знал, как тест втягивал объект. И вдруг мой код перестал компилироваться.
Проблема заключалась в том, что когда я сбросил код, Eclipse любезно разрешил все классы, поэтому у меня были вызовы JUnit из моего кода src, который был неправильным. Я должен был заметить предупреждения наверху о неиспользуемом импорте, но я забыл их увидеть.
Как только я удалил неиспользуемый импорт JUnit в моем src-файле, все сработало красиво.


меня тоже была такая же проблема, как показано ниже.

enter image description here

чтобы решить проблему, ниже строки добавляются в dependencies раздел в сборке уровня приложения.градля.

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

Gradle build затем сообщил следующее предупреждение.

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.

чтобы решить это предупреждение, следующий раздел добавляется к сборке уровне приложения.градля.

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

Найдите одно решение для этой ошибки, если у вас есть код в src/main / java Utils

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

по умолчанию maven просматривает эти папки для java и тестовых классов соответственно - src / main / java и src/test / java

когда src указан с тестовыми классами в source и областью для зависимости junit в pom.xml упоминается как test-org.устройство не будет найдено maven.