Дополнение вместо переопределения конфигурации Maven - PullRequest
19 голосов
/ 09 июля 2009

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

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

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


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

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

 <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>

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

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

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

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

Ответы [ 2 ]

22 голосов
/ 10 июля 2009

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

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

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

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

2 голосов
/ 09 июля 2009

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

<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>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...