如何配置用于junit测试的eclipse类路径?

时间:2009-08-21 13:17:17

标签: java eclipse junit

我有一个eclipse项目,其中每个源文件夹都有自己的关联输出文件夹。而不是/ classes它被称为/ eclipse-classes。

所以,如果我有一个文件夹: src / main / java(典型的maven东西) 目标文件夹是: 目标/蚀类

同样适用于资源等。

这似乎有效(即eclipse生成放在这些文件夹中的.class文件)但是运行任何Junit测试都会抛出一个异常,说明“找不到类”。我正在使用内置的eclipse测试运行器运行JUnit(即右键单击类,“运行为”,“Junit测试”)。

将/ eclipse-classes文件夹复制到/ classes会使它们成功,这意味着eclipse正在使用/ classes,但我找不到任何配置选项来更改它。有没有办法找出eclipse仍在使用/ classes文件夹的位置和原因?

(也许相关,我也在使用m2eclipse插件)

Rich Seller的答案启发了一些额外的信息: Maven配置为在资源更改时运行以下命令:

process-resources resources:testResources

虽然这不会做任何有用的事情(复制到错误的目录),但资源不会成为问题,因为它们最终位于正确的位置。

.classpath条目看起来没问题。有一堆maven子项目,所以嵌套比Rich发布的更深,但除此之外它完全相同:

<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>

我认为我们可能不需要那个,但它不会伤害任何东西。

edit2:进一步测试显示eclipse正在/ eclipse-classes文件夹和/ classes文件夹中生成类文件。似乎m2eclipse在自动构建时在后台运行mvn build,但我似乎找不到禁用它的方法。如果没有人有任何其他想法,我会尝试与m2eclipse开发者联系。

5 个答案:

答案 0 :(得分:7)

如果使用m2eclipse,那么Eclipse项目中的配置将被插件覆盖。有关解决方案,请参阅this article

原因是某些maven插件无法处理target/之外的目录,因此m2eclipse devs强制编译类的文件夹为target/classes和{{1无论你在Eclipse中配置什么。

通过使用配置文件,您可以为Eclipse使用不同的文件夹。但是,更改maven(及其插件)的输出文件夹并不明智。

答案 1 :(得分:4)

Eclipse JUnit集成没有特殊的类路径配置,它将处理类路径中定义的输出文件夹,并且应该找到编译到这些文件夹的所有类。可能是你的.classpath文件中存在狡猾的东西,所以JUnit很混乱(默认情况下,.classpath文件在视图中是隐藏的,它位于项目的根目录中。)

根据您的描述,我希望看到类似下面的条目(注意默认输出文件夹和src / main / java和src / main / resources的覆盖)。您的类路径是否看起来明显不同,如果是这样可能是问题

<classpathentry excluding="**" kind="src" output="target/eclipse-classes" path="src/main/resources"/>
<classpathentry kind="src" output="target/eclipse-classes" path="src/main/java"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
<classpathentry kind="output" path="target/classes"/>

这是一个很长的镜头,但也可能是你的项目上配置了Maven clean,如果是这样的话,每当运行干净的目标时,target / eclipse-classes的内容就会被删除,所以你的测试将在运行测试之前从文件系统中删除。您可以通过打开项目属性( alt-enter )并选择Maven项来查看Maven运行的目标。


这部分并不直接回答您的问题,但无论如何您可能会觉得有用。我倾向于让我的Eclipse输出目录与Maven相同,并且在Eclipse中没有问题(我将Maven构建器修改为仅运行进程资源,因此它不会尝试编译)。

如果我进行Maven构建,Maven编译器将构建任何已更改的类(如果包含clean,则将是所有已更改的类)。 Eclipse中的后续修改由增量编译器检测并处理,一切正常。我确实关闭了Build Automatically,但那只是因为它让我很烦恼,如果你把它们都关掉的话可能就是Maven和Eclipse。

答案 2 :(得分:1)

以防万一你为此尝试不同的插件:我使用maven-eclipse-plugin来生成我的Eclipse项目设置。我配置插件来配置我的Eclipse项目,以便为类使用完全独立的输出目录(见下文)。它与项目根目录相关,因此它位于目标之外。

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-eclipse-plugin</artifactId>
        <version>2.6</version>
        <configuration>
            <outputDirectory>eclipse_build</outputDirectory>
        </configuration>
    </plugin>

这对我来说很有用,包括能够通过Maven和Eclipse开箱即用地运行测试。

答案 3 :(得分:0)

尝试运行mvn eclipse:eclipse。这为我解决了这个问题

答案 4 :(得分:0)

我正在使用gradle。刷新gradle项目将覆盖.classpath文件。因此,我必须在build.gradle文件的末尾添加以下内容,以使其维护JUNIT5参考。

eclipse.classpath.file.whenMerged { 
    classpath ->
        def JUnitFive = new org.gradle.plugins.ide.eclipse.model.Container('org.eclipse.jdt.junit.JUNIT_CONTAINER/5')
        JUnitFive.exported = true
        classpath.entries << JUnitFive
}