pluginManagement мешает плагину Shade - PullRequest
0 голосов
/ 25 декабря 2018

Только что начал с Maven по-настоящему;Я получил большой сюрприз сразу.

Я понимаю (или думаю, что понимаю) концепцию толстых банок / банок.Упакуйте ваш код со всеми зависимостями и т. Д. maven-shade-plugin, нашел документы, какой-то пример, проверил, что он работает.Теперь добавьте его в мой POC-проект, который пришел из maven-archetype-quickstart - что может пойти не так, а?

Короче говоря, быстрый старт организовать следующим образом:

<build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
         <plugin>
          ...

Так что я просто добавил плагин для затенения, готовый назвать его днем:

<!-- Maven Shade Plugin -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.3</version>
        <executions>
          <!-- Run shade goal on package phase -->
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>

Не так быстро.Во-первых, я заметил, что mvn clean package не упоминал, что выполняется maven-shade-plugin (как это делал рабочий пример).Последовали часы поисков, и я смотрел в лицо "первопричину" - <pluginManagement>, предложенный архетипом быстрого старта, было ли это - как-то .Удаление этого тега волшебным образом позволило maven.shade.plugin выполнять свою работу.В противном случае, нет.

(Реплика: https://github.com/alexakarpov/shade-me unshade - это плохая ветвь, мастер - хорошая).

Поговорим о нарушении принципа наименьшего сюрприза, а =) Может кто-нибудь объяснить, что происходит?Комментарий в сгенерированном pom упомянул кое-что о родительском pom, но я пока ничего не делаю с настройкой multi-pom ..

1 Ответ

0 голосов
/ 25 декабря 2018

<pluginManagement> роль описана в документации Maven :

Управление плагинами содержит элементы плагинов во многом таким же образом [чем плагины], за исключением того, что вместо настройки информации о плагинедля этой конкретной сборки проекта он предназначен для настройки сборок проекта, которые наследуются от этой.

Его цель здесь, в проекте, сгенерированном архетипом, - установить указанные версии плагинов по умолчанию (maven-clean-plugin, maven-jar-plugin, ...).Обратите внимание, что эти плагины по умолчанию не отображаются в разделе POM <plugins>, но они объявлены неявно (вы можете проверить это, запустив mvn help:effective-pom).

Но добавление плагина вСекция <pluginManagement> не делает ваш проект вызовом этого плагина.Здесь вы можете просто установить конфигурацию и версию плагина, который вы хотите использовать.Чтобы вызвать плагин, вам необходимо объявить его в разделе <plugins>.

В некоторых проектах (в большинстве случаев это многомодульные проекты), вы можете увидеть плагин и его конфигурацию, объявленную в <pluginManagement> родительского элемента.POM, а затем ссылается на секцию <plugins> модулей, нуждающихся в вызове этого плагина: таким образом, вам не нужно повторять одну и ту же конфигурацию для каждого модуля.

<pluginManagement> чаще всего используется, если вы хотите использоватьНаследование ПОМ.В противном случае для простых проектов вы можете просто объявить их в разделе <plugins>.Я также видел несколько проектов, определяющих всю конфигурацию в <pluginManagement>, просто чтобы сделать секцию <plugins> короче и более читабельной, как в следующем примере.Это просто вопрос вкуса.

<build>
    <!-- pluginManagement section : set versions and configurations -->
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <!-- Run shade goal on package phase -->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
              </plugin>
        </plugins>
    </pluginManagement>

    <!-- plugins section : plugins that are invoked when building the project -->
    <plugins>
        <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Вы также можете прочитать больше о StackOverflow: Maven: Что такое pluginManagement?

...