Только начал с 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 ..


Роль <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?
спасибо приятель, я получил это через некоторое время. <pluginManagement> как бы объявляет плагины, которые будут использоваться, а раздел <plugins> - это то, что говорит им запускаться. что меня смутило, так это то, что внутри pluginsManagement тоже есть <plugins>; и удаление <pluginsManagement> полностью меняет значение <plugins> в нем =)
возможно, я не понял, о чем вы говорили: «Обратите внимание, что эти плагины по умолчанию не отображаются в вашем разделе POM <plugins>», но в моем pomm, когда он вышел из генератора, все эти плагины явно объявлены: raw.githubusercontent.com/alexakarpov/shade-me/master/pom.xm l