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


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

[ошибка] не удалось выполнить целевую организацию.апаш.знаток.Плагины: 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.

2 15

2 ответа:

Плагин 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 не указана.

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

<execution>
    <id>default-jar</id>
    <phase>package</phase>
    <goals>
        <goal>jar</goal>
    </goals>
</execution>