11

我想在不同的阶段使用不同的 sourceDirectories 和 destinationDirectories 运行 maven 编译器插件,以便可以使用来自 src/main/java 和 src/test/java 以外的目录的代码。

我认为解决方案如下所示,我将其链接到的阶段是预集成测试。但是,testSourceDirectory 和 testOutputDirectory 的属性似乎没有以这种方式指定,因为它们位于 POM 的部分中。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>

  <executions>
    <execution>
      <id>compile mytests</id>
      <goals>
        <goal>testCompile</goal>
      </goals>
      <phase>pre-integration-test</phase>
      <configuration>
        <testSourceDirectory>${basedir}/src/inttest/java</testSourceDirectory>
        <testOutputDirectory>${basedir}/target/inttest-classes</testOutputDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

有没有办法让这个插件在不影响其默认运行的情况下,分阶段编译不同目录?

4

2 回答 2

9

源目录设置在 <build> 元素内的编译器插件之外,因此这不起作用。

您可以使用 build-helper-maven-plugin 的add-sourceadd-test-source为您的集成测试指定额外的源目录,但这不会删除现有的源目录。

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.3</version>
    <executions>
      <execution>
        <id>add-it-source</id>
        <phase>pre-integration-test</phase>
        <goals>
          <goal>add-source</goal>
        </goals>
        <configuration>
          <sources>
            <source>${basedir}/src/inttest/java</source>
          </sources>
        </configuration>
      </execution>
    </executions>
  </plugin>

如果您将add-test-source目标绑定到在testCompile目标之前运行,则将包含您的集成测试。请注意,您希望将它们输出到目标/测试类,以便确保插件能够找到它们。

为了处理标准测试源的删除,我编写了一个小插件来修改模型以删除现有的 testSource 位置,然后再添加用于集成测试的位置。

于 2009-08-14T13:46:16.190 回答
5

经过更多研究,很明显这在 Maven 2 中实际上不可能以我想要的方式进行,因此需要某种形式的 hack 来引入集成测试。虽然您可以添加其他目录(如 Rich Seller 所建议的那样),但没有插件可以删除其他源或从主编译单独编译目录。

我发现添加集成测试的最佳解决方案是首先使用构建助手插件添加目录 inttest 目录以编译为测试。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>add-test-source</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>add-test-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>src/inttest/java</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>

现在,为了让集成测试在集成测试阶段执行,您需要使用排除和包含在它们运行时进行操作,如下所示。这允许您可能需要的任何自定义参数(在我的情况下是通过 argline 添加的代理)。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
    <excludes>
        <exclude>**/itest/**</exclude>
    </excludes>
    </configuration>
<executions>
    <execution>
        <id>inttests</id>
        <goals>
            <goal>test</goal>
        </goals>
        <phase>integration-test</phase>
        <configuration>
            <excludes><exclude>none</exclude></excludes>
            <includes>
                <include>**/itest/**/*Test.java</include>
            </includes>
        </configuration>
    </execution>
</executions>
</plugin>
于 2009-08-16T10:59:22.450 回答