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

95

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

这个问题表现为编译失败:“package org.junit does not exist”。这是由于我的源代码中的导入语句导致的。在JUnit 4.*中正确的包名称是org.junit.*,而在版本3.*中它是junit.framework.*。

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


22
我之前没有使用过Maven 3,但是我的第一猜测是你的测试类位于src/main/java,而你的POM文件将JUnit定义为测试依赖项(即,“scope”元素的值为“test”)。不过,如果我没有看到你的POM文件或了解你的项目结构,我不能确定这一点。 - Sarah Roberts
2
Maven 不会强制要求使用 JUnit,但你必须自行决定是否需要使用它...这似乎是因为你没有将测试类放置在正确的位置 src/test/java 中...当然,pom 文件会非常有帮助。 - khmarbaise
17个回答

60

为了给访问者提供完整的解决方案,只需要将JUnit库添加到pom.xml。不要忘记<scope>test</scope>

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

2
是的,你使用的JUnit版本很重要。我将它从3.8.1升级到4.11,问题得到了解决。 - Mahsa2
将其从3.11更改为4.11后,它也可以工作,但我想知道这对于早期版本的JUnit是如何发生的。 - Tiina
对我来说不起作用。4.10、4.11、4.12和4.13都对我无效。 - undefined

49

@Dennis Roberts: 你说得对:我的测试类位于src/main/java中。此外,POM文件中JUnit的“scope”元素的值为“test”,虽然应该是这样的。问题在于,我在Eclipse中创建测试类时太懒惰了,结果创建在了src/main/java而不是src/test/java中。在运行“mvn eclipse:eclipse”后,在Eclipse的Project Explorer视图中更容易看到这一点,但是你的评论是让我最先看到它的原因。谢谢。


我将一些文件从测试(test)移动到主要(main),然后我的junit Assert开始抛出错误。删除<scope>test</scope>解决了这个问题。谢谢! - pMan
我将一个测试文件从主目录移动到测试目录。然后使用JUnit <scope>test</scope>成功编译Maven。非常感谢。 - eleforest
难以置信,我也遇到了同样的问题。由于 Jenkins 不关心我的 src/main 中的测试,所以我甚至没有注意到。 - Pieter De Bie

20
我的问题出在pom.xml文件的一行代码上,我原本有这个代码:<sourceDirectory>${basedir}/src</sourceDirectory>,删掉这一行后,Maven会使用普通结构的文件夹,从而解决了我的问题。

1
在我移除了<sourceDirectory>src<<sourceDirectory>之后,它对我起作用了。 - prashant thakre

13

在pom.xml文件中删除JUnit的作用域标记是有效的。


9
这个解决方案不好,因为现在你把Junit测试类放到了生产二进制文件中。 - avgvstvs

6

在您的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>

5
我遇到了同样的问题。我所做的是:从pom.xml文件中删除了junit 3.8的依赖项,并添加了一个新的junit 4.8的依赖项。然后我执行了maven clean和maven install命令。这样就解决了问题。为了验证,我在maven install之后进入项目->属性->构建路径->maven依赖项,并发现现在junit 3.8 jar已经消失了!取而代之的是junit 4.8 jar。太棒了!现在我的测试运行得很好。希望这能对你有所帮助。

是的,但是@FrVaBe的答案使得当你的同事获取你的代码(和pom.xml文件)时,他/她不必再次解决你的问题。它将会正确地工作。 - Russ Bateman

4

我的情况只是一个简单的疏忽。

我把JUnit依赖声明放在POM文件中<dependencyManagement/>节点下的<dependencies>中,而不是<project/>。正确的方法是:

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

4

我在一个名为“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>

4
你是如何声明版本的?
<version>4.8.2</version>

请注意这个声明所解释的含义,可以在此处(见NOTES)查看
当声明一个“正常”的版本(例如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>” 强制至少使用该版本,这样不是更好吗? - Joachim Sauer
3
@Joachim Sauer目前使用版本范围也可以解析SNAPSHOT版本(链接)-这是一个非常有争议的讨论,是否这是一个好的概念。如果您不介意获取SNAPSHOT版本,则您的建议是相当可用的。 - FrVaBe

4

我把文件放在正确的位置,只需要从JUnit依赖项中删除<scope>test</scope>就解决了问题(我使用的是JUnit 4.12)。我相信,使用test scope时,在编译阶段该依赖项被忽略了。现在即使我调用mvn test,一切都正常运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接