Maven 3和JUnit 4编译问题:包org.junit不存在


80

我正在尝试使用Maven构建一个简单的Java项目。在我的pom文件中,我将JUnit 4.8.2声明为唯一依赖项。Maven仍然坚持使用JUnit版本3.8.1。我如何解决它?

该问题表现为编译失败:“软件包org.junit不存在”。这是由于我的源代码中的import语句。JUnit 4. *中正确的软件包名称是org.junit。*,而在版本3. *中正确的软件包名称是junit.framework。*

我想我已经在http://maven.apache.org/plugins/maven-surefire-plugin/examples/junit.html上找到了有关问题根源的文档,但该建议似乎是针对Maven专家的。我不知道该怎么办。


21
我还没有使用过Maven 3,但是我的第一个猜测是您的测试类位于src / main / java中,并且您的POM将junit定义为测试依赖项(也就是说,“ scope”元素的值为“ test ”)。不过,我不能肯定地说不看您的POM并知道您的项目的结构。
莎拉·罗伯茨

2
Maven并没有坚持要求JUnit一定是您本人...听起来您没有将Test类定位到src / test / java的正确位置中……当然pom会非常有用。
khmarbaise

Answers:


52

只需提供完整的解决方案来帮助访客的答案:

您需要做的就是将junit依赖项添加到中pom.xml。别忘了<scope>test</scope>

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

1
是的,您的junit的版本很重要。我将其从3.8.1升级到4.11,它解决了我的问题。
Mahsa2 '02

将其从3.11更改为4.11,它也可以工作,但是我想知道早期版本的junit会如何发生。
Tiina

45

@丹尼斯·罗伯茨(Dennis Roberts):您绝对正确:我的测试类位于src / main / java。同样,在JOM的POM中,“ scope”元素的值也是“ test”,尽管这应该是这样。问题是我在Eclipse中创建测试类时马虎,导致在src / test / java中创建的src / main / java中创建了它。运行“ mvn eclipse:eclipse”后,这在Eclipse的Project Explorer视图中变得更容易看到,但是您的评论才使我首先看到了它。谢谢。


我将一些文件从测试移到了主文件,我的junit Assert开始引发错误。删除<scope> test </ scope>可以解决此问题。谢谢!
pMan 2012年

我将一个Test文件从main移到了test。然后,maven使用junit <scope> test </ scope>编译成功。非常感谢
eleforest

令人难以置信,我遇到了同样的问题。而且由于Jenkins并不关心我在src / main中的测试,所以我什至没有注意到。
Pieter De Bie 2015年

18

我的问题是在我的一条线pom.xml,我有行<sourceDirectory>${basedir}/src</sourceDirectory>删除此行作了Maven的使用规则结构的文件夹它解决了我的问题


1
在删除<sourceDirectory> src << sourceDirectory>正常工作后,它为我工作
令人生厌的thakre 2015年



4

我有同样的问题。我所做的只是-从pom.xml文件中删除了junit 3.8的依赖关系,并添加了junit 4.8的新依赖关系。然后我做了Maven清理和Maven安装。它成功了。为了验证,在安装maven之后,我去了project-> properties-build path-> maven依赖项,发现现在junit 3.8 jar消失了,而是列出了junit 4.8 jar。凉!!。现在,我的测试就像一个魅力一样运行。希望这会有所帮助。


是的,但是@FrVaBe的回答是这样的,因此,当您的同事获取您的代码(和pom.xml)时,他/她将不必重新找出您的解决方案。它将正常工作。
Russ Bateman

4

我的案子是一个简单的疏忽。

我把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>

4

您如何声明版本的?

<version>4.8.2</version>

请注意此处说明的声明的含义(请参阅“注释”)

当声明“正常”版本(如Junit的3.8.2)时,在内部将其表示为“允许任何内容,但更喜欢3.8.2”。这意味着当检测到冲突时,允许Maven使用冲突算法来选择最佳版本。如果指定[3.8.2],则意味着将仅使用3.8.2,而不会使用其他任何内容。

强制使用4.8.2版本尝试

<version>[4.8.2]</version>

由于您的项目中没有任何其他依赖项,因此不应有任何引起问题的冲突。如果您能够从存储库中获得此​​版本,则第一个声明应该对您有用。您是否从父pom继承依赖项?


1
那岂不<version>[4.8.2,)</version>是更好力至少那个版本?
约阿希姆·绍尔

3
@Joachim Sauer当前使用版本范围还可以解决SNAPSHOT版本(链接)-如果这是一个好概念,则存在很大争议。如果您不介意获得SNAPSHOT版本,则您的建议非常有用。
FrVaBe

3

我将文件放在正确的位置,只是<scope>test</scope>从JUnit依赖项中删除就解决了这个问题(我正在使用JUnit 4.12)。我相信,有了test范围,依赖关系在编译阶段就被忽略了。现在,即使我打电话,一切都正常mvn test


2

在一个注入依赖项的父项目的“ test-utils”项目(向JUnit添加功能,规则和断言)中,我遇到了一个非常类似的问题。取决于org.junit.rules包的类位于src / main / java中。

所以我在没有测试范围的情况下添加了对junit的依赖,它解决了这个问题:

test-util项目的pom.xml:

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

父项目的pom.xml:

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

1

我有一个类似的问题,就是Eclipse可以很好地编译我的代码,但是每次编译测试时Maven都失败了,尽管事实是JUnit在我的依赖列表中,而测试在/ src / test / java /中。

就我而言,我的依赖项列表中的JUnit版本错误。我编写了JUnit4测试(带有批注),但将JUnit 3.8.x作为我的依赖项。在3.8.x版本和JUnit 4之间,他们将软件包名称从junit.framework更改为org.junit,这就是为什么Maven仍然中断使用JUnit jar进行编译的原因。

我仍然不确定为什么Eclipse成功编译。它必须在类路径中的某处具有自己的JUnit4副本。希望这种替代解决方案对人们有用。我按照上面的Arthur的链接完成此解决方案。


1

我也遇到了这个问题-我试图从源中提取一个对象,并且该对象在测试代码中有效,但在src代码中无效。为了进行进一步的测试,我从测试中复制了一部分代码并将其放入src代码中,然后立即删除了JUnit行,因此我掌握了测试如何拉入对象。然后突然我的代码无法编译。
问题是,当我放下代码时,Eclipse会有效地解析所有类,因此我有来自我的src代码的JUnit调用,这是不合适的。我应该已经在顶部注意到了有关未使用进口的警告,但我却忽略了它们。
一旦删除了我的src文件中未使用的JUnit导入,所有这些都可以很好地工作。


1

我也有如下所示的相同问题。

在此处输入图片说明

要解决此问题,dependencies将以下行添加到应用程序级别build.gradle中的部分。

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

然后,Gradle构建报告了以下警告。

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.

为解决此警告,将以下部分添加到应用程序级别build.gradle中。

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

0

如果您在src / main / java Utils中有代码,请找到一种解决此错误的方法

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


-1

默认情况下,maven分别在这些文件夹中查找java和test类-src / main / java和src / test / java

当在source下的测试类中指定src时,将pom.xml中junit依赖项的范围称为test-maven将找不到org.unit。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.