почему для компиляции mvn требуется зависимость test-jar

У меня возникли проблемы с использованием зависимостей test-jar в многомодульном проекте. Например, когда я объявляю, что модуль cleartk-syntax зависит от test-jar модуля cleartk-token, вот так (полный код здесь) :

<modelVersion>4.0.0</modelVersion>
<groupId>org.cleartk</groupId>
<artifactId>cleartk-syntax</artifactId>
<version>0.5.0-SNAPSHOT</version>
<name>cleartk-syntax</name>
...
<dependencies>
    ...
    <dependency>
        <groupId>org.cleartk</groupId>
        <artifactId>cleartk-token</artifactId>
        <version>0.7.0-SNAPSHOT</version>
        <type>test-jar</type>
        <scope>test</scope>
    </dependency>

Я получаю следующую ошибку, если запускаю mvn compile с помощью maven 2:

[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.

Missing:
----------
1) org.cleartk:cleartk-token:test-jar:tests:0.7.0-SNAPSHOT

Если я использую maven 3, я получаю сообщение об ошибке:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.654s
[INFO] Finished at: Mon Jan 24 21:19:17 CET 2011
[INFO] Final Memory: 16M/81M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project cleartk-syntax: Could not resolve
dependencies for project org.cleartk:cleartk-syntax:jar:0.5.0-SNAPSHOT: Could
not find artifact org.cleartk:cleartk-token:jar:tests:0.7.0-SNAPSHOT

В последнем случае я особенно запутался, потому что я думал, что он должен искать артефакт типа test-jar, а не типа jar.

С maven 2 или maven 3 я могу скомпилировать его, запустив mvn compile package -DskipTests. С maven 3 я также могу скомпилировать его, запустив mvn compile test-compile.

Но почему maven 2 или maven 3 ищут зависимость test-jar на этапе compile? Не следует ли дождаться фазы test-compile для поиска таких зависимостей?

Обновление: Ответ заключался в том, что maven-exec-plugin, используемый на этапе компиляции, требуется разрешение зависимостей артефактов в области видимости: тест. Я создал запрос функции, чтобы удалить зависимость scope:test.


person Steve    schedule 24.01.2011    source источник


Ответы (4)


Это выглядит как определенная ошибка для меня.

У меня такая же проблема, и я тестировал Maven 3.0.1 и 3.0.2. Validate не терпит неудачу, только шаг компиляции терпит неудачу. С Maven 3 mvn compile ломается, но mvn test-compile работает.

Похоже, что на этапе компиляции артефакты test-jar ищутся в реакторе, а затем в репозитории, но этого не должно быть, поскольку зависимость находится в области тестирования. Артефакты области тестирования должны быть разрешены во время тестовой компиляции, а не компиляции.

В результате я подумал, что это можно обойти, сопоставив цель testCompile maven-compiler-plugin с фазой компиляции вместо фазы тестовой компиляции по умолчанию.

Я добавил это в свой pom, прямо рядом с частью, которая добавляет создание тестовой банки в восходящем pom:

  <!-- there is a bug in maven causing it to resolve test-jar types
       at compile time rather than test-compile. Move the compilation 
       of the test classes earlier in the build cycle -->
  <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <executions>
      <execution>
        <id>default-testCompile</id>
        <phase>compile</phase>
        <goals>
          <goal>testCompile</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Но это тоже не сработает, потому что пять фаз между компиляцией и тестовой компиляцией не выполняются и не настраиваются такие вещи, как тестовый путь к классам.

Я предполагаю, что реальным обходным путем, пока эта ошибка не будет исправлена, является использование test-compile вместо compile.

person Scott Carey    schedule 25.01.2011
comment
Я подтвердил, что первая рабочая фаза maven — это тестовая компиляция. Process-test-resources терпит неудачу. - person Scott Carey; 26.01.2011
comment
Рад слышать, что не я один столкнулся с этой ошибкой. В вашем случае вы также используете плагин exec:java - это казалось мне частью проблемы. Если нет, привязываете ли вы какие-либо другие плагины к фазам выполнения? - person Steve; 26.01.2011
comment
Что я недавно обнаружил, но еще не раскрутил, так это то, что я могу вызвать проблему с очень сокращенным набором из 3 файлов pom. Если эти три (мой проект) ничего не наследуют, это работает. Если они наследуются от org.apache:apache, они ломаются. Так что один из определенных там плагинов, вероятно, ломает его. Там нет плагина exec: java, но один из этих плагинов и exec, вероятно, зависят от чего-то другого, сломанного выше по течению. Я прокомментирую здесь, если смогу сузить круг. - person Scott Carey; 26.01.2011
comment
В моем случае проблема в maven-remote-resources. Я подал jira.codehaus.org/browse/MRRESOURCES-53. Если у кого-то еще есть эта проблема, и она не связана с exec: java, это может быть она. - person Scott Carey; 26.01.2011
comment
Я знаю, что это старый пост, но там написано, что он был активен 12 дней назад. Может ли кто-нибудь посмотреть мой комментарий об ошибке Maven, которую опубликовал @Steve? Ни один из обходных путей, упомянутых в этом посте, не работает для меня. Отсутствие возможности упаковать мой проект для меня является своего рода препятствием... jira.codehaus.org/browse/ - person Nick Williams; 27.01.2013
comment
У меня тоже была эта проблема. Это решило это для меня: stackoverflow.com/questions/14722873/ - person Eric Green; 25.03.2018

В моем случае основная причина заключалась в том, что модуль, который должен использоваться в качестве зависимости в области test с типом test-jar, не включал требуемую конфигурацию maven-jar-plugin. Без приведенного ниже фрагмента никакая тестовая банка не будет развернута при вызове mvn deploy в соответствующем модуле.

<build>
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <executions>
      <execution>
        <goals>
          <goal>test-jar</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
</plugins>

See https://maven.apache.org/guides/mini/guide-attached-tests.html for more details.

person Tobias Meyer    schedule 21.01.2016
comment
Это было и моей первопричиной. - person riverhorse; 16.01.2018

Итак, я провел серьезную отладку и обнаружил, что проблема, похоже, заключается во взаимодействии между плагином exec:java, зависимостями test-jar и mvn compile.

Короче говоря, если вы прикрепите exec:java к фазе выполнения, mvn compile начнет искать test-jar зависимости во время компиляции. Если вы удалите элемент <executions> из объявления плагина exec:java, mvn compile снова будет работать нормально.

Я подал отчет об ошибке для плагина exec:java здесь, хотя я не могу точно сказать, находится ли ошибка в exec:java, test-jar или mvn compile, поэтому, возможно, ошибка будет перемещена куда-то еще, если/когда кто-то это выяснит:

http://jira.codehaus.org/browse/MEXEC-91

Обновление: на самом деле это не ошибка, maven-exec-plugin задокументирован как требующий тестовых зависимостей здесь:

http://mojo.codehaus.org/exec-maven-plugin/java-mojo.html

Это не значит, что это не будет отличной функцией. ;-)

person Steve    schedule 26.01.2011

Я использую maven2. Я предполагаю, что ответ находится в управлении жизненным циклом maven. Первым шагом жизненного цикла по умолчанию является проверка, которая «подтверждает правильность проекта и доступность всей необходимой информации». (см. http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html ).

Таким образом, maven просто пытается получить все необходимые зависимости для последующего выполнения.

person WeMakeSoftware    schedule 24.01.2011
comment
Но если это так, то почему mvn compile package работает? - person Steve; 25.01.2011
comment
Вы упомянули, что это работает, только если вы укажете -DskipTests=true переменную. Может ли это быть что-то из внутренней оптимизации maven? - person WeMakeSoftware; 25.01.2011
comment
Он работает и без -DskipTests. Я просто добавил это, поскольку я пытаюсь только скомпилировать, а не тестировать. - person Steve; 25.01.2011