Почему требуется "тест-банка" для "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