Maven:为什么在生成eclipse项目时通过构建助手添加测试源不起作用?

我们的maven pom.xml指定在激活某个配置文件(此处为“java8”)时添加其他源和test-source文件夹。 pom的相应部分如下所示

 java8 ....   ....  org.codehaus.mojo build-helper-maven-plugin 1.8   add-test-source generate-test-sources add-test-source   src/test/java8         

根据http://mojo.codehaus.org/build-helper-maven-plugin/usage.html,这似乎是正确的规范。

运行mvm install -P java8我看到其他测试按预期执行。

但是,运行mvm eclipse:eclipse -P java8的额外测试源文件夹不会出现在eclipse .classpath

问题:如何配置maven以将测试源文件夹添加到eclipse配置? 上述行为是错误还是错误配置?

花了一些时间试验这个,我可以对我自己的问题给出一个部分答案(希望能节省一些其他开发人员的时间):

如果使用

  generate-sources add-test-source 

代替

  generate-test-sources add-test-source 

然后将测试源文件夹添加到eclipse .classpath(并将其添加为测试文件夹)。 即我现在在不同的阶段执行“add-test-source”。

换句话说,配置文件如下所示:

   java8 ....   ....  org.codehaus.mojo build-helper-maven-plugin 1.8   add-test-source generate-sources add-test-source   src/test/java8         

这看起来像一个“解决方法”。 它仍然与http://mojo.codehaus.org/build-helper-maven-plugin/usage.html上的规范相矛盾。

我看到它的方式,该插件正在按预期工作。

当您运行mvn install -P java8 ,您正在调用阶段install 。 实际上,maven在install之前执行所有阶段,包括generate-test-sources阶段和test阶段……在它真正执行install之前。 因为你的插件的目标必然是generate-test-sources阶段,这就是为什么在这种情况下你会看到你的测试在类路径中添加并运行。

然而,当您运行mvn eclipse:eclipse -P java8时,您正在调用插件的目标(特别是eclipse插件的eclipse目标),而不是构建生命周期(阶段)。 根据eclipse插件的文档 ,只会调用generate-resources阶段。 请注意, generate-resources不会“包含” generate-test-sources (请参阅此处 ),因此在这种情况下,您的build-helper插件不会被调用。

如果我猜对了,你试图在启用了配置文件java8 Eclipse中运行测试。 在这种情况下,一种方法(无需解决)是右键单击您的项目,单击Maven,在java8中的Active Maven Profile输入框中输入 – >确定。 现在右键单击您的项目并选择Run As – > JUnit Test(或您正在使用的任何测试框架)。 确保你使用最新的Eclipse版本(截至目前的Kepler 4.3.1),因为它有一个内置的m2e插件,它比原来的m2e有了很大的改进。

我遇到了和Christian Fries一样的问题,我得出的结论是关于将add-test-source目标绑定到generate-sources阶段而不是generate-test-sources阶段。

问题是,当我们运行mvn eclipse:eclipse ,我们实际上直接调用一个插件,所以只有该插件才能运行。 执行generate-sources阶段的原因在插件的doco( http://maven.apache.org/plugins/maven-eclipse-plugin/eclipse-mojo.html )中进行了解释:

 Invokes the execution of the lifecycle phase generate-resources prior to executing itself. 

我们想要的是能够告诉插件在自身之前执行generate-test-sources阶段然后运行。 请注意,maven将运行所有阶段,包括您指定的阶段( http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html ),因此我们不需要说运行generate-sourcesgenerate-test-sources因为只需指定后者即可。 无论如何,我们可以通过运行测试这种情况(顺序很重要):

 mvn generate-test-sources eclipse:eclipse 

……对我而言,这完全符合我们的预期。 您可以从输出中看到运行build-helper-maven-plugin以添加测试源,然后运行maven-eclipse-plugin并将其选中。

现在我们遇到了一个新问题,因为AFAIK只能将一个插件绑定到一个阶段(因此它会在阶段运行时运行),而不是相反。

(某种)解决方案是绑定build-helper-maven-pluginmaven-eclipse-pluginmaven-eclipse-plugin顺序,以便按顺序将POM中的插件定义)到generate-test-sources阶段然后而不是运行mvn eclipse:eclipse ,运行:

 mvn generate-test-sources 

所以我们有一个看起来像这样的POM:

    org.codehaus.mojo build-helper-maven-plugin 1.8   add-test-source generate-test-sources  add-test-source    src/test/java8       org.apache.maven.plugins maven-eclipse-plugin 2.9   generate-test-sources  eclipse       

我知道它并不完美,因为人们仍会运行mvn eclipse:eclipse并在它不起作用时哭泣。 此外, maven-eclipse-plugin将作为运行generate-test-sources阶段(即mvn clean install )的任何内容的一部分运行,如果它不是自动设置人们拥有的自定义设置但是如果它是问题是你可以将这些东西移动到一个配置文件中,将它绑定到一个不作为构建的一部分运行的不同阶段(如clean )或创建一个新的生命周期阶段。

而不是使用eclipse:eclipse,你可以使用http://www.eclipse.org/m2e/插件打开maven pom.xml项目。

一旦你在maven中安装该插件,你就可以利用m2e maven插件 ,它可以将任何maven阶段映射到eclipse构建生命周期。 在我们的示例中,您需要在pom.xml中添加以下内容:

    org.eclipse.m2e lifecycle-mapping 1.0.0      org.codehaus.mojo build-helper-maven-plugin [1.0,)  add-test-source     true          

重要

这只有在你安装m2e插件并用它来打开maven项目时才有效。