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

266

Это фрагмент моего файла 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" меняет поведение сборки? Или я должен использовать другую цель или вариант?

Андреа Боргогелли Авведути
источник

Ответы:

299

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

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

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

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

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

jordeu
источник
266

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

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

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

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

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

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

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

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

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

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

Вим Деблавве
источник
Спасибо. Я просто хочу смешать теги pluginManagement и plugin в одном файле pom, потому что мне нужно обойти небольшую ошибку в плагине M2E для Eclipse. Смотрите stackoverflow.com/questions/8706017/...
Andrea Borgogelli Avveduti
3

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

От http://maven.apache.org/pom.html#Plugin%5FManagement

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

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

муравей
источник