2011-05-01 141 views
55

我想用Maven构建一个简单的Java项目。在我的pom文件中,我声明JUnit 4.8.2是唯一的依赖项。仍然Maven坚持使用JUnit版本3.8.1。我如何解决它?Maven 3和JUnit 4编译问题:包org.junit不存在

该问题在编译失败时显示:“org.junit包不存在”。这是因为我的源代码中有import语句。在JUnit 4. *中的正确包名是org.junit。*,而在版本3中。*它是junit.framework。*

我想我已经找到关于http://maven.apache.org/plugins/maven-surefire-plugin/examples/junit.html问题根源的文档,但是那里的建议似乎是Maven专家的意思。我不明白该怎么做。

+18

我还没有与Maven 3,但我的第一个猜测的工作将是您的测试类在src /主/ Java和您的POM的JUnit定义为一个测试依赖(即,值了“范围“元素是”测试“)。虽然没有看到你的POM并且知道你的项目结构,但我不能肯定地说。 – 2011-05-01 02:30:52

+1

你可以粘贴你的pom.xml吗? – lobster1234 2011-05-01 02:54:58

+2

Maven并不坚持JUnit,一个人一定是你......这听起来像你没有将你的测试类放到正确的位置src/test/java ......当然这个pom会极其有用。 – khmarbaise 2011-05-01 09:16:19

回答

29

@Dennis Roberts:你说得对:我的测试课程位于src/main/java。此外,POM for JUnit中“scope”元素的值是“test”,尽管这是它应该是的。问题是我在Eclipse中创建测试类时很sl resulting,导致它在src/test/java的src/main/java中创建。在运行“mvn eclipse:eclipse”后,这在Eclipse的Project Explorer视图中变得更容易看到,但是您的评论让我首先看到了它。谢谢。

+0

我将一些文件从测试移到main,并且我的junit Assert开始引发错误。删除测试解决了这个问题。谢谢! – pMan 2012-05-02 06:57:10

+0

我把一个测试文件从主要移动到测试。然后maven编译成功与junit 测试。非常感谢 – eleforest 2013-09-30 09:52:48

+0

令人难以置信的是,我遇到了同样的问题。由于Jenkins不关心我在src/main中的测试,所以我甚至没有注意到。 – 2015-09-29 07:39:02

4

你是如何申明版本的?

<version>4.8.2</version> 

注意从这个声明的含义解释here (see NOTES)

当声明为3.8.2的Junit一个“正常”的版本,例如,在内部这被表示为“允许任何东西,但更喜欢3.8 .2“。这意味着当检测到冲突时,Maven被允许使用冲突算法来选择最佳版本。如果你指定了[3.8.2],这意味着只有3.8.2将被使用,没有别的。

要强制使用的版本4.8.2尝试

<version>[4.8.2]</version> 

当你没有在你的项目中的任何其他依赖不应该有引起你的问题的任何冲突。如果您能够从存储库获取此版本,则第一个声明应该适用于您。你是否继承了父pom的依赖关系?

+1

不会' [4.8.2,)'强制**至少**该版本? – 2011-05-05 07:14:22

+2

@Joachim Sauer使用版本范围目前也解决了SNAPSHOT版本([link](http://jira.codehaus.org/browse/MNG-3092)) - 如果这是一个好概念,那么讨论会非常有争议。如果您不介意获得SNAPSHOT版本,则您的建议非常有用。 – FrVaBe 2011-05-05 07:59:09

1

我有一个类似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成功编译。它必须在classpath中的某个位置拥有自己的JUnit4副本。希望这种替代解决方案对人们有用。在跟上Arthur的链接之后,我达成了这个解决方案。

3

我有同样的问题。我所做的只是 - 从pom.xml文件中删除了junit 3.8的依赖项,并为junit 4.8添加了一个新的依赖项。然后我做了maven clean和maven安装。它做了诡计。为了验证,在maven安装后,我去了project-> properties-build path-> maven dependencies,现在看到了junit 3.8的jar已经没有了!,而是junit 4.8 jar被列出来了。凉!!。现在我的测试运行像一个魅力..希望这有助于某种方式..

+0

它对我很好:)谢谢 – u12345 2015-05-12 08:29:42

+0

是的,但@ FrVaBe的回答使得当你的同事得到你的代码(和你的pom.xml)时,他/她不必再一次找出你的解决方案。它会正常工作。 – 2017-03-02 16:34:30

32

只是为了与完整解决方案的答案,帮助客队:

所有你需要做的就是添加了JUnit依赖于pom.xml。不要忘了<scope>test</scope>

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

是的,你的junit版本很重要。我将它从3.8.1升级到4.11,并解决了我的问题。 – 2016-02-17 04:16:39

+0

将它从3.11改为4.11,它也可以工作,但我想知道为早期版本的junit发生了什么。 – Tiina 2016-03-28 08:17:02

3

加入这个依赖于你的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> 
+1

这是一个仅供链接使用的答案,比回答更适合评论(除非你用代码示例进行充实)。 – Jimbo 2013-09-04 15:46:15

16

我的问题是我pom.xml我有行<sourceDirectory>${basedir}/src</sourceDirectory>删除这条线做内行maven使用常规结构文件夹,它解决了我的问题

+1

删除 src << sourceDirectory>其工作 – 2015-03-27 15:43:24

+0

谁把那里放在那里 – 2017-12-27 07:20:08

10

remov荷兰国际集团范围内标签在pom.xml中的JUnit的工作..

+1

这个解决方案是不好的,因为现在你发送你的junit测试类到你的prod二进制文件。 – avgvstvs 2016-08-01 17:02:42

+0

他们没有junit – Harsh 2017-09-18 14:05:03

-2

默认情况下,行家看分别这些文件夹中的Java和测试类 - 的src/main/java和SRC/test/java下

当src由源代码中的测试类指定,并且在pom.xml中提供了junit依赖关系的范围,因为maven不会找到test - org.unit。

1

我也遇到过这个问题 - 我试图从一个源拉入对象,它在测试代码中工作,但不是src代码。为了进一步测试,我从测试中复制了一段代码并将其放到src代码中,然后立即删除了JUnit行,以便我测试了如何将对象拉入。然后突然我的代码不会编译。
问题在于,当我将代码放入代码时,Eclipse有用地解析了所有的类,因此我有来自我的src代码的JUnit调用,这是不正确的。我应该注意到顶部的关于未使用进口的警告,但我忽略了看到它们。
一旦我删除了我的src文件中未使用的JUnit导入,它一切都很好。

1

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

2

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

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

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

我在“测试utils的”项目有一个非常类似的问题(增加功能,规则和断言JUnit的)注入依赖父项目的孩子。 取决于org.junit.rules包的类位于src/main/java中。

所以我加了JUnit的依赖没有测试范围,并解决了这个问题:

pom.xml中测试UTIL项目:

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

POM。xml的父项目:

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

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

enter image description here

要解决此问题,下面行添加到应用级的build.gradle 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. 

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

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