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