我有一个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开发者联系。
答案 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
}