Что такое pluginManagement в Maven pom.xml?

Это фрагмент моего файла pom.

....
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.4</version>                        
                <executions>
                    <execution>
                        <phase>install</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            ......
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
...

Успешно использую с командой

mvn install

Но когда я пытаюсь заключить его в тег pluginManagement, maven-dependency-plugin перестает работать, когда я запускаю цель install. Почему тег pluginManagement изменяет поведение сборки? Или я должен использовать другую цель или вариант?


person Andrea Borgogelli Avveduti    schedule 07.05.2012    source источник


Ответы (5)


Вам еще нужно добавить

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
    </plugin>
</plugins>

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

Из документации Maven:

pluginManagement: это элемент, который отображается рядом с подключаемыми модулями. Управление подключаемыми модулями содержит элементы подключаемых модулей примерно таким же образом, за исключением того, что вместо настройки информации о подключаемых модулях для этой конкретной сборки проекта оно предназначено для настройки сборок проекта, которые наследуются от этой сборки. Однако это настраивает только плагины, на которые фактически ссылаются в дочернем элементе plugins. У детей есть полное право переопределить определения pluginManagement.

person jordeu    schedule 07.05.2012

Разница между <pluginManagement/> и <plugins/> в том, что <plugin/> под:

  • <pluginManagement/> определяет настройки плагинов, которые будут унаследованы модулями в вашей сборке. Это отлично подходит для случаев, когда у вас есть родительский файл pom.

  • <plugins/> - это раздел для фактического вызова плагинов. Он может быть унаследован или не унаследован от <pluginManagement/>.

Вам не нужно иметь <pluginManagement/> в вашем проекте, если это не родительский POM. Однако, если это родительский pom, то в дочернем pom вам необходимо иметь такое объявление, как:

<plugins>
    <plugin>
        <groupId>com.foo</groupId>
        <artifactId>bar-plugin</artifactId>
    </plugin>
</plugins>

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

Для получения более подробной информации вы можете проверить:

person carlspring    schedule 07.05.2012
comment
Спасибо за ваш ответ. Мне нужно смешать pluginManagement и тег plugin (для maven-dependency-plugin) в одном файле pom, потому что мне нужно обойти небольшую ошибку плагина M2E Eclipse IDE. См. stackoverflow.com/questions/8706017/ - person Andrea Borgogelli Avveduti; 07.05.2012
comment
Спасибо! :) Это то же самое для <dependency/> и <dependencyManagement/>. Вы определяете зависимости (вместе с их версиями и областями действия, если хотите) в разделе <dependencyManagement/>, а затем в разделе <dependencies/> вы просто определяете groupId и artifactId. - person carlspring; 28.09.2012
comment
если мне нужно запустить плагин дважды, следует ли мне использовать управление плагинами? - person Kalpesh Soni; 05.06.2014
comment
@KalpeshSoni: Это зависит от обстоятельств - вы можете захотеть иметь общую конфигурацию между двумя исполнениями, которую вы не хотите переопределять. - person carlspring; 23.06.2016

Вы используете pluginManagement в parent pom, чтобы настроить его на случай, если какой-либо child pom захочет его использовать, но не каждый дочерний плагин хочет его использовать. Примером может быть то, что ваш super pom определяет некоторые параметры для плагина maven Javadoc.

Не каждый child pom может захотеть использовать Javadoc, поэтому вы определяете эти значения по умолчанию в разделе pluginManagement. Дочерний pom, который хочет использовать подключаемый модуль Javadoc, просто определяет раздел подключаемого модуля и наследует конфигурацию из определения pluginManagement в parent pom.

person Wim Deblauwe    schedule 07.05.2012
comment
Спасибо. Я просто хочу смешать теги pluginManagement и plugin в одном файле pom, потому что мне нужно обойти небольшую ошибку плагина M2E для Eclipse. См. stackoverflow.com/questions/8706017/ - person Andrea Borgogelli Avveduti; 07.05.2012

pluginManagement: это элемент, который отображается рядом с дополнительными модулями. Управление подключаемыми модулями содержит элементы подключаемых модулей примерно таким же образом, за исключением того, что вместо настройки информации о подключаемых модулях для этой конкретной сборки проекта оно предназначено для настройки сборок проекта, которые наследуются от этой сборки. Однако это настраивает только плагины, на которые фактически ссылаются в дочернем элементе plugins. У детей есть полное право переопределить определения pluginManagement.

Из http://maven.apache.org/pom.html#Plugin%5FManagement

Скопировано с:

Maven2 - проблема с pluginManagement и отношениями родитель-потомок

person ant    schedule 07.05.2012

Итак, если я хорошо понял, я бы сказал, что <pluginManagement>, как и <dependencyManagement>, оба используются для обмена только конфигурацией между родительским модулем и его подмодулями.

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

Напротив, <dependencies> и <plugins> наследуются вместе со своими конфигурациями и не должны повторно объявляться в подмодулях, иначе может возникнуть конфликт.

это правильно ?

person velocity    schedule 05.08.2020