Увеличение вместо переопределения конфигурации 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, а также новую банку, но это имеет последствия для обслуживания, и если я хочу объявить конфигурацию трассировки в профиле, чтобы ее можно было отключить если это необходимо (что я и делаю), тогда мне нужно переопределить профиль в дочернем элементе.
Объявление зависимостей в приведенном выше примере объединяется с другими объявлениями зависимостей в родительском и в другом месте. Я знаю, что зависимости - это особый случай, но он показывает, что его можно реализовать.
Ответы
Ответ 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 в вашей дочерней конфигурации на одном из указанных в вашем родителе. В этом случае я не могу придумать очевидное решение.