У меня есть pom.xml
, который использовал maven-jar-plugin
для шага package
. Я попытался изменить это на maven-assembly-plugin
для того же шага жизненного цикла, однако вывод mvn package
подсказывает мне, что изменения не были учтены.
Вот результат mvn package
после mvn clean
. (Последние строки.)
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ sort-list ---
[INFO] Building jar: /home/debian/Java/Sort-List/sort-list/target/sort-list-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.780 s
[INFO] Finished at: 2023-04-08T16:24:35+01:00
[INFO] ------------------------------------------------------------------------
Как вы можете видеть выше, он печатает maven-jar-plugin:2.4
. Почему печатается это, а не что-то из maven-assembly-plugin
? Это говорит мне о том, что запущен «неправильный» плагин. Но я не понимаю, почему.
Вот мой полный pom.xml
. Я закомментировал существующий maven-jar-plugin
и заменил его на maven-assembly-plugin
.
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.sortlist</groupId>
<artifactId>sort-list</artifactId>
<version>1.0-SNAPSHOT</version>
<name>sort-list</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<!--
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.mycompany.sortlist.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.mycompany.sortlist.App</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
С предыдущей версией этого POM я смог построить .jar
и успешно его выполнить.
Некоторая информация была взята из ответа на этот вопрос: maven-jar-plugin mainClass - не удалось найти или загрузить основной класс
В чем причина использования плагина maven-assembly?
@khmarbaise По какой причине его не использовать?
Это не отвечает на вопрос и не помогает понять причины, по которым вы интегрировали это в свою настройку?
@khmarbaise Я понятия не имею, что ты пытаешься сказать
Каждый плагин Maven (даже ваш собственный) может привязать одну или несколько целей к этапу жизненного цикла.
<plugins>
<plugin>
<groupId>foo.bar</groupId>
<artifactId>baz-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<id>an-execution-id</id>
<phase>process-resources</phase> <!-- lifecycle phase -->
<goals>
<goal>bazinga</goal> <!-- goal that bound to lifecycle phase -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
Теперь сборка Maven (например, пакет) mvn package
будет выполнять foo.bar:baz-maven-plugin:1.0.0:bazinga
цель, когда сборка входит в фазу process-resources
.
Также в Maven есть основная концепция, называемая соглашением по конфигурации. Основываясь на этой концепции, не нужно настраивать ничего особенного, если у них есть значение по умолчанию.
Этот простой pom.xml
скомпилирует, запустит тесты, создаст пакет, а также сможет установить упакованный артефакт в локальный репозиторий, если вы запустите mvn package
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.sortlist</groupId>
<artifactId>sort-list</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
spinner@bistromath:/work/source/so-75966110$ mvn install
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< com.mycompany.sortlist:sort-list >------------------
[INFO] Building sort-list 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ sort-list ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ sort-list ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /work/source/so-75966110/target/classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ sort-list ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /work/source/so-75966110/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ sort-list ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ sort-list ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ sort-list ---
[INFO] Building jar: /work/source/so-75966110/target/sort-list-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ sort-list ---
[INFO] Installing /work/source/so-75966110/target/sort-list-1.0-SNAPSHOT.jar to /work/data/maven/com/mycompany/sortlist/sort-list/1.0-SNAPSHOT/sort-list-1.0-SNAPSHOT.jar
[INFO] Installing /work/source/so-75966110/pom.xml to /work/data/maven/com/mycompany/sortlist/sort-list/1.0-SNAPSHOT/sort-list-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.430 s
[INFO] Finished at: 2023-04-08T18:35:40+02:00
[INFO] ------------------------------------------------------------------------
Как видите, несколько плагинов активировались на разных этапах жизненного цикла сборки, но ничего не было настроено в проекте pom.xml
.
Это связано с тем, что наиболее распространенные плагины Maven уже настроены в Super POM.
С этим простым pom.xml
просто беги
mvn help:effective-pom
Эта цель
Отображает действующий POM в виде XML для этой сборки с учетом активных профилей или указанного артефакта. Если текст подробный, к каждому элементу XML, описывающему происхождение строки, добавляется комментарий.
Соответствующая часть подробного вывода:
<build>
<!-- .... -->
<plugins>
<!-- .... -->
<plugin>
<artifactId>maven-jar-plugin</artifactId> <!-- org.apache.maven:maven-core:3.8.4:default-lifecycle-bindings -->
<version>2.4</version> <!-- org.apache.maven:maven-core:3.8.4:default-lifecycle-bindings -->
<executions>
<execution>
<id>default-jar</id> <!-- org.apache.maven:maven-core:3.8.4:default-lifecycle-bindings -->
<phase>package</phase> <!-- org.apache.maven:maven-core:3.8.4:default-lifecycle-bindings -->
<goals>
<goal>jar</goal> <!-- org.apache.maven:maven-core:3.8.4:default-lifecycle-bindings -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Теперь вы можете видеть, что maven-jar-plugin
автоматически привязывается к фазе package
. Поэтому, если вы просто удалите эту конфигурацию плагина из проекта pom.xml
, он будет использовать унаследованную конфигурацию от Super POM.
Однако я не рекомендую отключать плагин jar, вы можете сделать это, переопределив базовую конфигурацию и назначив это выполнение фазе, которая никогда не запускается. Эта фаза называется none
.
Чтобы отключить плагин jar, используйте эту конфигурацию
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.sortlist</groupId>
<artifactId>sort-list</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<id>default-jar</id>
<phase>none</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
ОБНОВЛЕНИЕ для активации maven-assembly-plugin
.
В pom.xml
есть два раздела для настройки плагинов.
<build>
<pluginManagement>
<plugins>
<plugin>
<!-- -->
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<!-- -->
</plugin>
</plugins>
</build>
Из документации
pluginManagement: это элемент, который отображается рядом с дополнительными плагинами. Управление подключаемыми модулями содержит элементы подключаемых модулей во многом таким же образом, за исключением того, что вместо настройки информации о подключаемых модулях для этой конкретной сборки проекта оно предназначено для настройки сборок проектов, которые наследуются от этой. Однако это настраивает только те плагины, на которые фактически ссылаются в элементе plugins в дочерних элементах или в текущем POM. Дети имеют полное право переопределять определения pluginManagement.
Итак, в разделе <pluginManagement>
вы можете настроить общие параметры (например, в многомодульном проекте) определенного плагина.
В разделе <build><plugins>
вы можете установить конкретный вызов плагина.
<pluginManagement>
является необязательным, но все настроенные параметры могут быть переопределены в разделе <plugins>
.
Чтобы выполнить цель плагина, она должна быть определена в разделе <plugins>
.
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.sortlist</groupId>
<artifactId>sort-list</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<!-- specify version and default lifecycle binding WITHOUT execution -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<id>default-jar</id>
<phase>none</phase>
</execution>
</executions>
</plugin>
<plugin>
<!-- add project specific configuration AND execute previously configured goal -->
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.mycompany.sortlist.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
Конечно, если вы не хотите или не нуждаетесь в управлении этим плагином, конфигурация может быть объединена в <plugins>
, и тогда запись в <pluginManagement>
больше не требуется.
Хорошо спасибо. Где этот супер пом находится, для интереса? И почему мой pom не запускает плагин сборки?
Super POM находится под домом maven [MAVEN_HOME]/lib/maven-model-builder-[maven-version].jar:org/apache/maven/model/pom-4.0.0.xml
Я обновлю свой ответ, чтобы включить плагин сборки.
Ответ @FreelanceConsultant только что был обновлен с подробностями о вызове плагина сборки.
Спасибо за ваш подробный ответ. Для меня это поднимает последний вопрос. Какой смысл в pluginManagement
, если у меня есть только один pom.xml
? У меня нет детских помпонов, так что не станет ли это излишним?
В этом случае все определения можно поместить под <plugins>
. <pluginManagement>
дает дополнительную возможность для некоторой «абстракции». Честно говоря, я бы также поместил всю конфигурацию плагина сборки в раздел <plugins>
. Я просто попытался проиллюстрировать, как эти разделы работают вместе.
Спасибо, это проясняет для меня основную путаницу. Если у плагина есть XML-тег execution
и/или configuration
, должен ли этот материал execution
/configuration
находиться в разделе «плагины» или в разделе «Управление плагинами->плагины»?
1. Связывание плагинов для упаковки jar 2. Если упаковка не объявлена, Maven предполагает, что упаковка является упаковкой по умолчанию: jar