почему для "mvn compile" требуется зависимость "test-jar" - PullRequest
13 голосов
/ 24 января 2011

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

Ответы [ 5 ]

10 голосов
/ 26 января 2011

Для меня это определенная ошибка.

У меня та же проблема, и я тестировал 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.

8 голосов
/ 21 января 2016

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

1 голос
/ 26 января 2011

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

Это не значит, что это не будет отличной особенностью. ; -)

0 голосов
/ 06 мая 2019

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

0 голосов
/ 25 января 2011

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

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

...