2015-11-28 9 views
0

Я хочу, чтобы запустить простой поток, у меня есть 6 профилей:Как игнорировать профили maven в дочернем модуле?

генерировать-схема, распаковывать войны, вводное мол, тест, стоп-молы, старт-стоп-приложение

тест профиль будет запущен на другом дочернем модуле, когда я объявляю его в целях/свойствах mvn: * clean -activate-profiles generate-schema, unpack-war, start-stop-app, test -projects apm-tests, apm-tests \ apm-adapter-tests подтверждают. *

Как я могу заставить дочерний модуль запускать только те тесты и пропускать остальные профилей (генерация-схема и т. д.)?

Родитель ПОМ образец:

<?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 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] Начало Jetty сервера 13:03:13 [INFO]

13:03:13 [INFO] --- Maven-безошибочный-плагин: 2,16: тест (интеграция -test)

@ apm-tests --- 13:03:14 [INFO] Нет тестов для запуска. 13:03:14 [INFO]

13:03:14 [INFO] --- Пристань-Maven-плагин: 9.1.3.v20140225: остановка

(стоп-причал) @ APM-тесты --- 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: Остановился

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

13:03:14 [INFO] --- Maven-источник-плагин: 2.2.1: тест-банку-нет вилки

(прикрепляются-тест-источники) @ ALM-тесты --- 13:03:14 [INFO]

13:03:14 [INFO]

- -------------- 13:03:14 [INFO] Строительство agm-synchronizer-adapter-testing

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

+0

Некоторые вопросы: нормально ли, чтобы дочерний модуль имел pom в качестве упаковки, когда он предназначен для выполнения тестов? Модуль/проект по упаковке pom не предназначен для предоставления какого-либо исходного/тестового исходного кода.Более того, у описанного родителя и ребенка нет какой-либо связи между ними (родитель не имеет дочернего элемента среди своих модулей, у ребенка нет родителя как родителя), это специально? –

+0

@ A.DiMatteo Ok. Таким образом, упаковка детского модуля - pom, но я хочу запустить его как тест, но когда я объявил его как тест, у меня появилась ошибка. Я хочу, чтобы у родителя не было никаких отношений с ребенком (если это возможно), но родительский родитель действительно является родительским pom.xml (исправлено это тоже). И цель все еще заключается в том, что отец будет запускать все профили, а ребенок будет запускать тесты. - –

+0

Для того чтобы иметь родителя без связи с модулями, вполне возможно, в Maven агрегация и наследование являются двумя различными механизмами, которые могут быть объединены или использованы полностью разделенным образом. То есть, в агрегаторном проекте могут быть модули, которые могут иметь других родителей. Дальше вопрос: почему так много профилей? Почему запуск/остановка пристани в двух разных профилях? Вам действительно нужно разделить его на два профиля? –

ответ

1

Прошу пояснить несколько важных моментов, которые могут также потенциально решить вашу проблему, поскольку я вижу, что некоторые хорошие практики могут отсутствовать в своем подходе:

  • Профили должны использоваться для дополнительного/дополнительных поведения, в то время как по умолчанию сборка должна быть всегда SUCCESSFUL независимо от заявленных профилей
  • Если модуль должен выполнять тесты и тесты только расположены в этом модуле профиль должен быть объявлен только в этом конкретном модуле, а не в его родительском. Более того, в таком случае профиль также не требуется, так как это будет поведение модуля по умолчанию. Однако наличие профиля, определенного только в модуле, позволит вам отключить его даже при выполнении всей сборки из родителя. Чтобы отключить профиль, просто используйте ! или аннотацию -: mvn clean install -P!profile-name, как описано в официальной документации here. Это позволит игнорировать профили maven в дочернем модуле (чтобы ответить на ваши вопросы), если профиль был объявлен только в этом модуле.

Вы можете применить ту же концепцию к действию generate-schema: требуется ли это во всех модулях? Вероятно, нет, тогда вы можете объявить профиль только на конкретном модуле, требующем его, а затем включить или выключить его, как указано выше (если по умолчанию должно быть включено, а затем объявить профиль активным по умолчанию).

Что касается причала, интеграционные испытания, требующие причала, также должны быть частью одного и того же модуля, так что сборка модуля будет следовать классическому потоку: запуск/испытание/остановка. Если вам действительно нужно начинать, тестировать и останавливать в разных модулях, вы можете следовать объяснениям по нашему предыдущему вопросу, here.

Я также предлагаю прочесть обзорные ловушки официальной документации Maven, here, чтобы лучше понять использование профилей и злоупотребления.

Кроме того, при любой помощи вы можете даже пропустить сборку всего модуля как часть многомодовой сборки maven, используя опцию командной строки -pl. Проверьте mvn -help для получения дополнительной информации. Таким образом, вы можете предоставить список модулей для сборки. Так как maven 3.2.1 вы также можете указать список модулей, пропустите следующее: mvn -pl !module-to-skip install.

При использовании ! обозначения для пропуска профилей или модулей, нужно учитывать, что это также специальный символ для Баша в Linux, следовательно, положить его между одинарными кавычками (mvn -pl'!module-to-skip' install). The same doesn't work on Windows however, where double quotes should be used instead ( МВНЫ -pl «! Модуль для пропуска» install`) ,

Кроме того, чтобы пропустить модули как часть родительской сборки, вы также можете определить профиль в родительском POM, который повторно объявляет раздел модулей и пропускает модули, которые вы хотите пропустить, как объясняется в этом другом 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> 
... 

Таким образом, вы можете создать специальную многомодульную сборку в зависимости от профиля, который хотите выполнить.

В целом, будьте осторожны, что слишком много играть с профилями и модулями, которые не доставляют никакого реального артефакта, могут повлиять на читаемость и обслуживание сборки.