Получить classpath для интеграционных тестов многомодульного проекта с maven-ant-task

У меня есть многомодульный проект, построенный с Maven. Мне нужно ежедневно проводить интеграционные тесты проекта. Это невозможно сделать во время стандартного цикла сборки maven, потому что во время выполнения интеграционные тесты, определенные в модулях, имеют циклические зависимости, которые я не могу объявлять на их poms.

Вместо этого я создал отдельный проект с именем Global, в котором перечислены все модули jar и test-jars в качестве его зависимостей. Глобальный имеет того же родителя, что и все модули. Идея состоит в том, что с помощью maven-ant-tasks я смогу получить classpath всех jar-модулей и test-jar и продолжить оттуда. Глобальный раздел зависимостей pom.xml выглядит следующим образом:

<dependency>
    <groupId>mygroup</groupId>
    <artifactId>A</artifactId>
    <version>${project.version}</version>
</dependency>
<dependency>
    <groupId>mygroup</groupId>
    <artifactId>A</artifactId>
    <version>${project.version}</version>
    <type>test-jar</type>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>mygroup</groupId>
    <artifactId>B</artifactId>
    <version>${project.version}</version>
</dependency>
<dependency>
    <groupId>mygroup</groupId>
    <artifactId>B</artifactId>
    <version>${project.version}</version>
    <type>test-jar</type>
    <scope>test</scope>
</dependency>

...etc

Проблема в том, что я не могу получить classpath, который содержит все jar-файлы и test-jar, объявленные в pom.xml Global (и их зависимостях времени выполнения) с использованием доступных задач ant. Я пытался (среди прочего):

<dependencies pathId="cp1" type="jar" usescope="runtime">
    <pom file="${basedir}/pom.xml">
        <profile id="DEV" />
    </pom>
</dependencies>

[1] Этот выбирает все зависимости времени выполнения. Ничего плохого в этом нет.

<dependencies pathId="cp2">
    <dependency groupId="mygroup" artifactId="Global" version="myVersion" scope="test" type="test-jar"/>
</dependencies>

[2] Этот файл извлекает все зависимости времени выполнения вместе с Global-myversion-tests.jar, но не с другим test-jar.

<dependencies pathId="cp3" type="test-jar" usescope="test">
    <pom file="${basedir}/pom.xml">
        <profile id="DEV" />
    </pom>
</dependencies>

[3] Этот ничего не получает.

Очевидно, что объявив что-то вроде [2] один раз для каждого модуля, все получится, но я стремлюсь создать установку, которая не будет нуждаться в редактировании gazillion файлов каждый раз, когда новый модуль добавляется или удаляется. Кстати, я использую Maven-Ant-Task-2.1.3.

Спасибо за любой вклад.

--- Правки для @yannisf принятого ответа ---

Вы никогда не должны иметь циклических зависимостей

Я предполагаю, что вы имеете в виду для maven сборок. Наличие циклических зависимостей во время выполнения довольно распространено, например:

Модуль A объявляет интерфейс: UploadToDocumentManagementSystem

Модуль B реализует его в: UploadToCoolDms (таким образом, в будущем, когда система DMS изменится на CoolerDms, модуль B может быть заменен новой реализацией без побочных эффектов для остальной части приложения).

Модуль B зависит от времени компиляции A (и, по определению, времени выполнения)

Модуль A зависит от B во время выполнения

Maven не позволяет объявить это. Причина, по которой я могу посочувствовать, заключается в том, что maven должен завершить циклы сборки (включая тесты) многомодульных проектов в определенном порядке. Дело в том, что на самом деле нет необходимости объявлять его, если вы избавляетесь от какой-либо зависимости времени выполнения от B для тестов A (что является хорошей практикой и должно произойти в любом случае).

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

Справедливо, я вижу, как maven-ant-tasks не были созданы для этого использования.

В вашей глобальной поме вы объявляете двойные типы для одного и того же артефакта (jar, test-jar)

Это проблема вообще? Например, модуль A содержит несколько примеров для своих тестов, которые я также хотел бы использовать в тестах модуля B. Неправильно ли (в соответствии со стандартами наилучшей практики maven) объявлять, что B зависит от A jar (область компиляции) и от A test-jar (область тестирования)? Разве проект интеграционных тестов не оправдывает зависимость от модуля, а также от образцов и ресурсов того же модуля, которые использовались для его модульных тестов?

tl; dr version: я попытаюсь переставить тесты, объявленные для модулей, и создать отдельный модуль (и) для интеграционных тестов (при условии, что я смогу заставить 20 разработчиков играть в мяч). Спасибо за ответ и за то, что заставили меня признать свое поражение и перестать пытаться заставить maven работать с проектом вместо того, чтобы заставить проект работать с maven:).

1 ответ

Решение

Вы пытаетесь нарушить мавенские соглашения во многих отношениях. 1. У вас никогда не должно быть циклических зависимостей, 2. Вы должны делать вещи по-мавенски, а не прибегать к муравейным задачам. 3. В вашей глобальной поме вы объявляете двойные типы для одного и того же артефакта (jar, test-jar).

Хотя поначалу может показаться, что это не отвечает на ваш вопрос, вы должны сделать шаг назад и пересмотреть свой макет. Интеграционные тесты нуждаются во всех зависимостях и гораздо более требовательны, чем модульные тесты. Таким образом, вместо того, чтобы пытаться вписать их в существующие проекты, создайте отдельный проект maven в той же группе, который будет содержать только интеграционные тесты (в src/java/test, main будет пустым) и будет иметь в качестве зависимостей все остальные проекты.

Другие вопросы по тегам