2014-02-05 3 views
7

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

У меня есть следующая структура проекта:

parent 
    |-test1 
    |-test2 

и pom.xml для parent выглядит следующим образом:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>parent</groupId> 
<artifactId>parent</artifactId> 
<version>1.0.0-SNAPSHOT</version> 
<packaging>pom</packaging> 

<modules> 
    <module>test1</module> 
    <module>test2</module> 
</modules> 

<build> 
    <pluginManagement> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <version>2.16</version> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-report-plugin</artifactId> 
       <version>2.16</version> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-site-plugin</artifactId> 
       <version>3.3</version> 
      </plugin> 
     </plugins> 
    </pluginManagement> 
</build> 

<reporting> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-report-plugin</artifactId> 
      <configuration> 
       <aggregate>true</aggregate> 
       <reportsDirectories> 
        <reportsDirectory>${basedir}/target/surefire-reports</reportsDirectory> 
       </reportsDirectories> 
      </configuration> 
      <reportSets> 
       <reportSet> 
        <inherited>false</inherited> 
        <reports> 
         <report>report-only</report> 
        </reports> 
       </reportSet> 
      </reportSets> 
     </plugin> 
    </plugins> 
</reporting> 

И я использую mvn clean install site построить проект, запустить тесты и генерировать сайт (который использует плагин сайта maven, который, в свою очередь, использует плагин отчетов maven surefire, чтобы создать тестовый отчет).

Беда в том, родительский pom.xml выполняется со всеми фазами (очистка, установка и сайт) перед pom.xml подмодулях выполняются, следовательно, не протокол испытаний от test1 и test2 не агрегируются в parent.

Так есть способ выполнить mvn clean install site в одной строке, или мне абсолютно необходимо выполнить mvn clean install сначала mvn site?

Спасибо за любые предложения.

ответ

16

В приведенной конфигурации используется тот же POM, что и родительский и агрегатор. В документации также будет обсуждаться наследование и мультимодуль. Родительский POM передает значения своим дочерним элементам, а агрегатор POM управляет группой подпроектов или модулей. Раздел 3.6.2 из Sonatype Maven Book идет намного подробнее.

По моему опыту, Maven строит работу лучше, когда родительские и агрегатные POM-ы являются отдельными.

Причина связана с зависимостями, как Maven определяет порядок сборки и как Maven запускает команды. Если ваша структура образца, как это, с отдельным родителем и агрегатором, где test1 и test2 унаследованным от родителей:

project (aggregator POM) 
    |- parent 
    |- test1 
    |- test2 

тогда Maven построить заказ будет выглядеть следующим образом (предполагается, что зависимости определены правильно, конечно):

  • родитель
  • test1
  • test2
  • агрегатор

Команда типа mvn clean install site начнет с родительского проекта, очистки и сборки, установки в локальный репозиторий артефактов, а затем создания сайта проекта. Он повторяет эту последовательность команд для отображения каждого проекта. Поскольку агрегатор является отдельным, он может иметь отдельную конфигурацию для выполнения агрегации отчетов для тестов, покрытия и javadoc. Агрегатор работает последним, поэтому базы данных охвата и промежуточные файлы javadoc для модулей уже существуют, готовые к соответствующему объединению.

Когда родитель и агрегатор те же POM, как вы есть, порядок сборки:

  • parentAggregator
  • test1
  • test2

При запуске mvn clean install site сейчас, Maven должен создать родительский POM (здесь, parentAggregator), чтобы он имел информацию, необходимую для дочерних модулей, в зависимости от нее. parentAggregator также является агрегатором, поэтому Maven с радостью будет запускать любые агрегирующие отчеты как часть site. Конечно, дочерние модули еще не построены, поэтому для агрегирования нет баз данных покрытия или промежуточных файлов javadoc. Или, что еще хуже, старые файлы существуют, поэтому агрегатор работает с этими файлами. После сборки родительского агрегатора дочерние модули строятся, а затем команда завершается. В конце сборки нет конечного этапа агрегации. Общие результаты, вероятно, не то, что вы хотите.

Это явление может вызвать проблемы во время сборки модулей с несколькими модулями, достаточно болезненно, что разработчики написали versions-maven-plugin mojo, чтобы исправить их. Вопрос:

Если у вас есть несколько модулей сборка, где агрегатор П (т.е. один с упаковкой П и секцией модулей) также является родитель ссылается его дочерние модулями, а версия агрегатора не соответствуют версии, указанной в родительском разделе дочерних модулей, Maven не позволит вам создать проект.

+1

Благодарим вас за предложение об агрегаторе, которое является хорошим решением этой проблемы. И вы также правильно предсказали «старые файлы существуют, поэтому агрегатор работает с этими файлами» :) – stackoverflower

Смежные вопросы