2014-02-05 2 views
7

모듈을 올바르게 테스트하고 생성하기 위해 서브 모듈이있는 프로젝트를 얻으려고하고 있지만 문제가 있습니다. 다중 모듈 프로젝트를위한 Maven 리포팅 및 사이트 생성

나는 다음과 같은 프로젝트 구조를 가지고 :

parent 
    |-test1 
    |-test2 

parent에 대한 pom.xml 파일은 다음과 같습니다

<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 전에 실행된다, 따라서 test1test2로부터 시험 보고서는 parent에 집계되지 않습니다.

한 줄에 mvn clean install site을 실행하는 방법이 있습니까? 아니면 mvn clean install을 먼저 실행하고 mvn site을 실행해야합니까?

의견을 보내 주셔서 감사합니다.

답변

16

표시된 config는 동일한 POM을 상위 및 집계로 사용합니다. 문서에서는 상속 대 다중 모듈에 대해서도 설명합니다. 상위 POM은 하위에 값을 전달하고 집계 자 POM은 하위 프로젝트 또는 모듈 그룹을 관리합니다. Sonatype Maven Book의 3.6.2 절은 훨씬 더 자세히 설명되어 있습니다.

내 경험상, 상위 및 집계 POM이 인 경우 일 때 Maven 빌드가 더 효율적입니다.

이유는 종속성, Maven이 빌드 순서를 결정하는 방법, Maven이 명령을 실행하는 방법과 관련이 있습니다. 샘플 구조가 TEST1 및 TEST2 부모로부터 상속 별도의 부모와 애그리 게이터 (aggregator)와,이 같았다 경우

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

다음 Maven은 순서 (의존성이 제대로 물론 정의 가정)과 같이 표시됩니다 구축 :

  • 부모
  • TEST1
  • TEST2
  • 애그리 게이터 (aggregator)

mvn clean install site과 같은 명령은 상위 프로젝트, 정리 및 빌드, 로컬 아티펙트 저장소에 설치, 프로젝트 사이트 생성과 같은 명령으로 시작됩니다. 표시된 각 프로젝트에 대해이 명령 순서를 순서대로 반복합니다. 애그리 게이터는 별도이기 때문에 테스트, 적용 범위 및 javadoc에 대한 보고서 집계를 수행하기 위해 별도의 구성을 가질 수 있습니다. 어 그리 게이터가 마지막으로 실행되므로 모듈의 커버리지 데이터베이스와 중간 javadoc 파일이 이미 존재하므로 적절히 결합 할 수 있습니다.부모와 애그리 게이터 (aggregator)가 같은 POM 때 당신이 그것을 가지고

가, 빌드 순서는 다음과 같습니다

  • parentAggregator
  • TEST1
  • TEST2

지금 mvn clean install site을 실행 Maven은 상위 POM (여기서는 parentAggregator)을 빌드하여 하위 모듈에 필요한 정보를 갖도록해야합니다. parentAggregator도 aggregator이기 때문에 Maven은 site의 일부로 모든 집계 보고서를 행복하게 실행할 것입니다. 물론 하위 모듈은 아직 구축되지 않았으므로 집계 할 데이터베이스 또는 중간 javadoc 파일이 없습니다. 또는, 아마도 더 오래된 파일이 존재하므로 집계자가 해당 파일을 조작합니다. 상위 집계자가 작성된 후 하위 모듈이 빌드되고 명령이 종료됩니다. 빌드가 끝날 때 최종 집계 단계가 없습니다. 전반적인 결과는 아마도 당신이 원하는 것이 아닙니다.

이 현상은 다중 모듈 프로젝트 릴리스 빌드 중에 문제를 일으킬 수 있습니다. 개발자가 versions-maven-plugin mojo을 수정하여 문제를 해결하는 데 어려움이 있습니다. 문제 :

당신은 (POM의 포장 및 모듈 부분과 하나의 예)를 애그리 게이터 (aggregator)의 치어는 자식 모듈에 의해 참조 부모 인 멀티 모듈 빌드를 가지고 있고, 애그리 게이터 (aggregator) 버전은하지 않는 경우 자식 모듈의 부모 섹션에 지정된 버전과 일치하면 Maven을 사용하여 프로젝트를 빌드 할 수 없습니다.

+1

이 문제에 대한 좋은 해결책 인 통합 자에 대한 의견을 보내 주셔서 감사합니다. 또한 "이전 파일이 있으므로 집계가 해당 파일에서 작동합니다"라고 정확하게 예측했습니다. :) – stackoverflower