Почему Maven запускает maven-jar-plugin, когда я указал maven-assembly-plugin в pom.xml?

У меня есть 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 08.04.2023 21:09

@khmarbaise По какой причине его не использовать?

FreelanceConsultant 08.04.2023 23:19

Это не отвечает на вопрос и не помогает понять причины, по которым вы интегрировали это в свою настройку?

khmarbaise 10.04.2023 13:24

@khmarbaise Я понятия не имею, что ты пытаешься сказать

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

Ответы 1

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

Каждый плагин 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 не запускает плагин сборки?

FreelanceConsultant 08.04.2023 19:17

Super POM находится под домом maven [MAVEN_HOME]/lib/maven-model-builder-[maven-version].jar:org‌​/apache/maven/model/‌​pom-4.0.0.xml Я обновлю свой ответ, чтобы включить плагин сборки.

zforgo 08.04.2023 19:23

Ответ @FreelanceConsultant только что был обновлен с подробностями о вызове плагина сборки.

zforgo 08.04.2023 20:01

Спасибо за ваш подробный ответ. Для меня это поднимает последний вопрос. Какой смысл в pluginManagement, если у меня есть только один pom.xml? У меня нет детских помпонов, так что не станет ли это излишним?

FreelanceConsultant 08.04.2023 23:14

В этом случае все определения можно поместить под <plugins>. <pluginManagement> дает дополнительную возможность для некоторой «абстракции». Честно говоря, я бы также поместил всю конфигурацию плагина сборки в раздел <plugins>. Я просто попытался проиллюстрировать, как эти разделы работают вместе.

zforgo 09.04.2023 08:16

Спасибо, это проясняет для меня основную путаницу. Если у плагина есть XML-тег execution и/или configuration, должен ли этот материал execution/configuration находиться в разделе «плагины» или в разделе «Управление плагинами->плагины»?

FreelanceConsultant 09.04.2023 10:59

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