Как включить ядро ​​проверки зависимости в развертывание проекта Maven? - программирование

Как включить ядро ​​проверки зависимости в развертывание проекта 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 при многократном задании одной и той же зависимости с разными классификаторами.

4b9b3361

Ответ 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>