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

时间:2013-10-31 08:14:09

标签: java eclipse maven maven-3

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

    <profile>
        <id>java8</id>
        ....
        <build>
            <plugins>
                ....
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>build-helper-maven-plugin</artifactId>
                    <version>1.8</version>
                    <executions>
                        <execution>
                            <id>add-test-source</id>
                            <phase>generate-test-sources</phase>
                            <goals><goal>add-test-source</goal></goals>
                            <configuration>
                                <sources>
                                    <source>src/test/java8</source>
                                </sources>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>

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

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

但是,运行mvm eclipse:eclipse -P java8其他测试源文件夹不会出现在eclipse .classpath中。

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

4 个答案:

答案 0 :(得分:4)

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

如果使用

                            <phase>generate-sources</phase>
                            <goals><goal>add-test-source</goal></goals>

而不是

                            <phase>generate-test-sources</phase>
                            <goals><goal>add-test-source</goal></goals>

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

换句话说,个人资料看起来像这样:

    <profile>
        <id>java8</id>
        ....
        <build>
            <plugins>
                ....
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>build-helper-maven-plugin</artifactId>
                    <version>1.8</version>
                    <executions>
                        <execution>
                            <id>add-test-source</id>
                            <phase>generate-sources</phase>
                            <goals><goal>add-test-source</goal></goals>
                            <configuration>
                                <sources>
                                    <source>src/test/java8</source>
                                </sources>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>

这看起来像是“解决方法”。它仍然与http://mojo.codehaus.org/build-helper-maven-plugin/usage.html

上的规范相矛盾

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

我遇到了与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-sources AND generate-test-sources,因为只需指定后者即可。无论如何,我们可以通过运行来测试这种情况(顺序很重要):

mvn generate-test-sources eclipse:eclipse

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

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

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

而不是运行mvn eclipse:eclipse
mvn generate-test-sources

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

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.8</version>
            <executions>
                <execution>
                    <id>add-test-source</id>
                    <phase>generate-test-sources</phase>
                    <goals>
                        <goal>add-test-source</goal>
                    </goals>
                    <configuration>
                        <sources>
                            <directory>src/test/java8</directory>
                        </sources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-eclipse-plugin</artifactId>
            <version>2.9</version>
            <executions>
                <execution>
                    <phase>generate-test-sources</phase>
                    <goals>
                        <goal>eclipse</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

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

答案 3 :(得分:1)

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

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

<pluginManagement>
  <plugins>
    <plugin>
     <groupId>org.eclipse.m2e</groupId>
     <artifactId>lifecycle-mapping</artifactId>
     <version>1.0.0</version>
     <configuration>
       <lifecycleMappingMetadata>
         <pluginExecutions>
           <pluginExecution>
             <pluginExecutionFilter>
               <groupId>org.codehaus.mojo</groupId>
               <artifactId>build-helper-maven-plugin</artifactId>
               <versionRange>[1.0,)</versionRange>
               <goals>
                 <goal>add-test-source</goal>
               </goals>
               </pluginExecutionFilter>
               <action>
                 <execute>
                   <runOnIncremental>true</runOnIncremental>
                 </execute>
               </action>
            </pluginExecution>
         </pluginExecutions>
       </lifecycleMappingMetadata>
     </configuration>
    </plugin>
  </plugins>
</pluginManagement>  

重要

这只适用于安装m2e插件并用它来打开maven项目的情况。