Подтвердить что ты не робот

Увеличение вместо переопределения конфигурации Maven

Я видел этот вопрос, и это мотивировало меня снова (без успеха) смотреть в конфигурациях Maven для альтернативного способа объявления конфигурации, поэтому оно добавляется к родительскому POM config вместо его переопределения. В Maven POM, если конфигурация объявляет те же элементы, что и в родительском, она переопределяет конфигурацию родителей. Как утверждает принятый ответ на другой вопрос, это ожидаемое поведение.

Но это не всегда желаемое поведение. Должно ли/быть средство в Maven для добавления, а не переопределения конфигурации?

Например:  - Предоставить возможность объявлять элементы окончательной конфигурации, чтобы дети могли добавлять к ним, но не заменяли?  - Разрешить дочерней конфигурации объявлять элемент как дополнение, поэтому он объединяется с родительским


Хорошим примером того, когда поведение переопределения не всегда желательно, является элемент elementLibraries для аспектj-maven-plugin.

В моей родительской POM я определяю конфигурацию для плагина aspectj, который объявляет баннер трассировки, который будет использоваться в качестве библиотеки аспектов.

 <plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>aspectj-maven-plugin</artifactId>
   <executions>
     <execution>
     <id>compile_with_aspectj</id>
       <goals>
         <goal>compile</goal>
       </goals>
     </execution>
   </executions>
   <configuration>
     <aspectLibraries>
       <aspectLibrary>
         <groupId>name.seller.rich</groupId>
         <artifactId>tracing</artifactId>
       </aspectLibrary>
     </aspectLibraries>
   </configuration>
   <dependencies>
     <dependency>
       <groupId>aspectj</groupId>
       <artifactId>aspectjtools</artifactId>
       <version>1.5.3</version>
     </dependency>
   </dependencies>
</plugin>

Это унаследовано всеми дочерними проектами, и я получаю трассировку во всех проектах, что приятно. Однако, если я определяю другой файл aspectLibrary в дочернем POM, он заменяет мою конфигурацию трассировки.

Примечание. У меня есть обходной путь к этой конкретной проблеме. Меня интересует общий случай и последствия для Maven.

Простым ответом было бы переопределить конфигурацию баннера трассировки в дочерней POM, а также новую банку, но это имеет последствия для обслуживания, и если я хочу объявить конфигурацию трассировки в профиле, чтобы ее можно было отключить если это необходимо (что я и делаю), тогда мне нужно переопределить профиль в дочернем элементе.

Объявление зависимостей в приведенном выше примере объединяется с другими объявлениями зависимостей в родительском и в другом месте. Я знаю, что зависимости - это особый случай, но он показывает, что его можно реализовать.

4b9b3361

Ответ 1

Это объяснялось в сообщении в блоге от Sonatype.

В родительском pom укажите

<configuration>
  <aspectLibraries combine.children="append">
    <aspectLibrary>
      <groupId>name.seller.rich</groupId>
      <artifactId>tracing</artifactId>
    </aspectLibrary>
  </aspectLibraries>
</configuration>

В общем случае элементы конфигурации дочерних элементов будут переопределять те, которые указаны в родительском для любого данного плагина. По умолчанию это упрощает: полностью сконфигурированный ребенок будет использовать именно конфигурацию в своем pom. Тем не менее, родительский элемент может обеспечить, чтобы эти списки были расширены вместо замены, используя параметр comb.children = "append" на желаемых элементах конфигурации.

Ответ 2

Мне нужно проверить это, поэтому позвольте мне вернуться к вам, но я думаю, что правильный способ сделать это - использовать properties, как указано здесь. В вашем случае код выглядит следующим образом:

<properties>
  <aspect.library.groupId>name.seller.rich</aspect.library.groupId>
  <aspect.library.artifactId>tracing</aspect.library.artifactId>
</properties>

<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>aspectj-maven-plugin</artifactId>
   <executions>
     <execution>
     <id>compile_with_aspectj</id>
       <goals>
         <goal>compile</goal>
       </goals>
     </execution>
   </executions>
   <configuration>
     <aspectLibraries>
       <aspectLibrary>
         <groupId>${aspect.library.groupId}</groupId>
         <artifactId>${aspect.library.artifactId}</artifactId>
       </aspectLibrary>
     </aspectLibraries>
   </configuration>
   <dependencies>
     <dependency>
       <groupId>aspectj</groupId>
       <artifactId>aspectjtools</artifactId>
       <version>1.5.3</version>
     </dependency>
   </dependencies>
</plugin>

Затем в ребёнке вы сможете изменить эти свойства, и родитель автоматически получит новые значения:

<properties>
  <aspect.library.groupId>name.seller.rich</aspect.library.groupId>
  <aspect.library.artifactId>something-else</aspect.library.artifactId>
</properties>

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