PluginManagement мешает плагину тени

Только начал с 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-meunshade - плохая ветка, мастер - хорошая).

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

Не удалось выполнить цель org.apache.maven.plugins
Не удалось выполнить цель org.apache.maven.plugins
Опишу, что когда я только начинал изучать Maven, у меня не получалось компилировать и упаковывать.
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
0
0
623
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Plugin Management contains plugin elements in much the same way [than plugins], except that rather than configuring plugin information for this particular project build, it is intended to configure project builds that inherit from this one.

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

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

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

<pluginManagement> в основном используется, если вы хотите использовать наследование POM. В противном случае в простых проектах вы можете просто объявить их в разделе <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?

возможно, я не понял, о чем вы говорили: «Обратите внимание, что эти плагины по умолчанию не отображаются в вашем разделе POM <plugins>», но в моем pomm, когда он вышел из генератора, все эти плагины явно объявлены: raw.githubusercontent.com/alexakarpov/shade-me/master/pom.xm‌ l

alexakarpov 25.12.2018 19:50

спасибо приятель, я получил это через некоторое время. <pluginManagement> как бы объявляет плагины, которые будут использоваться, а раздел <plugins> - это то, что говорит им запускаться. что меня смутило, так это то, что внутри pluginsManagement тоже есть <plugins>; и удаление <pluginsManagement> полностью меняет значение <plugins> в нем =)

alexakarpov 25.12.2018 23:38

Другие вопросы по теме