2011-01-24 2 views
13

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

<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, используемый во время моей фазы компиляции, requires dependency resolution of artifacts in scope:test. Я создал a feature request to remove the scope:test dependency.

ответ

8

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

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

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

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

Я добавил это к моему ПОМ, в непосредственной близости от той части, которая добавляет создание тест-банку в восходящем ПОМ:

<!-- 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> 
    </execution> 
    </plugin> 

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

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

+0

Я подтвердил, что первая фаза maven для работы является тестовой. process-test-resources терпит неудачу. –

+0

Рад слышать, что я не одинок, столкнувшись с этой ошибкой. В вашем случае вы также используете плагин 'exec: java', который, казалось, был частью проблемы для меня. Если нет, связываете ли вы какие-либо другие плагины с этапами выполнения? – Steve

+0

Что я недавно обнаружил, но еще не размотал, это то, что я могу вызвать проблему с очень уменьшенным набором из 3 файлов pom. Если эти три (мой проект) наследуют от ничего, он работает. Если они наследуют от org.apache: apache, он ломается. Таким образом, один из плагинов, определенных там, вероятно, нарушает его. Там нет exec: java plugin, но один из этих плагинов и exec, вероятно, зависит от чего-то еще сломанного вверх по течению. Я прокомментирую здесь, если смогу сузить его. –

0

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

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

+0

Но если это так, то почему 'mvn compile package' работает? – Steve

+0

Вы упомянули, что он работает только в том случае, если вы указали переменную -DskipTests = true. Может ли это быть частью внутренней оптимизации maven? – WeMakeSoftware

+0

Он работает без -DskipTests тоже. Я просто добавил, что, поскольку я только пытаюсь скомпилировать, а не тестировать. – Steve

1

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

Update: Это на самом деле не ошибка, то Maven-Exec-плагин документированы, как требующие зависимости тестов здесь:

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

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

7

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

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

+0

Это тоже моя причина. , – riverhorse

Смежные вопросы