1

I want to run the simple flow, I have 6 profiles:

generate-schema,unpack-war,run-jetty,test,stop-jetty,start-stop-app

the test profile will run on a different child module when I declare it in the mvn goals/properties: * clean --activate-profiles generate-schema,unpack-war,start-stop-app,test --projects apm-tests,apm-tests\apm-adapter-tests verify.*

How can I make the child module run only the tests and skip the rest of the profiles (generate-schema and etc.) ?

Parent pom sample:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <project>

        <parent>
            <artifactId>apm-root</artifactId>
            <groupId>com.apm.platform</groupId>
            <version>12.50.9999-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>

        <artifactId>apm-tests</artifactId>

        <packaging>pom</packaging>

        <modules>
            <module>alm-coverage-report</module>
        </modules>

            <profile>
                <id>test</id>
                <build>
                    <plugins>
                        <plugin>
                            <artifactId>maven-surefire-plugin</artifactId>
                            <configuration>
                                <skipTests>true</skipTests>
                            </configuration>
                        </plugin>
                    </plugins>
                </build>
            </profile>

    <profile>
                <id>generate-schema</id>
                <activation>
                    <activeByDefault>false</activeByDefault>
                </activation>

                <build>
                    <plugins>
                        <plugin>
                            <groupId>org.codehaus.mojo</groupId>
                            <artifactId>exec-maven-plugin</artifactId>
                            <executions>
                                <execution>
                                    <id>generate-schema</id>
                                    <phase>pre-integration-test</phase>
                                    <goals>
                                        <goal>java</goal>
                                    </goals>
                                    <configuration>
                                        <mainClass>com.apm.platform.siteadmin.setup.Setup</mainClass>
                                        <classpathScope>test</classpathScope>
                                        <systemProperties>
                                            <systemProperty>
                                                <key>InstallationFolder</key>
                                                <value>${tests.runtime}</value>
                                            </systemProperty>
                                            <systemProperty>
                                                <key>RepositoryFolder</key>
                                                <value>${tests.runtime}/repository</value>
                                            </systemProperty>
                                            <systemProperty>
                                                <key>LogFolder</key>
                                                <value>${tests.runtime}/log</value>
                                            </systemProperty>
                                            <systemProperty>
                                                <key>mercury.td.sa_config_dir</key>
                                                <value>${tests.runtime}</value>
                                            </systemProperty>
                                            <systemProperty>
                                                <key>CreateLabProject</key>
                                                <value>${create.lab.project}</value>
                                            </systemProperty>
                                        </systemProperties>
                                        <arguments>
                                            <argument>--auto</argument>
                                            <argument>${db.schema}</argument>
                                        </arguments>
                                    </configuration>
                                </execution>
                            </executions>
                        </plugin>
                    </plugins>
                </build>
            </profile>
            <profile>
                <id>start-jetty</id>
                <activation>
                    <activeByDefault>false</activeByDefault>
                </activation>
                <build>
                    <plugins>
                        <plugin>
                            <groupId>org.eclipse.jetty</groupId>
                            <artifactId>jetty-maven-plugin</artifactId>
                            <configuration>
                                <war>${unpacked.war.directory}</war>
                                <contextXml>${unpacked.war.directory}/WEB-INF/jetty-web.xml</contextXml>
                                <webApp>
                                    <contextPath>/qcbin</contextPath>
                                </webApp>
                                <systemProperties>
                                    <systemProperty>
                                        <name>mercury.td.sa_config_dir</name>
                                        <value>${tests.runtime}</value>
                                    </systemProperty>
                                    <systemProperty>
                                        <name>jetty.port</name>
                                        <value>${jetty.start.port}</value>
                                    </systemProperty>
                                </systemProperties>
                                <stopPort>${jetty.stop.port}</stopPort>
                                <stopKey>STOP</stopKey>
                            </configuration>
                            <executions>
                                <execution>
                                    <id>start-jetty</id>
                                    <phase>pre-integration-test</phase>
                                    <goals>
                                        <goal>deploy-war</goal>
                                    </goals>
                                    <configuration>
                                        <scanIntervalSeconds>0</scanIntervalSeconds>
                                        <daemon>false</daemon>
                                    </configuration>
                                </execution>
                            </executions>
                        </plugin>
                    </plugins>
                </build>
            </profile>

          <profile>
            <id>start-stop-app</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.eclipse.jetty</groupId>
                        <artifactId>jetty-maven-plugin</artifactId>
                        <configuration>
                            <war>${unpacked.war.directory}</war>
                            <contextXml>${unpacked.war.directory}/WEB-INF/jetty-web.xml</contextXml>
                            <webApp>
                                <contextPath>/qcbin</contextPath>
                            </webApp>
                            <systemProperties>
                                <systemProperty>
                                    <name>mercury.td.sa_config_dir</name>
                                    <value>${tests.runtime}</value>
                                </systemProperty>
                                <systemProperty>
                                    <name>jetty.port</name>
                                    <value>${jetty.start.port}</value>
                                </systemProperty>
                            </systemProperties>
                            <stopPort>${jetty.stop.port}</stopPort>
                            <stopKey>STOP</stopKey>
                        </configuration>
                        <executions>
                            <execution>
                                <id>start-jetty</id>
                                <phase>pre-integration-test</phase>
                                <goals>
                                    <goal>deploy-war</goal>
                                </goals>
                                <configuration>
                                    <scanIntervalSeconds>0</scanIntervalSeconds>
                                    <daemon>true</daemon>
                                </configuration>
                            </execution>
                            <execution>
                                <id>stop-jetty</id>
                                <phase>post-integration-test</phase>
                                <goals>
                                    <goal>stop</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>

            <profile>
                <id>stop-jetty</id>
                <activation>
                    <activeByDefault>false</activeByDefault>
                </activation>
                <build>
                    <plugins>
                        <plugin>
                            <groupId>org.eclipse.jetty</groupId>
                            <artifactId>jetty-maven-plugin</artifactId>
                            <configuration>
                                <stopPort>${jetty.stop.port}</stopPort>
                                <stopKey>STOP</stopKey>
                            </configuration>
                            <executions>
                                <execution>
                                    <id>stop-jetty</id>
                                    <phase>post-integration-test</phase>
                                    <goals>
                                        <goal>stop</goal>
                                    </goals>
                                </execution>
                            </executions>
                        </plugin>
                    </plugins>
                </build>
            </profile>


            <!-- create project profile -->
            <profile>
                <id>create-project</id>
                <activation>
                    <activeByDefault>false</activeByDefault>
                </activation>
                <properties>
                    <serverUrl>http://localhost:${env.JETTY_PORT}/qcbin</serverUrl>
                    <saUser>sa</saUser>
                    <projectUserName>restuser</projectUserName>
                    <domain>UNITEST</domain>
                    <project>resttest</project>
                    <overwrite>true</overwrite>
                </properties>
                <build>
                    <plugins>
                        <plugin>
                            <groupId>com.apm.maven.plugins.alm</groupId>
                            <artifactId>rest-create-project</artifactId>
                            <version>1.0.8.2</version>
                            <executions>
                                <execution>
                                    <id>clean-create</id>
                                    <phase>pre-integration-test</phase>
                                    <goals>
                                        <goal>create-project</goal>
                                    </goals>
                                    <configuration>
                                        <serverUrl>${serverUrl}</serverUrl>
                                        <saUser>${saUser}</saUser>
                                        <projectUserName>${projectUserName}</projectUserName>
                                        <projectUserPassword>${projectUserPassword}</projectUserPassword>
                                        <domain>${domain}</domain>
                                        <project>${project}</project>
                                        <overwrite>${overwrite}</overwrite>
                                        <extensions>${extensions}</extensions>
                                    </configuration>
                                </execution>
                            </executions>
                        </plugin>
                    </plugins>
                </build>
            </profile>

        </profiles>
    </project>

Child module pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.apm.platform</groupId>
        <artifactId>apm-tests</artifactId>
        <version>12.50.9999-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <artifactId>apm-adapter-tests</artifactId>
    <packaging>pom</packaging>


    <properties>
        <tests.version>${project.version}</tests.version>
    </properties>

    <dependencies>
       <dependency>
                      <groupId>com.apm.platform</groupId>
                      <artifactId>apm-synchronizer-adapter-testing</artifactId>
                      <version>1.10.9999-SNAPSHOT</version>
                      <classifier>test-jar-with-dependencies</classifier>

       </dependency>
    </dependencies>

    <profiles>
        <!--run integration tests using surefire plugin -->
        <profile>
            <id>itest</id>

            <build>
                <plugins>
                    <plugin>

                        <artifactId>maven-surefire-plugin</artifactId>
                        <version>${surefire.version}</version>
                        <dependencies>
                            <dependency>
                                <groupId>org.apache.maven.plugins</groupId>
                                <artifactId>maven-surefire-report-plugin</artifactId>
                                <version>${surefire.version}</version>
                            </dependency>
                        </dependencies>
                        <executions>
                            <execution>
                                <id>integration-test</id>
                                <phase>integration-test</phase>
                                <goals>
                                    <goal>test</goal>
                                </goals>
                                <configuration>
                                    <excludedGroups>com.apm.platform.CAPQIntegrationTestCategory</excludedGroups>
                                    <skipTests>false</skipTests>
                                    <excludes>
                                      <exclude>junit/**/*.java</exclude>
                                      <exclude>org/**/*.java</exclude>
                                    </excludes>
                                    <argLine>-Xmx1536m</argLine>

                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>

        <profile>
            <id>sync-adapter</id>
            <dependencies>
                <dependency>
                      <groupId>com.apm.platform</groupId>
                      <artifactId>apm-synchronizer-adapter-testing</artifactId>
                      <version>1.10.9999-SNAPSHOT</version>
                      <classifier>test-jar-with-dependencies</classifier>
                      <scope>test</scope>
                </dependency>
            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-dependency-plugin</artifactId>
                        <executions>
                            <execution>
                                <!--copies dependent classes from test-jars-->
                                <id>unpack-tests</id>
                                <phase>pre-integration-test</phase>
                                <goals>
                                    <goal>unpack</goal>
                                </goals>
                                <configuration>
                                    <artifactItems>
                                        <artifactItem>
                                            <groupId>com.apm.platform</groupId>
                                            <artifactId>agm-synchronizer-adapter-testing</artifactId>
                                            <version>1.10.9999-SNAPSHOT</version>
                                            <classifier>test-jar-with-dependencies</classifier>
                                            <outputDirectory>${project.build.testOutputDirectory}</outputDirectory>
                                        </artifactItem>
                                    </artifactItems>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

13:03:13 2015-11-30 13:03:14.422:INFO:oejs.Server:main: Started

@207555ms 13:03:13 [INFO] Started Jetty Server 13:03:13 [INFO]

13:03:13 [INFO] --- maven-surefire-plugin:2.16:test (integration-test)

@ apm-tests --- 13:03:14 [INFO] No tests to run. 13:03:14 [INFO]

13:03:14 [INFO] --- jetty-maven-plugin:9.1.3.v20140225:stop

(stop-jetty) @ apm-tests --- 13:03:14 [INFO] 13:03:14 [INFO] ---

maven-source-plugin:2.2.1:jar-no-fork (attach-sources) @ alm-tests ---

13:03:14 2015-11-30

13:03:14.820:INFO:oejs.ServerConnector:ShutdownMonitor: Stopped

ServerConnector@4c8d3b5c{HTTP/1.1}{0.0.0.0:5729} 13:03:14 [INFO]

13:03:14 [INFO] --- maven-source-plugin:2.2.1:test-jar-no-fork

(attach-test-sources) @ alm-tests --- 13:03:14 [INFO]

13:03:14 [INFO]

--------------- 13:03:14 [INFO] Building agm-synchronizer-adapter-testing

12.50.9999-SNAPSHOT 13:03:14 [INFO] ------------

Shahar Hamuzim Rajuan
  • 3,908
  • 4
  • 39
  • 70
  • Some questions: is it normal that the child module has pom as packaging when meant to execute tests? A pom-packaging module/project is not meant to provide any source/test-source code. Moreover, the described parent and child do not have any relationship between them (the parent doesn't have the child among its modules, the child doesn't have this parent as parent), is that on purpose? – A_Di-Matteo Nov 29 '15 at 21:21
  • @A.DiMatteo Ok. So the child module packaging is - pom but I want to run it as test ,but when I declared it as test I got an error. I want the parent will have no relationship with the child (if possible), But the child parent is indeed the parent pom.xml (fixed that too). And the purpose still remains that the father will run all the profiles and the child will only run the tests. – – Shahar Hamuzim Rajuan Nov 30 '15 at 09:51
  • To have a parent without relationship with modules is perfectly possible, in Maven aggregation and inheritance are two different mechanisms which can be mixed together or used in a completely separated way. That is, an aggregator project can have modules which can have other parents. Further question: why so many profiles? Why start/stop of jetty is in two different profiles? Do you really need to split it in two profiles? – A_Di-Matteo Nov 30 '15 at 10:31
  • No- I also have a profile that combine those two together with the tests (I've updated it in the question),Profile called "start-stop-app". – Shahar Hamuzim Rajuan Nov 30 '15 at 10:47
  • But if I use this profile it doesn't run the tests , because the tests are in the child module.and by the time he runs the jetty is already down. (I added the log in the question) – Shahar Hamuzim Rajuan Nov 30 '15 at 11:23

1 Answers1

2

Please let me clarify few important points which could also potentially solve your issue since I see some good practices may be missing in your approach:

  • Profiles should be used for optional/additional behaviors, while default build should always be SUCCESSFUL regardless of the declared profiles
  • If a module is supposed to execute tests and tests are only located in that module, then the profile should only be declared in that specific module and not in its parent. Moreover, in such a case a profile would also not be required since it would be the default module behavior. However, having a profile defined only in a module would allow you to switch it off even when executing the whole build from the parent. To switch off a profile simply use the ! or the - annotation: mvn clean install -P!profile-name as explained in the official documentation here. That will allow to ignore maven profiles in child module (to come to your questions) if the profile was only declared in that module.

You can apply the same concept to the generate-schema action: is it required in all modules? Probably not, then you can declare the profile only on the specific module requiring it and then switch it on/off as above (if by default should be on, then declare the profile as active by default).

Concerning jetty, integration tests requiring jetty should also be part of the same module, so that the module's build would follow the classic flow: start/test/stop. If you really need to have start, test and stop in different modules, then you can follow explanation on our previous question, here.

I would also suggest to go through the Profile Pitfalls of the Maven official documentation, again, here for a better understanding of profile usage and misuses.

Additionally, if of any help, you can even skip an entire module build as part of a multimodule maven build, using the command line -pl option. Check mvn -help for further details. As such you could supply the list of modules to build. Since maven 3.2.1 you can also supply the list of modules to skip as following: mvn -pl !module-to-skip install.

When using the ! notation for skipping profiles or modules, beware that it is also a special character for bash in linux, hence put it between single quotes (mvn -pl'!module-to-skip' install). The same doesn't work on Windows however, where double quotes should be used instead (mvn -pl "!module-to-skip" install`).

Additionally, to skip modules as part of the parent build, you could also define a profile in your parent POM which re-declares the modules section and omit the modules you want to skip, as explained in this other answer.

    ...
   <modules>
      <module>module1</module>
      <module>module2</module>  
      ...
  </modules>
  ...
  <profiles>
     <profile>
       <id>skip-some-modules-profile</id>
          <modules>
            <module>module1</module>
            ...
            <module>module-integration-test</module>
          </modules> 
      </profile>
  </profiles>
 ...

As such, you could craft a special multimodule build depending on the profile you want to execute.

All in all, beware that playing too much with profiles and modules which don't deliver any real artefact may affect your build readability and maintenance.

Community
  • 1
  • 1
A_Di-Matteo
  • 23,746
  • 7
  • 79
  • 112