Почему требуется "тест-банка" для "mvn compile",

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

<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, используемый во время моей фазы компиляции, требует разрешения зависимостей артефактов в области: test a > . Я создал запрос функции для удаления области: тестовая зависимость.

Ответы

Ответ 1

Это похоже на определенную ошибку для меня.

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

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

В результате я подумал, что это можно обойти, сопоставив цель 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>

Но это тоже не сработает, потому что пять фаз между compile и test-compile не запускались и не настраивали такие вещи, как testpath classpath.

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

Ответ 2

В моем случае основной причиной было то, что модуль, который должен использоваться в качестве зависимости в области test с типом test-jar, не включал требуемую конфигурацию maven-jar-plugin. Без приведенного ниже фрагмента тестовый файл jar не будет развернут при вызове 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>

См. Https://maven.apache.org/guides/mini/guide-attached-tests.html для получения более подробной информации.

Ответ 3

Итак, я сделал серьезную отладку и обнаружил, что проблема представляет собой взаимодействие между плагинами 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-плагин документирован как требующий тестовых зависимостей здесь:

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

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

Ответ 4

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

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

Ответ 5

Это -DskipTests проблему для меня: -DskipTests