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.