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

Java 如何配置用于junit测试的eclipse类路径?,java,eclipse,junit,Java,Eclipse,Junit,我有一个eclipse项目,其中每个源文件夹都有自己的关联输出文件夹。它不是/classes,而是/eclipse类 因此,如果我有一个文件夹: src/main/java(典型的maven事物) 目标文件夹是: 目标/eclipse类 资源等方面也是如此 这似乎可行(即eclipse生成放在这些文件夹中的.class文件),但运行任何Junit测试都会抛出一个异常,声明“找不到类”。我正在使用内置的eclipse测试运行程序运行JUnit(即,右键单击类“RunAs”、“JUnit测试”) 将

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

因此,如果我有一个文件夹: src/main/java(典型的maven事物) 目标文件夹是: 目标/eclipse类

资源等方面也是如此

这似乎可行(即eclipse生成放在这些文件夹中的.class文件),但运行任何Junit测试都会抛出一个异常,声明“找不到类”。我正在使用内置的eclipse测试运行程序运行JUnit(即,右键单击类“RunAs”、“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构建,但我似乎找不到禁用它的方法。如果这里没有人有任何其他想法,我将尝试与m2eclipse开发人员联系。

如果您使用m2eclipse,那么Eclipse项目中的配置将被插件覆盖。请参阅以获得解决方案

原因是一些maven插件无法处理
target/
之外的目录,因此m2eclipse开发人员强制编译类的文件夹为
target/classes
target/test classes
,无论您在Eclipse中配置了什么


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

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,如果是这种情况,则无论何时运行clean目标,目标/eclipse类的内容都将被删除,因此您的测试将在运行测试之前从文件系统中删除。通过打开项目属性(alt enter)并选择Maven项,可以看到Maven运行的目标


这一部分不会直接回答您的问题,但您可能会发现它很有用。我倾向于使用与Maven相同的Eclipse输出目录,并且在Eclipse中没有任何问题(我修改了Maven builder以仅运行流程资源,因此它不会尝试编译)


如果我进行Maven构建,Maven编译器将构建任何已更改的类(如果包含clean,则所有类都将更改)。增量编译器检测并处理Eclipse中的后续修改,一切正常。我确实会自动关闭Build,但这只是因为它让我很恼火,如果您将Maven和Eclipse fght都关闭,那么可能是Maven和Eclipse fght。

以防万一,您可能会为此尝试其他插件:我使用Maven Eclipse插件生成我的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>

org.apache.maven.plugins
maven eclipse插件
2.6
eclipse\u构建

这对我来说非常有用,包括能够通过Maven和Eclipse直接运行测试。

尝试运行
mvn Eclipse:Eclipse
。这解决了我使用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
}
eclipse.classpath.file.whenMerged{
类路径->
def JUnitFive=new org.gradle.plugins.ide.eclipse.model.Container('org.eclipse.jdt.junit.junit\u Container/5')
JUnitFive.exported=true

classpath.entries您的意思是,对于源文件夹“服务器”和“客户端”,您将有“服务器类”和“客户端类”作为输出文件夹?如何启动JUnit?是使用JUnit Eclipse插件还是从Maven启动单元测试?我在问题文本中添加了答案。我不这么认为,Eclipse编译器正在将类输出到单独定义的文件夹中。因此,Eclipse编译器正在接收我的输出文件夹,这是运行时classpath已损坏。我不希望maven负责生成这些.class文件,因为它可能会破坏增量编译。此外,提到的解决方案似乎旨在配置maven,以便在eclip时将其.class文件放在其他地方