Как включить ядро проверки зависимости в развертывание проекта Maven?
У меня есть два проекта: foo
и foo-web
в группе com.example
. foo-web
зависит от foo
.
Чтобы иметь возможность разрабатывать часть пользовательского интерфейса приложения, не завися от внешних служб, фиктивные DAO были реализованы в foo
(они возвращают статические данные, поэтому нам не нужно подключаться к базам данных и т.д.).
Нам нужно было переместить фиктивные классы в src/test/java
. Это означает, что они не развертываются с помощью foo.jar
в войну, созданную из веб-проекта. Я нашел эти инструкции на сайте maven, но они, похоже, не работают для меня.
В foo
pom.xml
у меня есть:
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>test-jar</id>
<phase>test-compile</phase>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
При запуске mvn install
на foo-web
, в целевом foo
я получаю две банки: foo-1.0.0-SNAPSHOT.jar
и foo-1.0.0-SNAPSHOT-tests.jar
. Они оба прекрасно устанавливаются в локальном хранилище maven.
До этого, зависимость foo-web
выглядела так:
<dependency>
<groupId>com.example</groupId>
<artifactId>foo</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
И это вызовет развертывание foo-1.0.0-SNAPSHOT.jar
в войне. Теперь я хочу также развернуть банку -tests
, желательно только для "локального" профиля.
Я пытался разными способами:
<profile>
<id>local</id>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>foo</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>test-jar</type>
</dependency>
</dependencies>
</profile>
Это приводит к тому, что исходная банка развертывается с другим именем: com.example-foo.jar
и не развертывает тестовую банку. Я также попытался использовать <classifier>
вместо <type>
в зависимости, но он все равно делает то же самое. Я попытался использовать вышеупомянутую зависимость вне профиля (наряду с другими), но он по-прежнему ведет себя одинаково.
Если я добавлю <type>
к основной зависимости (без добавления другой зависимости), я получаю развернутую тестовую банку (с тем же именем, что и выше), но источник, естественно, не развертывается.
Единственное отличие от того, что написано в документации, это тот факт, что область не определена для тестовой зависимости. Он работает только для области test
? Могу ли я каким-то образом развернуть тестовые классы по-разному.
Я знаю, вопрос немного запутанный, пожалуйста, дайте мне знать, если есть что-то, что я могу уточнить.
Спасибо!
Обновление:
Я попробовал его еще несколькими способами, но он все равно не сработает.
Я добавил еще одно исполнение в maven-jar-plugin в проекте foo
(зависимость, а не основной веб-проект), в котором я надеялся заставить maven скомпилировать тестовые классы в той же банке, что и основные и ссылаться на большой пакет другим классификатором. Я не мог заставить его работать:
<execution>
<id>local-build</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classifier>batman</classifier>
<directory>${basedir}/src/test/java</directory> <!-- tried several variations here -->
<includes>
<include>**</include>
</includes>
</configuration>
</execution>
Jar был сгенерирован с помощью классификатора batman
, но я не смог найти способ включить его в тестовые классы в цель jar
.
Сделав это, я понял, что это не зависит от отношения scope test-jar
type/tests
classifier/test
. Когда я попытался указать новую банку, которую я строил помимо основной, я получил то же поведение, что и при попытке включить банку -tests
. Я проверил локальный репозиторий maven, и все банки из зависимого проекта устанавливаются в порядке, поэтому проблема заключается в основном разрешении зависимостей проекта.
TL;DR
Все сводится к вопросу, если вы можете включить ту же зависимость с несколькими классификаторами. Из того, что я видел до сих пор, ответ - нет. Я всегда получаю банку com.example-foo
при многократном задании одной и той же зависимости с разными классификаторами.
Ответы
Ответ 1
Лучше настроить файл maven pom в вашем первом модуле
<project>
<groupId>com.example</groupId>
<artifactId>foo</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<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>
После этого в mvn install/release будет также развернут артефакт foo-1.0.0-SNAPSHOT-tests.jar
Затем настройте зависимость от тестового баннера с помощью классификатора (как предложено в других ответах)
<dependency>
<groupId>com.example</groupId>
<artifactId>foo</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>test-jar</type>
<!-- uncomment if needed in test scope only
<scope>test</scope>
-->
</dependency>
Ответ 2
Я вижу, что вы используете test-jar
как type
, и вы использовали classifier
вместо type
, но, вероятно, также с test-jar
... но вы пробовали следующее?
<dependency>
<groupId>com.example</groupId>
<artifactId>foo</artifactId>
<version>1.0.0-SNAPSHOT</version>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
Ответ 3
Одним из рабочих решений, которое я нашел, было использование плагина сборки-помощника, чтобы получить тестовую папку в сборка, которую я создаю для локального профиля. Это находится в зависимом проекте:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<!-- used to package the dummy daos when building
with the local profile -->
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>${extra.sources.dir}</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
И профиль, также в зависимом проекте:
<profile>
<id>local</id>
<properties>
<env.resources.dir>src/test/resources</env.resources.dir>
<extra.sources.dir>src/test/java</extra.sources.dir>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.test</artifactId>
<scope>compile</scope>
</dependency>
</dependencies>
</profile>
Таким образом, основной проект pom не изменяется, а заглушки развертываются при локальном создании.
Я все еще не выяснил, можно ли развернуть несколько классификаторов.:)
Ответ 4
Если вам нужны банки во время выполнения, вы также можете попробовать следующий трюк. Это просто копирует зависимости непосредственно в вашу целевую папку при компиляции. Я ожидаю, что они будут включены, когда пакет будет сделан... Я не проверял это сам.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>compile</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<artifactSet>
<includes>
<include>com.example:foo</include>
</includes>
</artifactSet>
<outputDirectory>target/dependencies</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
Ответ 5
Я немного опаздываю на вечеринку, но я надеюсь, что это поможет кому-то: вы можете включить несколько типов той же зависимости. Предположим, что ваш проект зависит от common-artifact-1.0.jar
, а также тестовая банка common-artifact-1.0-tests.jar
.
Вы можете импортировать как банку, так и тестовую банку, выполнив следующее:
<dependencies>
<dependency>
<groupId>my.corp</groupId>
<artifactId>common-artifact</artifactId>
<version>1.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>my.copr</groupId>
<artifactId>common-artifact</artifactId>
<version>1.0</version>
<type>test-jar</type>
<scope>test</scope> <!-- the "compile" scope also works here -->
</dependency>
</dependencies>