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