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

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

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

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

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



답변

가장 쉬운 방법은 다음 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>

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


답변

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

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


답변

빌드 할 프로젝트는 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에 대해 많은 것을 이해하지 않고도 빠르게 시작할 수 있기를 원한다고 가정합니다. 다음과 같은 프로필을 사용할 수 있습니다.

<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>


답변

또 다른 아이디어 : 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>


답변

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에서 컴파일 및 기타 표준 플러그인을 비활성화하여 속도를 높일 수 있습니다.


답변

이 사람들이 요구 한 답이 정확히 아닙니다. 내 상황은 부모 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>속성이 없는 모듈을 배포합니다 . 그래서 제 경우에는 부모 만 배포합니다.