Как включить модульные тесты в сборку maven?

Причина: наш проект использует Ant как интерфейс командной строки. Сделав новую сборку с плагином сборки maven, я хочу сделать начальные тесты, чтобы проверить, правильно ли они собраны. Поэтому мне нужно включить модульные тесты в окончательную сборку. После сборки начальные тесты затем будут называться sth like

> ant initTest

build.xml

<target="initTest">
  <junit>
   <test class="MyTest" />
  </junit>
</target>

Проблема заключается в следующем: Я хочу сохранить тесты модуля в src/test/java и не переместить их в src/main/java. Есть ли способ рассказать плану сборки, чтобы он включал мои модульные тесты? Простое включение в дескриптор сборки не делает этого...

Ответ 1

Есть два шага:

  • Пакет тестов в банку, а также основной код.
  • Зависит от этого баннера "-tests" в модуле, который делает сборку.

Чтобы упаковать тесты, вам нужно выполнить бит jar: test-jar. например.

<build>
  <plugins>
    <plugin>
      <artifactId>maven-jar-plugin</artifactId>
      <executions>
        <execution>
          <id>test-jar</id>
          <phase>package</phase>
          <goals>
            <goal>test-jar</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Затем в модуле сборки вы можете зависеть от полученного артефакта.

<dependencies>
  <dependency>
    <groupid>${project.groupId}</groupId>
    <artifactId>some-artifact</artifactId>
    <version>${project.version}</version>
    <classifier>tests</classifier>
  </dependency>
</dependencies>

Ключевым битом является "классификатор".

Ответ 2

Ответ от Доминика-Митчелла не работал у меня вообще. В конечном итоге было добавлено fileSet для тестовых классов для моей сборки xml. Обратите внимание, что каталоги fileSet отличаются друг от друга! Это сильно заглохло меня.

Используйте ${project.build.directory} для тестовых классов и ${project.build.outputDirectory} для основного:

<?xml version='1.0' encoding='UTF-8'?>
<assembly>
    <id>toolbar-test</id>
    <formats>
        <format>jar</format>
    </formats>

    <includeBaseDirectory>false</includeBaseDirectory>

    <fileSets>
        <fileSet>
            <directory>${project.build.directory}/test-classes</directory>
            <outputDirectory>/</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>${project.build.outputDirectory}</directory>
            <outputDirectory>/</outputDirectory>
        </fileSet>
    </fileSets>

    <dependencySets>
        <dependencySet>
            <scope>runtime</scope>
            <unpack>true</unpack>
            <unpackOptions>
                <excludes>
                    <exclude>**/LICENSE*</exclude>
                    <exclude>**/README*</exclude>
                </excludes>
            </unpackOptions>
        </dependencySet>
        <dependencySet>
            <scope>test</scope>
            <unpack>true</unpack>
        </dependencySet>
    </dependencySets>
</assembly>

Кредит, в котором должен быть кредит - я нашел это решение в этом блоге здесь: http://alexgaddie.blogspot.com/2010/02/creating-uber-jar-with-maven.html
Мне не нужна часть сообщения profile в блоге.

Ответ 3

Для нас работает следующее.

pom.xml фрагмент:

<build>
    <plugins>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.6</version>
            <executions>
                <execution>
                    <goals>
                        <goal>test-jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>           
    </plugins>
</build>

assembly.xml фрагмент:

<dependencySets>
    <dependencySet>
        <outputDirectory>/lib</outputDirectory>
        <useProjectArtifact>true</useProjectArtifact>
        <useProjectAttachments>true</useProjectAttachments>
        <scope>runtime</scope>
    </dependencySet>
</dependencySets>

Ключ тега useProjectAttachments.