Maven JAR Plugin 3.0.2 Ошибка: необходимо использовать классификатор для присоединения дополнительных артефактов к проекту вместо их замены.

Плагин Maven JAR (версия 3.0.2) продолжает выдавать следующую ошибку, даже при однократном вызове цели jar:

[ОШИБКА] Не удалось выполнить цель org.apache.maven.plugins: maven-jar-plugin: 3.0.2: jar (по умолчанию) при тестировании проекта: необходимо использовать классификатор для присоединения дополнительных артефактов к проекту вместо их замены . -> [Справка 1]

Вот (минимальный?) pom.xml, который демонстрирует проблему:

<project xmlns="http://maven.apache.org/POM/4.0.0">
  <modelVersion>4.0.0</modelVersion>

  <groupId>test</groupId>
  <artifactId>test</artifactId>
  <version>1.0.0-SNAPSHOT</version>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.0.2</version>
        <executions>
          <execution>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

Вызов просто mvn package.

  • Кажется, не имеет значения, есть ли вообще какие-либо классы / ресурсы - указанное выше сообщение об ошибке все равно появляется.
  • Проблема также возникает, если указаны две цели (jar и test-jar).
  • Проблема НЕ появляется, если не указаны цели. Но это не вариант, так как мне действительно нужны и jar, и test-jar.

Согласно документации classifier необходимо только быть указанным для нескольких вызовов одной и той же цели, и есть разумное значение по умолчанию для test-jar цели, которое я не собираюсь изменять.

Кроме того, похоже, что проблема не проявляется в строке 2.x подключаемого модуля JAR.

Я что-то пропустил? Может ли кто-нибудь предложить, что я делаю неправильно?

P.S. Версия Maven - 3.3.9.


person Alex Shesterov    schedule 04.12.2016    source источник


Ответы (3)


Плагин Jar фактически запускается дважды с конфигурацией:

<plugin>
  <artifactId>maven-jar-plugin</artifactId>
  <version>3.0.2</version>
  <executions>
    <execution>
      <goals>
        <goal>jar</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Если вы проверите логи с такой конфигурацией, у вас будет что-то вроде:

[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ test ---
[INFO] Building jar: ...\test\target\test-0.0.1-SNAPSHOT.jar
[INFO] 
[INFO] --- maven-jar-plugin:3.0.2:jar (default) @ test ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------

Это означает, что плагин фактически запускался дважды. Что происходит, так это то, что подключаемый модуль Jar в проекте с упаковкой jar имеет выполнение по умолчанию, привязанное к package фазе. Это выполнение по умолчанию упоминается в журналах с идентификатором default-jar.

Когда вы настраивали <execution> в подключаемом модуле, вы фактически настраивали новое выполнение, при котором должна быть вызвана jar цель подключаемого модуля. Поскольку jar цель по умолчанию привязана к фазе package , это выполнение выполняется на этом этапе после привязки по умолчанию, присущей упаковке jar. И поскольку плагин уже запущен, он не работает, потому что его повторный запуск фактически заменит основной артефакт, уже созданный во время первого запуска. Эта ошибка была добавлена ​​в версию 3.0.0 плагина в MJAR-198, потому что такое происходит, скорее всего, из-за неправильной конфигурации, которую следует обнаружить на ранней стадии.

Таким образом, исправление простое: не выполняйте выполнение, которое задает цель jar, и позвольте цели по умолчанию (исходящей из jar упаковки) выполнять свою работу. JAR все равно будет создан, даже без явной конфигурации цели jar, благодаря выполнению по умолчанию. Если вам также нужен тестовый JAR, вы будете по-прежнему необходимо настроить плагин для этого с помощью:

<plugin>
  <artifactId>maven-jar-plugin</artifactId>
  <version>3.0.2</version>
  <executions>
    <execution>
      <goals>
        <goal>test-jar</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Но учтите, что цель jar не указана.

person Tunaki    schedule 04.12.2016
comment
Спасибо за объяснение - я столкнулся с проблемой, хотя я установил упаковку на войну (а не jar), но удаление пакета ‹phase› ‹/phase› внутри jar-плагина устранило проблему. - person Vering; 17.11.2017
comment
Я получаю эту ошибку только при настройке нескольких модулей только в среде, использующей jenkins и linux. На компьютере Mac OS все работает, и они также работают в среде Travis CI. Кажется, происходит еще одна уловка, которая расстраивает. IMHO сообщение об ошибке больше сбивает с толку, чем помогает, и указывает только на эту статью о stackoverflow. - person Wolfgang Fahl; 09.04.2018

Если в ваших журналах отображается что-то вроде:

[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ test --
[WARNING] JAR will be empty - no content was marked for inclusion!

Добавление одного бесполезного класса в src / main / java, похоже, решает проблему, см.:

http://maven.40175.n5.nabble.com/quot-mvn-clean-verify-deploy-quot-causes-jar-plugin-to-execute-twice-td5877166.html

person Wolfgang Fahl    schedule 13.02.2019
comment
Спасибо за ссылку! Также упоминается случай вызова mvn clean verify deploy, который выполняет все до тех пор, пока не проверяется дважды. В моем случае развертывание mvn clean install сломалось, но mvn clean deploy сработало. (У меня тоже была пустая JAR.) - person Hans-Peter Störr; 07.08.2019

В моем случае я установил идентификатор выполнения как default-jar, после чего ошибка исчезла. например

<execution>
    <id>default-jar</id>
    <phase>package</phase>
    <goals>
        <goal>jar</goal>
    </goals>
</execution>
person Derik    schedule 19.12.2016
comment
Это работает, но основано на том факте, что использование default-jar в качестве идентификатора выполнения отменяет выполнение по умолчанию из упаковки jar. Это своего рода хитрость, и есть лучшее решение. - person Tunaki; 28.12.2016