Maven 3 和 JUnit 4 编译问题:包 org.junit 不存在
Posted
技术标签:
【中文标题】Maven 3 和 JUnit 4 编译问题:包 org.junit 不存在【英文标题】:Maven 3 and JUnit 4 compilation problem: package org.junit does not exist 【发布时间】:2011-08-16 07:15:57 【问题描述】:我正在尝试使用 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 专家的。我不明白该怎么做。
【问题讨论】:
我没有使用过 Maven 3,但我的第一个猜测是您的测试类在 src/main/java 中,并且您的 POM 将 junit 定义为测试依赖项(即“范围”元素是“测试”)。不过,如果不查看您的 POM 并了解您的项目结构,我无法确定。 Maven 并不坚持 JUnit 必须是你……听起来你没有将测试类定位到正确的位置 src/test/java ……当然pom 会非常有帮助。 【参考方案1】:只是为了帮助访问者获得完整解决方案的答案:
您需要做的就是将 junit 依赖项添加到 pom.xml
。不要忘记<scope>test</scope>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
【讨论】:
是的,您的 junit 版本很重要。我将它从 3.8.1 升级到 4.11,它解决了我的问题。 将它从 3.11 更改为 4.11,它也可以工作,但我想知道早期版本的 junit 是如何发生的。【参考方案2】:@Dennis Roberts:你完全正确:我的测试类位于 src/main/java。 JUnit 的 POM 中“范围”元素的值也是“测试”,尽管它应该是这样的。问题是我在 Eclipse 中创建测试类时很草率,导致它被创建在 src/main/java 的 src/test/java 中。运行“mvn eclipse:eclipse”后,这在 Eclipse 的 Project Explorer 视图中变得更容易看到,但您的评论让我首先看到它。谢谢。
【讨论】:
我将一些文件从 test 移动到 main,我的 junit Assert 开始抛出错误。删除我的问题是我的pom.xml
中的一行我有一行<sourceDirectory>$basedir/src</sourceDirectory>
删除此行使 maven 使用常规结构文件夹来解决我的问题
【讨论】:
它在删除删除 pom.xml 中 junit 的作用域标签有效..
【讨论】:
这个解决方案很糟糕,因为现在您将 junit 测试类发送到您的 prod 二进制文件中。【参考方案5】:我遇到了同样的问题。我所做的只是 - 从 pom.xml 文件中,我删除了 junit 3.8 的依赖项,并为 junit 4.8 添加了一个新的依赖项。然后我做了 maven clean 和 maven install。它成功了。为了验证,在 maven install 之后,我去了 project->properties-build path->maven dependencies,看到现在 junit 3.8 jar 不见了!,而是列出了 junit 4.8 jar。凉爽的!!。现在我的测试运行起来就像一个魅力..希望这会有所帮助..
【讨论】:
是的,但是@FrVaBe 的回答使得当您的同事获得您的代码(和您的 pom.xml)时,他/她不必重新找出您的解决方案。它会正常工作。【参考方案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>
【讨论】:
【参考方案7】:我的情况是一个简单的疏忽。
我将 JUnit 依赖声明放在 <dependencyManagement/>
节点下的 <dependencies>
中,而不是 POM 文件中的 <project/>
。正确的做法是:
<project>
<!-- Other elements -->
<dependencies>
<!-- Other dependencies-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
<project>
【讨论】:
【参考方案8】:你是如何声明版本的?
<version>4.8.2</version>
请注意此声明中解释的含义here (see NOTES):
当为 Junit 声明“正常”版本(例如 3.8.2)时,在内部这表示为“允许任何内容,但更喜欢 3.8.2”。这意味着当检测到冲突时,允许 Maven 使用冲突算法来选择最佳版本。如果指定[3.8.2],则表示只使用3.8.2,不使用其他。
要强制使用4.8.2版本试试
<version>[4.8.2]</version>
由于您的项目中没有任何其他依赖项,因此不应该有任何冲突导致您的问题。如果您能够从存储库中获取此版本,则第一个声明应该适合您。您是否从父 pom 继承依赖项?
【讨论】:
<version>[4.8.2,)</version>
强制至少那个版本不是更好吗?
@Joachim Sauer 使用版本范围目前也可以解决 SNAPSHOT 版本 (link) - 如果这是一个好概念,这是非常有争议的讨论。如果您不介意获得 SNAPSHOT 版本,您的建议非常有用。【参考方案9】:
我的文件位于正确的位置,只需从 JUnit 依赖项中删除 <scope>test</scope>
即可解决问题(我使用的是 JUnit 4.12)。我相信在test
范围内,依赖关系只是在编译阶段被忽略了。现在,即使我拨打mvn test
,一切正常。
【讨论】:
【参考方案10】:我在父项目注入依赖项的“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>
【讨论】:
【参考方案11】:我也有同样的问题,如下图。
为解决此问题,以下行添加到应用级别 build.gradle 中的 dependencies
部分。
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'
【讨论】:
【参考方案12】:我在 Eclipse 编译我的代码时遇到了类似的问题,但每次编译测试时 Maven 都失败了,尽管事实上 JUnit 在我的依赖项列表中并且测试在 /src/test/java/ 中。
就我而言,我的依赖项列表中的 JUnit 版本错误。我编写了 JUnit4 测试(带有注释),但我的依赖项是 JUnit 3.8.x。在 JUnit 3.8.x 和 4 版本之间,他们将包名称从 junit.framework 更改为 org.junit,这就是为什么 Maven 仍然会中断使用 JUnit jar 进行编译的原因。
我仍然不完全确定 Eclipse 为何成功编译。它必须在类路径中的某处拥有自己的 JUnit4 副本。希望这种替代解决方案对人们有用。在按照上面 Arthur 的链接后,我达到了这个解决方案。
【讨论】:
【参考方案13】:我也遇到了这个问题 - 我试图从源中提取一个对象,它在测试代码中工作,但不是 src 代码。为了进一步测试,我从测试中复制了一段代码并将其放入 src 代码中,然后立即删除了 JUnit 行,这样我就知道了测试是如何拉入对象的。然后突然我的代码无法编译。 问题是,当我将代码放入其中时,Eclipse 帮助解决了所有类,因此我的 src 代码中有 JUnit 调用,这是不正确的。我应该注意到顶部关于未使用导入的警告,但我忽略了它们。 一旦我在我的 src 文件中删除了未使用的 JUnit 导入,它就运行得很好。
【讨论】:
【参考方案14】:如果您在 src/main/java Utils 中有代码,请找到此错误的一种解决方案
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.9.1</version>
</dependency>
【讨论】:
【参考方案15】:更改 junit 版本为我解决了这个问题。似乎版本 3.8.1 在我的情况下不起作用。将其更改为 4.12 后已修复问题
【讨论】:
【参考方案16】:默认情况下,maven 会分别查看这些文件夹中的 java 和 test 类 - src/main/java 和 src/test/java
当使用源下的测试类指定 src 并且 pom.xml 中的 junit 依赖范围被提及为 test - org.unit 将不会被 maven 找到。
【讨论】:
以上是关于Maven 3 和 JUnit 4 编译问题:包 org.junit 不存在的主要内容,如果未能解决你的问题,请参考以下文章