maven-2 메이븐이란 - Maven:병렬 빌드를 수행하는 방법?




외부 리눅스 (5)

CI 빌드 애플리케이션 (예 : 허드슨) 중 일부는 동시에 여러 메이븐 프로젝트를 빌드 할 수 있습니다 (여러 머신에서도 가능).

maven 'standalone'에서 이것을 지원하는 것도 좋을 것이고, Maven 이슈 추적기를 통해 빠른보기가 나에게 준 것이다 : http://jira.codehaus.org/browse/MNG-3004

멀티 코어 / 멀티 CPU 머신에서 maven으로 빌드 할 때 다른 서브 프로젝트를 병렬로 빌드하는 것이 가능할 수 있습니다. Maven에서이 작업을 수행 할 수있는 방법이 있습니까? 이 / 어떤 것에 대한 플러그인이 있습니까?


제안 된 솔루션은 훌륭하지만 병렬 빌드 중 테스트 안정성 과 관련하여 여기에 답변을 추가하고 싶습니다.

https://cwiki.apache.org/confluence/display/MAVEN/Parallel+builds+in+Maven+3 를 사용할 때,

mvn -T 4 clean install # Builds with 4 threads
mvn -T 1C clean install # 1 thread per cpu core
mvn -T 1.5C clean install # 1.5 thread per cpu core

테스트와 관련된 일부 문제가 나타날 수 있습니다. 직렬 및 병렬 테스트 실행간에 다른 테스트의 동작을 기록하십시오. 대부분의 경우 테스트 격리를 리소스별로 부적절하게 수행하는 경우가 발생합니다.

예를 들어, test1은 하드 코딩 된 12345 키로 db 항목을 조작하고 test2는 동일한 항목을 사용합니다! 그것은 좋을 수 없다 ...

처음에는 고려해야 할 상황이지만, 언젠가 잊어 버리고 병렬 maven 빌드로 전환하면 다른 문제가 발생할 수 있습니다.

어떤 경우 에라도 병렬 실행을 사용하기를 원할 경우, -DskipTests 인수를 사용하여 Maven 테스트 실행을 사용 하지 않도록 설정할 수 있습니다 (물론 테스트를 수정하고 적절히 격리하려고 시도하는 것 외에는 가능합니다).

mvn clean install -T 4 -DskipTests

빌드 서버를 정렬하려는이 질문에 와서 네가 찾고있는 네이티브 플래그를 네이티브로 사용하지 않는다면 :

-Dmaven.repo.local=someNoneGlobalDir

각각의 빌드에 대해 그렇게하고 대기열에서 Maven을 사용하는 모든 것을 갖지 않고 동시에 모두 실행하도록 할 수 있습니다!


Maven 3 (베타 1 현재)는 실험용 기능으로 병렬 빌드를 지원합니다.

예를 들어,

mvn -T 4 clean install # Builds with 4 threads
mvn -T 1C clean install # 1 thread per cpu core
mvn -T 1.5C clean install # 1.5 thread per cpu core

전체 문서는 Maven 위키에서 찾을 수 있습니다.

https://cwiki.apache.org/confluence/display/MAVEN/Parallel+builds+in+Maven+3


POM에 두 개의 프로파일을 추가하여 기본적으로 source-jars 플러그인을 활성화하는 실제 목표를 달성 할 수 있습니다. Maven 프로파일 문서 에서는 activation 섹션에 <activeByDefault>true</activeByDefault> 요소를 추가 할 수 있으며

이전에 설명한 방법 중 하나를 사용하여 동일한 POM의 다른 프로파일을 활성화하지 않으면이 프로파일은 모든 빌드에 대해 자동으로 활성화됩니다

따라서 두 개의 프로필을 추가 ​​할 수 있습니다. 하나는 activeByDefault 이고 다른 하나는 관련 플러그인을 포함하고 다른 하나는 표준 방법 (예 : -P 으로 활성화되어 기본 프로필이 실행되지 않도록 할 수 있습니다 . pom.xml (또는 Maven 설정 또는 기타)의 profiles 섹션은 다음과 같이 보일 수 있습니다.

<profile>
  <id>source-jars</id>
  <activation>
    <activeByDefault>true</activeByDefault>
  </activation>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        ...
      </plugin>
    </plugins>
  </build>
</profile>
<profile>
   <!-- active this profile to disable the source-jars plugin -->
   <id>no-optional-plugins</id>
</profile>

불행히도이 방법을 여러 플러그인을 제어하는 ​​데 유용하게 사용할 수있는 방법이 없습니다. 플러그인 O(n^2) 필요로한다고 생각합니다. 그러나이 간단한 경우에는 잘 작동합니다.

Maven ≥ 2.0.10을 사용하는 또 다른 간단한 옵션은 위에 나온 source-jars 프로필 (여전히 activeByDefault )을 가지고, 프로필 ID 앞에 - 또는 ! 붙이면 원할 때 수동으로 프로필을 비활성화하는 것입니다 ! -P CLI 플래그 다음에 :

$ mvn -P !source-jars

이 방법은 여러 플러그인에서 동일한 O(n^2) 문제가 없지만 시스템 속성, 환경 변수, JDK 버전 등으로 비활성화를 트리거 할 수 없으므로 유연성이 떨어집니다.





maven-2 build-process build-automation