Maven 빌드 중 하위 모듈 건너 뛰기


160

특정 환경에서는 하위 모듈을 건너 뛸 수 있어야합니다.

해당 모듈에는 통합 테스트가 포함되어 있으며 실행하는 데 30 분이 걸립니다. 따라서 CI 서버를 구축 할 때 포함 시키려고하지만 개발자가 로컬에서 구축 (및 테스트 실행) 할 때는 해당 모듈을 건너 뛰고 싶습니다.

프로필 설정으로이를 수행 할 수있는 방법이 있습니까? 인터넷 검색을 수행하고 여기에서 다른 질문 / 답변을 보았지만 좋은 해결책을 찾지 못했습니다.

하나의 옵션이 부모에서 해당 하위 모듈을 pom.xml완전히 제거 하고 CI 서버에 다른 프로젝트를 추가하여 해당 모듈을 빌드하는 것입니다.

제안?


왜 메이븐 웨이? 그것은 나에게 완벽하게 유효한 주장입니다.
MaDa

흠. 이제 사람들이 이것에 대해 논쟁하고있는 것처럼 보이는 곳을 찾을 수 없습니다 ... 그래서 이것이 "The Maven Way"가 아니라는 내 주장을 제거하기 위해 원래의 질문을 업데이트했습니다.
denishaskin

답변:


149

물론, 이것은 프로파일을 사용하여 수행 할 수 있습니다. 부모 pom.xml에서 다음과 같은 작업을 수행 할 수 있습니다.

  ...
   <modules>
      <module>module1</module>
      <module>module2</module>  
      ...
  </modules>
  ...
  <profiles>
     <profile>
       <id>ci</id>
          <modules>
            <module>module1</module>
            <module>module2</module>
            ...
            <module>module-integration-test</module>
          </modules> 
      </profile>
  </profiles>
 ...

CI에서 ci프로파일로 maven을 실행 합니다.mvn -P ci clean install


4
훌륭한 답변! 왜 Maven 문서에서 이것을 찾는 데 많은 어려움을 겪었는지 모르겠습니다. 내가 제안하는 한 가지 제안은 기본적으로 통합 테스트를 실행하기를 선호하기 때문에 activeByDefault해당 프로파일에 추가 한 다음 빈 프로파일 (예 :)을 추가 skip-integration-tests하여 건너 뛸 수 있어야한다는 것입니다.
denishaskin

7
공유 된 모든 내용을 복제하지 않고이 작업을 수행 할 수있는 방법이 있습니까?
JonnyRaa

7
maven-release-plugin을 사용하면 프로파일 스위치 뒤에 숨겨진 하위 모듈의 버전 번호를 업데이트하지 않는 것처럼 보일 것입니다. 프로젝트의 나머지 버전과 다른 버전 번호를 가진 하위 모듈을 가질 수 있습니다.
Ardesco

8
불행히도, 프로파일을 사용하면 pom의 주요 <modules> 부분에서 앞서 언급 한 모듈을 제외 할 수 없습니다. JIRA issues.apache.org/jira/browse/MNG-5230 (및 전체 pom 구조)은 좀 더 신중한 생각으로 완전히 구현 될 수있었습니다.
Ed Randall

2
이 솔루션은 실제로 작동합니까? 적어도 나는 그것을 작동시킬 수 없다. @EdRandall과 같은 문제가있는 것 같습니다
Gerros

232

메이븐 버전 3.2.1은 당신이 사용할 수있는이 기능을 추가 -pl스위치 ( 바로 가기 에 대한 --projects과 목록) !또는 -( 소스를 특정 서브 모듈을 제외).

mvn -pl '!submodule-to-exclude' install
mvn -pl -submodule-to-exclude install

캐릭터를 강타하십시오! 는 특수 문자이므로 작은 따옴표로 묶거나 백 슬래시 문자로 이스케이프 처리해야합니다.

여러 모듈을 제외하는 구문은 포함과 동일합니다.

mvn -pl '!submodule1,!submodule2' install
mvn -pl -submodule1,-submodule2 install

EDIT Windows는 작은 따옴표를 좋아하지 않지만 bash에는 필요합니다. Windows에서는 큰 따옴표를 사용하십시오 (@awilkinson 덕분에)

mvn -pl "!submodule1,!submodule2" install

27
중요 : 중첩 된 하위 모듈을 제외하려면 정규화 된 버전을 사용해야합니다.mvn -pl !com.acme:nestedmodule1
Leonard Brünings

3
-pl 옵션은 artifactId 앞에 '[groupId] :'가 필요하므로 mvn -pl '! : submodule-to-exclude'설치를 사용해야합니다.
Honsen

4
mvn -pl '!path/to/submodule/directory'groupId 및 artifactId를 사용하지 않고을 사용할 수도 있습니다 . 내 대답은 경우에 작동 submodule1하고 submodule2현재 디렉토리에 있습니다.
Alexandre DuBreuil

-pl에서 사용할 경우 다음 mvn install을 사용할 수도 mvn deploy있습니다
majikman

39

-pl명령 행 인수를 지정하여 빌드 할 원자로 프로젝트를 결정할 수 있습니다 .

$ mvn --help
[...]
 -pl,--projects <arg>                   Build specified reactor projects
                                        instead of all projects
[...]

다음 형식 중 하나로 쉼표로 구분 된 매개 변수 목록을 허용합니다.

  • POM을 포함하는 폴더의 상대 경로
  • [groupId]:artifactId

따라서 다음과 같은 구조가 주어집니다.

project-root [com.mycorp:parent]
  |
  + --- server [com.mycorp:server]
  |       |
  |       + --- orm [com.mycorp.server:orm]
  |
  + --- client [com.mycorp:client]

다음 명령 줄을 지정할 수 있습니다.

mvn -pl .,server,:client,com.mycorp.server:orm clean install

모든 것을 구축합니다. 목록에서 요소를 제거하여 원하는 모듈 만 빌드하십시오.


편집 : 블랙 빌드가 지적했듯이 Maven 3.2.1 부터는 다음과 같은 방식으로 원자로에서 프로젝트를 제외 시키는 새로운 -el플래그-pl 가 있습니다.


2
감사. 이것은 나를 위해 잘 작동했습니다. 또한 "-am"(AKA "--also-make")을 추가하여 지정한 모듈에 필요한 프로젝트를 빌드 할 수도 있습니다.
GaZ

1
큰! mvn install -pl .모듈을 만들지 않고 로컬 저장소에만 부모 pom을 설치하기 위해 사용 했습니다.
Marcin

또한 jira.codehaus.org/browse/MNG-5230을 살펴 보십시오 . 이제 원자로에서 프로젝트를 제외 할 수 있습니다.
blackbuild

1
codehaus.org 폐쇄 후 MNG-5230 링크 : issues.apache.org/jira/browse/MNG-5230
Ed Randall

불행히도, 전 이적으로 작동하지 않습니다. 즉, top / mod1 / mod2가 있고 위에서 빌드하면 -pl '! mod2'가 오류를 발생시킵니다.
zakmck

4

다중 모듈 프로젝트의 개념은 프로젝트의 상호 의존적 인 세그먼트의 요구를 충족시키기위한 것입니다. 이러한 클라이언트는 EJB 또는 데이터 액세스 루틴에 의존하는 서비스에 의존합니다. 넌 할 수있어 이러한 방식으로 귀하의 지속적인 통합 (CI) 검사 그룹에. CI 테스트는 응용 프로그램 논리 변경과 함께 단계적으로 진행되어야한다고 합리화 할 것입니다.

프로젝트가 다음과 같이 구성되었다고 가정하십시오.

project-root
  |
  + --- ci
  |
  + --- client
  |
  + --- server

project-root/pom.xml을 정의 모듈

<modules>
  <module>ci</module>
  <module>client</module>
  <module>server</module>
</modules>

다음 ci/pom.xml과 같은 프로파일을 정의합니다.

... 
<profiles>
  <profile>
    <id>default</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>true</skip>
       </configuration>
     </plugin>
  </profile>
  <profile>
    <id>CI</id>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>false</skip>
       </configuration>
     </plugin>
  </profile>
</profiles>

이로 인해 명명 된 프로파일 CI이 활성화 된 경우를 제외하고이 모듈에서 Maven이 테스트를 건너 뜁니다 . CI 서버가 실행되도록 지시해야합니다 mvn clean package -P CI. Maven 웹 사이트에는 프로파일 링 메커니즘에 대한 자세한 설명이 있습니다.


2

이제 (1.1.1 버전부터) 구덩이에 '건너 뛰기'플래그가 있습니다.

따라서 다음과 같은 작업을 수행 할 수 있습니다.

    <profile>
        <id>pit</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.pitest</groupId>
                    <artifactId>pitest-maven</artifactId>
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

당신의 모듈에서 구덩이를 건너 뛸 것입니다.

[INFO] --- pitest-maven : 1.1.3 : mutationCoverage (default-cli) @ module-selenium --- [INFO] 프로젝트 건너 뛰기

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