Spring Boot pom - 如何从聚合器pom继承配置文件和属性?

时间:2018-03-15 13:54:27

标签: java maven spring-boot properties integration-testing

目标

我正在为Maven构建添加集成测试。我想实现以下目标:

  • 默认情况下仅运行单元测试。
  • 必须只能运行集成测试。

当前状态

任务变得更加复杂,因为这是一个现有的应用程序,它具有混乱的maven模块结构(层次结构)。我会试着解释一下。

所以我有一个看起来像

的聚合器pom(超级pom)
<groupId>com.group.id</groupId>
<artifactId>app-name</artifactId>
<modules>
    <module>SpringBootApp1</module>
    <module>SpringBootApp2</module>
</modules>
<packaging>pom</packaging>

<profiles>
    <profile>
        <id>Local</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <!-- Only unit tests are run when the development profile is active -->
            <skip.integration.tests>true</skip.integration.tests>
            <skip.unit.tests>false</skip.unit.tests>
        </properties>
    </profile>
    <profile>
        <id>Test</id>
        <properties>
            <!-- Only integration tests are run when the test profile is active -->
            <skip.integration.tests>false</skip.integration.tests>
            <skip.unit.tests>true</skip.unit.tests>
        </properties>
    </profile>
</profiles>

和一些不从super pom继承的模块poms(它们继承自spring-boot-starter-parent)看起来像

<groupId>com.group.id</groupId>
<artifactId>spring-boot-app</artifactId>
<packaging>jar</packaging>
<name>Spring Boot app</name>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.10.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<build>
    <finalName>SpringBootApp1</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.21.0</version>
            <configuration>
                <skipTests>${skip.unit.tests}</skipTests>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.21.0</version>
            <executions>
                <!--  Invokes both the integration-test and the verify goals of the Failsafe Maven plugin -->
                <execution>
                    <id>integration-tests</id>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                    <configuration>
                        <skipTests>${skip.integration.tests}</skipTests>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

如您所见,我在聚合器pom中定义了skip.integration.testsskip.unit.tests属性(不同配置文件的属性值不同),并尝试在模块poms中使用它们。

问题

当我执行mvn clean test -P Testmvn clean verify -P Test运行测试时,我发现未应用属性(例如,虽然skip.unit.teststrue,但仍会执行单元测试)。

我可以将聚合器pom声明为模块pom的父级,也许它可以解决问题,但是模块poms已经将spring-boot-starter-parent声明为其父级。

问题

  • 是否可以使用聚合器pom中的属性而不使其成为父级?
  • 如何使用聚合器pom中的属性将集成测试与单元测试分开?

ps。我向您保证我遵守命名约定:单元测试的名称类似于*Test.java,集成测试的名称类似于*IT.java。因此,maven-failsafe-plugin和maven-surefire-plugin可以区分它们。

1 个答案:

答案 0 :(得分:0)

如果您可以将聚合器作为模块的父级,而不是将聚合器配置为将spring-boot-starter-parent作为父级,则此问题将得到解决。(假设您的聚合器当前没有任何父级)。

或者您可以从命令行传递skip test属性,例如-Dskip.unit.tests=true(您调用mvn clean verify)。

作为旁注,当您执行mvn test命令时,您不必指定要跳过的集成测试,因为它在生命周期的后期。(它不会以任何方式执行)