5

如果某个配置文件(此处为“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这似乎是正确的规范。

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

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

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

4

4 回答 4

5

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

如果一个使用

                            <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上的规范相矛盾

于 2013-10-31T08:14:08.830 回答
2

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

在 maven 中安装该插件后,您将能够利用m2e maven 插件,它可以将任何 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 项目时才有效。

于 2015-12-06T12:18:02.517 回答
1

我遇到了和你一样的问题 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-sources并且generate-test-sources因为简单地指定后者就足够了。无论如何,我们可以通过运行(顺序很重要)来测试这种情况:

mvn generate-test-sources eclipse:eclipse

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

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

(某种)解决方案是将build-helper-maven-pluginand maven-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)或创建新的生命周期阶段。

于 2013-12-09T04:31:22.407 回答
1

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

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

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

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

于 2013-11-02T16:55:30.467 回答