2016-11-23 5 views
2

this вопрос: Не удается найти информацию о том, как создается объединение нескольких (активных) профилей maven при условии, что они являются , а не конфликтующими.Как разрешаются конфликтующие конфигурации, если активировано несколько профилей?

Рассмотрите следующий пример: Я хочу контролировать, как мои тестовые примеры выполняются с помощью maven-surefire-plugin. Сначала мне нужно настроить две разные среды (jenkins-CI-server) и локальные. Во-вторых, я хочу включить запуск различных наборов тестов. я бы четыре профиля:

  1. env_jenkins для работы на Дженкинс
  2. env_local для работы на местном
  3. testset_A для запуска некоторых тестов
  4. testset_B для выполнения некоторых других тестов

Примечания что для всех этих профилей мне нужно определить конфигурацию плагина для maven-surefire-plugin. (см. Ниже конкретную xml-конфигурацию)

Затем я хотел бы объединить профили для запуска - например, - testet A на jenkins.

Мои вопросы:

  • поддерживается ли такое поведение мавена?
  • На какой стадии происходит переопределение, указанное в the related question? Изменена ли вся конфигурация плагина (-> мой пример не работает). Или только реально конфликтующие части (-> мой пример будет работать)?
  • Является ли поведение переопределения зависящим от плагина или является ли оно единообразным среди всех плагинов maven?

Пример ПОМ:

<profiles> 
    <!-- handle system configurations (e.g. one for jenkins environment, one for local) --> 
    <profile> 
     <id>env_jenkins</id> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-surefire-plugin</artifactId> 
        <configuration> 
         <systemPropertyVariables> 
          <arquillian.launch>jbossas-managed</arquillian.launch> 
          <jbossHttpPortOverride>8080</jbossHttpPortOverride> 
         </systemPropertyVariables> 
        </configuration> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
    <profile> 
     <id>env_local</id> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-surefire-plugin</artifactId> 
        <configuration> 
         <systemPropertyVariables> 
           <arquillian.launch>jbossas-managed-jenkins</arquillian.launch> 
           <jbossHttpPortOverride>${jboss.http.port}</jbossHttpPortOverride> 
         </systemPropertyVariables> 
        </configuration> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
    <!-- define different test sets --> 
    <profile> 
     <id>testset_A</id> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-surefire-plugin</artifactId> 
        <configuration> 
         <includes> 
          <include>TestA1.java</include> 
          <include>TestA2.java</include> 
          <include>TestA3.java</include> 
         </includes> 
        </configuration> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
    <profile> 
     <id>testset_B</id> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-surefire-plugin</artifactId> 
        <configuration> 
         <includes> 
          <include>TestB1.java</include> 
         </includes> 
        </configuration> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 
+0

Независимо от того, что происходит на самом деле, почему вы пытаетесь это сделать? Вероятно, это можно решить без какого-либо профиля. Посмотрите на ['includesFile'] (http://maven.apache.org/components/surefire/maven-surefire-plugin/test-mojo.html#includesFile), чтобы указать, например, динамическое включение. Затем вы можете определить только два свойства для 'jbossHttpPortOverride' и' arquillian.launch', возможно, в профиле. – Tunaki

+0

@ Тунаки: спасибо за предложения для этого конкретного примера. Однако общая проблема - это часть maven, которую я не понимаю с тех пор. Поэтому я буду держать вопрос открытым. – fab

+0

Я ожидаю, что конфигурация наследуется между профилями, а в случае повторяющихся свойств - последний, объявленный в POM. Это может измениться с родительским/дочерним процессом, потому что вы можете объявить плагин ' false', чтобы ребенок не наследовал родительскую конфигурацию. – Tunaki

ответ

1

Он работает с использованием того же inheritance/merging process, который работает между родителями и детьми РОМ. Использование справки плагин Maven может подтвердить это (с использованием Maven 3.3.9):

  1. Орден деклараций профиля в вопросах ПОМ. Конфигурация плагина наследует ту же конфигурацию плагина, которая объявлена ​​в активном профиле, появляющемся перед ним в POM.

  2. Атрибуты combine.self и combine.children могут использоваться для управления слиянием.


Пример с параметрами по умолчанию (без использования combine.self или combine.children, т.е.с combine.children="merge" неявно):

mvn help:effective-pom -Penv_local,testset_A 

Эффективное ПОМ показывает объединенные конфигурации:

... 
<plugin> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.12.4</version> 
    <executions> 
     <execution> 
     <id>default-test</id> 
     <phase>test</phase> 
     <goals> 
      <goal>test</goal> 
     </goals> 
     <configuration> 
      <includes> 
      <include>TestA1.java</include> 
      <include>TestA2.java</include> 
      <include>TestA3.java</include> 
      </includes> 
      <systemPropertyVariables> 
      <arquillian.launch>jbossas-managed-jenkins</arquillian.launch> 
      <jbossHttpPortOverride>${jboss.http.port}</jbossHttpPortOverride> 
      </systemPropertyVariables> 
     </configuration> 
     </execution> 
    </executions> 
    <configuration> 
     <includes> 
     <include>TestA1.java</include> 
     <include>TestA2.java</include> 
     <include>TestA3.java</include> 
     </includes> 
     <systemPropertyVariables> 
     <arquillian.launch>jbossas-managed-jenkins</arquillian.launch> 
     <jbossHttpPortOverride>${jboss.http.port}</jbossHttpPortOverride> 
     </systemPropertyVariables> 
    </configuration> 
    </plugin> 
    ... 

Пример с combine.self="override":

<profile> 
    <id>testset_A</id> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <configuration combine.self="override"> 
        <includes> 
         <include>TestA1.java</include> 
         <include>TestA2.java</include> 
         <include>TestA3.java</include> 
        </includes> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</profile> 
mvn help:effective-pom -Penv_local,testset_A 

Эффективное ПОМ показывает только testset_A «ы конфигурации:

<plugin> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.12.4</version> 
    <executions> 
     <execution> 
     <id>default-test</id> 
     <phase>test</phase> 
     <goals> 
      <goal>test</goal> 
     </goals> 
     <configuration combine.self="override"> 
      <includes> 
      <include>TestA1.java</include> 
      <include>TestA2.java</include> 
      <include>TestA3.java</include> 
      </includes> 
     </configuration> 
     </execution> 
    </executions> 
    <configuration combine.self="override"> 
     <includes> 
     <include>TestA1.java</include> 
     <include>TestA2.java</include> 
     <include>TestA3.java</include> 
     </includes> 
    </configuration> 
    </plugin> 

Пример с combine.children="append":

<profile> 
    <id>testset_A</id> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <configuration combine.children="append"> 
        <includes> 
         <include>TestA1.java</include> 
         <include>TestA2.java</include> 
         <include>TestA3.java</include> 
        </includes> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</profile> 
mvn help:effective-pom -Penv_local,testset_A 

Effective POM показывает объединенные конфигурации. В этом случае это, похоже, совпадает с первым примером. Тем не менее, были введены testset_A элементы конфигурации XML, которые уже существуют в env_local, они были бы приложены:

<plugin> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.12.4</version> 
    <executions> 
     <execution> 
     <id>default-test</id> 
     <phase>test</phase> 
     <goals> 
      <goal>test</goal> 
     </goals> 
     <configuration combine.children="append"> 
      <systemPropertyVariables> 
      <arquillian.launch>jbossas-managed-jenkins</arquillian.launch> 
      <jbossHttpPortOverride>${jboss.http.port}</jbossHttpPortOverride> 
      </systemPropertyVariables> 
      <includes> 
      <include>TestA1.java</include> 
      <include>TestA2.java</include> 
      <include>TestA3.java</include> 
      </includes> 
     </configuration> 
     </execution> 
    </executions> 
    <configuration combine.children="append"> 
     <systemPropertyVariables> 
     <arquillian.launch>jbossas-managed-jenkins</arquillian.launch> 
     <jbossHttpPortOverride>${jboss.http.port}</jbossHttpPortOverride> 
     </systemPropertyVariables> 
     <includes> 
     <include>TestA1.java</include> 
     <include>TestA2.java</include> 
     <include>TestA3.java</include> 
     </includes> 
    </configuration> 
    </plugin> 
Смежные вопросы