【问题标题】:Maven: Why does adding test source via build helper not work when generating eclipse project?Maven:为什么生成eclipse项目时通过构建助手添加测试源不起作用?
【发布时间】:2013-10-31 08:14:08
【问题描述】:

如果某个配置文件(此处为“java8”)被激活,我们的 maven pom.xml 指定添加一个额外的源和测试源文件夹。 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,这似乎是正确的规范。

Running mvm install -P java8 我看到附加测试按预期执行。

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

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

【问题讨论】:

    标签: java eclipse maven maven-3


    【解决方案1】:

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

    如果有人使用

                                <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 中(并将其添加为测试文件夹)。 IE。我现在在不同的阶段执行“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 上的规范相矛盾

    【讨论】:

      【解决方案2】:

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

      在 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 项目时才有效。

      【讨论】:

        【解决方案3】:

        在我看来,插件按预期工作。

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

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

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

        【讨论】:

          【解决方案4】:

          我遇到了与 Christian Fries 相同的问题,我得出了与您相同的结论,即将 add-test-source 目标绑定到 generate-sources 阶段而不是 generate-test-sources 阶段。

          问题是当我们运行mvn eclipse:eclipse时,我们实际上是直接调用一个插件,所以只有那个插件会运行。执行generate-sources阶段的原因在插件的文档(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-plugin(按此顺序,因此请按此顺序在您的POM 中定义插件)绑定到generate-test-sources 阶段,而不是运行@987654336 @,运行:

          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)或创建新的生命周期阶段。

          【讨论】:

            猜你喜欢
            • 2018-10-07
            • 1970-01-01
            • 2012-04-13
            • 1970-01-01
            • 2011-11-04
            • 2020-08-24
            • 2012-04-11
            • 2023-03-06
            • 2014-07-21
            相关资源
            最近更新 更多