Как включить тестовую флягу зависимости в развертывание проекта Maven? - PullRequest
35 голосов
/ 13 октября 2011

У меня есть два проекта, 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>

Это приводит к развертыванию исходного jar с другим именем: com.example-foo.jar и не развертывает тестовый jar. Я также попытался использовать <classifier> вместо <type> в зависимости, но он все еще делает то же самое. Я попытался использовать вышеуказанную зависимость вне профиля (вместе с другими), но она все еще ведет себя так же.

Если я добавлю <type> к основной зависимости (без добавления другой зависимости), я получу развернутый тестовый jar (с тем же именем, что и выше), но источник, естественно, не будет развернут.

Единственное отличие от написанного в документации заключается в том, что область действия не указана для тестовой зависимости. Это работает только для области test? Можно ли как-то по-другому развернуть тестовые классы.

Я знаю, что вопрос немного запутанный, пожалуйста, дайте мне знать, если я могу кое-что прояснить.

Спасибо!


Обновление:

Я попробовал еще несколько способов, но все равно не получится.

Я добавил еще одно выполнение в maven-jar-plugin в проекте foo (зависимость, а не основной веб-проект), в котором я надеялся заставить maven скомпилировать тестовые классы в том же jar-файле, что и основные. и ссылаться на большой комплект другим классификатором. Я не мог заставить его работать:

<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.

Делая это, я понял, что это не зависит от отношения test-jar type / tests classifier / test scope. Когда я попытался указать новую банку, которую я строю, помимо основной, я получил то же поведение, что и при попытке включить банку -tests. Я проверил локальный репозиторий maven, и все jar-файлы зависимого проекта устанавливаются нормально, поэтому проблема заключается в разрешении зависимостей основного проекта.

ТЛ; др

Все сводится к вопросу, можете ли вы включить одну и ту же зависимость в несколько классификаторов. Из того, что я видел до сих пор, ответ - нет - я всегда получаю банку com.example-foo при указании одной и той же зависимости несколько раз с разными классификаторами.

Ответы [ 5 ]

48 голосов
/ 01 июля 2013

Лучше настроить файл 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 также развернет артефакт 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>
4 голосов
/ 27 октября 2011

Я вижу, вы используете 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>
1 голос
/ 07 июня 2016

Я немного опоздал на вечеринку, но я надеюсь, что это кому-нибудь поможет: вы можете включить несколько типов с одной и той же зависимостью.Предположим, что ваш проект зависит от 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>
1 голос
/ 27 октября 2011

Я нашел одно рабочее решение - использовать плагин build-helper , чтобы получить тестовую папку в сборке, которую я создаю для локального профиля.Это в зависимом проекте:

<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>

Таким образом, ядро ​​основного проекта не изменяется, а заглушки получаютразвернут при локальном построении.

Я до сих пор не выяснил, можно ли развернуть несколько классификаторов.:)

0 голосов
/ 28 октября 2011

Если вам нужны банки во время выполнения, вы также можете попробовать следующий трюк. Это просто копирует зависимости прямо в вашу целевую папку при компиляции. Я ожидаю, что они будут включены, когда пакет сделан ... Я не проверял это сам

<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> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...