В многомодульном проекте может ли модуль maven получить доступ к транзитивным зависимостям с тестовой областью другого модуля, от которого он зависит?

У меня есть многомодульный проект Maven+Spring. Некоторые модули зависят от других модулей.

Допустим, у нас есть модуль с именем services, который зависит от модуля с именем persistence.

Сервисный модуль:

  • На уровне Spring импортирует контекст persistence
  • На уровне Maven зависит от модуля persistence

Модуль persistence определяет некоторую конфигурацию, связанную с... постоянством: источник данных, JPA, транзакции...

У него есть некоторые зависимости для тестирования БД (драйверы JDBC, DBCP, H2), которые ограничены областью тестирования, поскольку при развертывании приложения источник данных будет определен в контейнере (Tomcat) и доступен через JNDI.

Теперь я хотел бы иметь доступ на этапе тестирования Maven модуля services к зависимостям с тестовой областью (переходным) модуля persistence.

руководство по Maven (таблица 3.1) сказать, что обычно зависимости области тестирования недоступны транзитивно.

Можно ли их как-то получить в контексте многомодульного проекта?

Если нет, то какие хорошие альтернативы? (Определить тестовые зависимости в родительском pom?...)


person Pierre Henry    schedule 04.04.2013    source источник


Ответы (2)


Я обнаружил, как именно это должно работать, то есть путем создания тестового JAR, который является типом артефакта, в модуле, который используется в качестве зависимости другим, в нашем примере модулем сохранения:

<build>
    <plugins>

            <!-- Generate test jar too -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>test-jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

    </plugins>
</build>

Затем, объявив эту тестовую банку как тестовую зависимость другого модуля, в нашем примере модуль services:

<!-- Services module -->
<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>services</artifactId>
    <version>${project.version}</version>
</dependency>
<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>services</artifactId>
    <version>${project.version}</version>
    <type>test-jar</type>
    <scope>test</scope>
</dependency>

Обратите внимание на вторую зависимость, которая идентична первой, за исключением того, что для type установлено значение test-jar, а для scope установлено значение test.

Теперь вы можете себе представить, что тесты, написанные в модуле service, будут иметь доступ к тестовым классам модуля persistence (это работает), а также к зависимостям области тестирования модуль сохранения.

Однако это известная проблема (https://issues.apache.org/jira/browse/MNG-1378), что это так не работает. Он был открыт с 2005 года, поэтому я не думаю, что он будет исправлен в ближайшем будущем... но кто знает.

Si, мне просто нужно будет продублировать тестовые зависимости для обоих модулей или просто определить их в родительском pom...

person Pierre Henry    schedule 16.04.2013
comment
Спасибо за это, только что провел час, задаваясь вопросом, почему я получаю исключение class not found :( - person PiersyP; 07.11.2013
comment
СПАСИБО!! Что бы это ни стоило, мне не нужно было включать зависимость для артефакта основного модуля, только <scope>test</scope>, но пробег других людей, конечно, может отличаться. :) - person brokethebuildagain; 18.02.2017

должен, но не работает. Это происходит и с предоставленной областью действия. Проблема зарегистрирована здесь: https://issues.apache.org/jira/browse/MNG-5255

person tdrury    schedule 04.04.2013
comment
Спасибо, но проблема, на которую вы указали, хотя и связана, не отвечает на мой вопрос. На самом деле у них там почти противоположная проблема: транзитивные зависимости тестовых/предоставленных зависимостей включаются в окончательный JAR. - person Pierre Henry; 05.04.2013
comment
Прости! tl; dr :) На днях мы столкнулись с переходными зависимостями области тестирования, которых нет в пути к классам модульного теста, поэтому, когда я увидел ваш вопрос, я просто предположил, что это та же проблема. - person tdrury; 05.04.2013
comment
Объявляет ли какой-либо другой модуль их как нетестовые зависимости? Получите эффективный POM (через eclipse или плагин справки), чтобы увидеть. - person tdrury; 05.04.2013