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