Rade Milovic
Rade Milovic

Reputation: 1015

Maven profiles are not inherited in child modules

I'm trying to separate different kinds of tests (unit, integration, acceptance) by using maven profiles. This is the part of the main pom file:

        <properties>
            <build.profile.id>dev</build.profile.id>

            <skip.unit.tests>false</skip.unit.tests>
            <skip.integration.tests>true</skip.integration.tests>
            <skip.acceptance.tests>true</skip.acceptance.tests>
        </properties>

        <profiles>
            <profile>
                <id>dev</id>
            </profile>
            <profile>
                <id>integration-test</id>
                <properties>
                    <build.profile.id>integration-test</build.profile.id>
                    <skip.unit.tests>true</skip.unit.tests>
                    <skip.integration.tests>false</skip.integration.tests>
                    <skip.acceptance.tests>true</skip.acceptance.tests>
                </properties>
            </profile>
            <profile>
                <id>acceptance-test</id>
                <properties>
                    <build.profile.id>acceptance-test</build.profile.id>
                    <skip.unit.tests>true</skip.unit.tests>
                    <skip.integration.tests>true</skip.integration.tests>
                    <skip.acceptance.tests>false</skip.acceptance.tests>
                </properties>
            </profile>
        </profiles>
        <build>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.17</version>
                <configuration>
                    <skipTests>${skip.unit.tests}</skipTests>
                    <includes>
                        <include>**/*UnitTests.java</include>
                    </includes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.17</version>
                <executions>
                    <execution>
                        <id>integration-tests</id>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                        <configuration>
                            <skipTests>${skip.integration.tests}</skipTests>
                            <includes>
                                <include>**/*IntegrationTests.java</include>
                            </includes>
                        </configuration>
                    </execution>
                    <execution>
                        <id>acceptance-tests</id>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                        <configuration>
                            <skipTests>${skip.acceptance.tests}</skipTests>
                            <includes>
                                <include>**/*AcceptanceTests.java</include>
                            </includes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

As you can see I'm using the profile information to run certain types of tests based on the profile that is used. Default profile is dev and it will only run unit tests. They can be executed like this:

mvn clean test

For integration and acceptance tests I use failsafe plugin: Example of running integartion tests would be:

mvn clean verify -P integration-test

This works fine when I run it from the main pom module, but it doesn't work when running it from the child module. Tests are just ignored. Looking at the effective pom for child module I don't see the profiles. Am I doing something wrong or is this is expected behavior from maven? If profile inheritance (needs to cascade to deepest modules in the hierarchy) can't be achieved this way how can it be done?

Update: This is the project hierarchy project directory

--main module
--commons module
--administration
----domain 
----data
----business
----web

Upvotes: 0

Views: 3225

Answers (1)

Pavel Horal
Pavel Horal

Reputation: 18183

With multimodule project you usually don't execute modules directly. Instead you should always execute the main module, but specify only your desired submodule via -pl parameter. There are a lot more issues connected with running modules directly.


Just double checked some multi-module projects I have participated on and I we are using <pluginManagement> to propagate plugin configuration form parent POM to child projects.

Upvotes: 3

Related Questions