Maven 리액터 빌드에서 모듈을 제외하는 방법은 무엇입니까?


98

많은 모듈이 포함 된 Maven 2 프로젝트가 있습니다. 예:

<modules>
  <module>common</module>
  <module>foo</module>
  <module>data</module>
  <module>bar</module>
  ... more ...
</module>

"데이터"모듈을 빌드하는 데 시간이 많이 걸리고 프로젝트가 CI 서버에 의해 빌드 될 때 제외하고 싶다고 가정 해 보겠습니다. 현재이를 위해 두 개의 pom.xml 파일을 사용합니다. 하나에는 모든 모듈이 있고 다른 하나에는 CI에 대해 제외 할 수있는 모듈을 제외한 모든 모듈이 있습니다. 그러나 때때로 우리는 파일에 새 모듈을 넣는 것을 잊기 때문에 꽤 성가신 일 입니다.

두 개의 별도 모듈 목록이 필요하지 않은 솔루션이 있습니까?

답변:


73

가장 쉬운 방법은 다음 profiles과 같이 사용하는 것입니다.

<project>
  ...
  <modules>
    <module>common</module>
    <module>foo</module>
    <module>bar</module>
  <modules>
  ...
  <profiles>
    <profile>
      <id>expensive-modules-to-build</id>
      <modules>
        <module>data</module>
      </modules>
    </profile>
  </profiles>
</project>

그런 다음 프로필을 활성화 할 수있는 방법 을 확인해야합니다.


커먼 전에 데이터가 필요하다면 어떻게 하시겠습니까? 이 경우 프로파일 모듈은 리액터 순서에서 기본 모듈 뒤에 배치됩니다. 강제 명령에 대한 패턴이 있습니까?
Peter Kahn

9
모듈의 순서는 리액터에 나타나는 순서가 아닙니다. 순서에 영향을주는 유일한 방법은 <dependency> 태그를 사용하여 모듈간에 종속성을 만드는 것입니다. 이를 위해 선언 순서를 신뢰할 수 없습니다.
SaM

7
@SaM 실제로 Maven 3.0.5부터 Reactor 는 'modules'의 순서를 고려할 것 입니다.
hellodanylo

프로필이 활성화되어 있어도 프로필에서 모듈을 감지하지 못하는 다른 플러그인이 중단됩니다
tribbloid

143

Maven 3.2.1에서는 이제를 사용 -pl !<module_name>,!<module_name>하여 리액터 빌드에서 특정 모듈을 제외 할 수 있습니다 .

이 기능 요청을 참조하십시오. https://issues.apache.org/jira/browse/MNG-5230


3.0.4에서 3.2.1로 전환하는 것이 안전합니까 아니면 더 큰 변경 사항이 있습니까?
1

문제없이 3.1에서 3.2.1로 옮겼습니다. 하지만 솔직히 말해서 그것을 알아 내려면 빌드를해야합니다.
Yogesh_D

30
쉘 명령 줄에서 느낌표를 이스케이프하는 것을 잊지 마십시오. 그것은 매우 특별한 의미를 가지고, 참조 예를 들어 unix.stackexchange.com/questions/3747/...
파벨

5
불행하게도 지원 원자로 모듈 배제하지 않는 젠킨스 받는다는 프로젝트 플러그인에서 열린 문제는 현재이 : issues.jenkins-ci.org/browse/JENKINS-26472
닉 Vanderhoven

@Pavel : 또는 -대신 사용하십시오 !. 즉-pl -<module_name>
msa

45

빌드 할 프로젝트는 mvn 명령 줄에서도 지정할 수 있습니다. 이렇게하면 별도의 pom이 필요하지 않지만 대신 새 모듈이있을 때마다 CI 구성을 변경해야합니다.

-pl,--projects <arg>                Comma-delimited list of specified
                                    reactor projects to build instead
                                    of all projects. A project can be
                                    specified by [groupId]:artifactId
                                    or by its relative path.

어쩌면이 플래그와의 조합 --also-make-dependents또는 --also-make다시 유지 보수 부담을 감소시킬 것이다.

-am,--also-make                     If project list is specified, also
                                    build projects required by the
                                    list
-amd,--also-make-dependents         If project list is specified, also
                                    build projects that depend on
                                    projects on the list

이것은 두 개의 개별 pom을 사용하는 것과 동일한 문제가 있습니다. 모듈을 정의하는 위치가 필요합니다. 그것이 내가 피하려고하는 것입니다.
kayahr

이것은 좋은 해결책입니다. pom을 업데이트 할 필요가 없습니다. mvn clean install -pl mysubproject
nicolas-f 2015

22

기본 빌드가 속도에 관계없이 항상 모든 것을 빌드하여 새로운 개발자가 POM에 대해 많은 것을 이해하지 않고도 빠르게 시작할 수 있기를 원한다고 가정합니다. 다음과 같은 프로필을 사용할 수 있습니다.

<modules>
    <module>common</module>
    <module>foo</module>
    <module>bar</module>
  </modules>
  ...
  <profiles>
    <profile>
      <id>expensive-modules-to-build</id>
      <activation>
         <activeByDefault>true</activeByDefault>
      </activation>
      <modules>
        <module>data</module>
      </modules>
    </profile>
  </profiles>
</project>

문제는 개발자가 명령 줄에 다른 프로필을 지정하면 해당 프로필 expensive-modules-to-build이 포함되지 않는다는 것입니다 (개발자가 지정하지 않는 한). 이로 인해 어떤 프로필을 포함해야하는지 기억하기가 복잡해집니다.

여기에 해키 방법이 있습니다. pom.xml 파일이 항상 존재하기 때문에 두 프로필이 항상 포함됩니다. 따라서 값 비싼 모듈을 제외 -P!full-build하려면 명령 줄에서 사용할 수 있습니다 .

<profiles>
    <profile>
        <id>full-build</id>
        <activation>
            <file>
                <exists>pom.xml</exists>
            </file>
        </activation>
        <modules>
            <module>data</module>
        </modules>
    </profile>
    <profile>
        <id>short-build</id>
        <activation>
            <file>
                <exists>pom.xml</exists>
            </file>
        </activation>
        <modules>
           <module>common</module>
           <module>foo</module>
           <module>bar</module>
        </modules>
    </profile>
</profiles>

좋은 대답입니다. 하지만 두 번째 코드 예제에서 정말 두 개의 프로필이 필요합니까? 활성화 요소가 변경된 첫 번째 코드 예제의 단일 프로필이 작동하지 않습니까?
Arend v. Reinersdorff

@ Arendv.Reinersdorff 예,하지만이 답변은 기본적으로 포함 할 수있는 빌드의 다른 프로필에서도 작동합니다. 로 전반적으로하지만, 나는 다른 대답을 생각하는 -pl !<module_name>,!<module_name>더 나은이 이전보다
artbristol

1
좋은 활성화 트릭. 항상 활성화되지 않은 <activeByDefault> 문제를 해결했습니다!
Gab

7

또 다른 아이디어 : Reactor 모듈은 중첩 될 수 있으므로 빠르고 느린 빌드 모듈을 별도의 pom으로 그룹화 한 다음이 두 모듈을 포함하는 또 다른 집계 pom을 모듈로 추가 할 수 있어야합니다. 그러면 CI Server는 빠른 빌드 모듈이 포함 된 pom 만 참조 할 수 있습니다.

<artifactId>fast</artifactId>
<modules>
    <module>fast-a</module>
    <module>fast-b</module>
    <module>fast-c</module>
</module>

<artifactId>all</artifactId>
<modules>
    <module>fast</module>
    <module>slow</module>
</module>

1

maven 프로필 을 사용할 수 있습니다 . 빌드 환경에서 quick많은 플러그인과 테스트 실행을 비활성화 하는 프로필 을 만들었습니다 .

이것은

    <profile>
        <id>quick</id>
        <properties>
            <skipTests>true</skipTests>
            <!-- others... -->
        </properties>   
        <build>
            <plugins>
                 <!-- configuration... -->
            </plugins>
        </build>
    </profile>

그리고 다음과 같은 방법으로 maven을 호출합니다.

mvn groupId:artifactId:goal -P quick

모듈의 pom에서 컴파일 및 기타 표준 플러그인을 비활성화하여 속도를 높일 수 있습니다.


2
예, 테스트를 비활성화하면 훌륭하게 작동합니다. 하지만 프로필을 사용하여 pom에 두 개의 개별 모듈 목록이없는 모듈을 제외하려면 어떻게해야합니까? 내가 아는 한 전체 모듈 목록을 하나의 프로필 섹션에 넣고 빠른 빌드 모듈 목록을 다른 프로필 섹션에 넣어야합니다. 그래서 이것은 두 개의 분리 된 pom을 사용하는 것과 같은 문제를 가지고 있습니다. 두 개의 모듈 목록을 유지해야합니다.
kayahr

모듈을 제외하는 것은 Maven에서 작업을 수행하는 방법이 아닙니다. Maven에 대한 제 경험은 작업이 수행되는 방식을 고수하는 것이 더 낫다는 것입니다. 그렇지 않으면 너무 많은 문제가 발생합니다. 모듈을 제거하되이 모듈의 시간 소모를 줄입니다.
Nr9

메이븐의 문제는 '일이 이루어지는 방식'이 '실제 세계에서 이루어지는 방식'과 일치하지 않는 경우가 많아 메이븐의 경험을 가난하고 고통스럽게 만든다는 것입니다. 개발자는 UX 교육을받는 것이 좋습니다.
Ed Randall

0

이 사람들이 요구 한 답이 정확히 아닙니다. 내 상황은 부모 pom 만 배포하고 싶었습니다. 나는 spring-boot-thin-layout자식 모듈을 사용하고 있습니다. 이를 위해서는 상위 모듈이 아티 팩토리에 배치되어야합니다. 내 프로젝트에 다음을 추가했습니다. install그리고 / 또는 deploy단계를 건너 뛸 수 있습니다 .

내 부모 pom에서 :

<properties>
    <disable.install>true</disable.install>
    <disable.deploy>true</disable.deploy>
    <enable.deployAtEnd>true</enable.deployAtEnd>
</properties>

<profiles>
    <profile>
        <id>deploy-parent</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <disable.install>true</disable.install>
            <disable.deploy>true</disable.deploy>
            <deployAtEnd>${enable.deployAtEnd}</deployAtEnd>
        </properties>
        <build>
            <finalName>${project.version}</finalName>
        </build>
    </profile>
</profiles>

그리고 내 자식 pom (s) 또는 부모와 함께 배포하지 않으려는 모듈 :

<properties>
    <maven.install.skip>${disable.install}</maven.install.skip>
    <maven.deploy.skip>${disable.deploy}</maven.deploy.skip>
    <deployAtEnd>${enable.deployAtEnd}</deployAtEnd>
</properties>

그래서 효과적으로 mvn deploy부모 pom에서 실행할 때 모든 모듈을 컴파일하고 아무것도 실행하지 않고 마지막에 <maven.deploy.skip>${disable.deploy}</maven.deploy.skip>속성이 없는 모듈을 배포합니다 . 그래서 제 경우에는 부모 만 배포합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.