Maven 모듈 + 단일 특정 모듈 구축


383

나는 부모 프로젝트와 다중 모듈 Maven 프로젝트가 P와 세 개의 하위 모듈 A, BC. 모두 BC전쟁 프로젝트는 둘 다에 달려있다 A.

내가 입력 할 수 mvn compile있는 P제대로 컴파일 된 서브 모듈을 모두 가지고있다. 특정 모듈에 대한 작업을 수행하려고 할 때 문제가 발생합니다.

프로젝트를 위해 전쟁을 패키징하고 싶지만 디렉토리 B에서 package 명령을 실행하면에 B대한 종속성을 찾을 수 없다고 불평합니다 A.

나는이 질문에서 이해합니다 : Maven 은 아마도 Maven이 이러한 유형의 종속성 해결을 위해 설계되지 않았지만 어떻게 패키지 B해야합니까?

  1. mvn package정말로 원할 때 전체 프로젝트 계층에 대해 실행해야 B합니까?

  2. 패키지를 만들 때마다 A의 스냅 샷을 로컬 리포지토리에 설치해야 B합니까?

이 두 번째 시나리오는 A여전히 활발한 개발 중에 있을 때 그리 재미 있지 않습니다 .

여기에 모범 사례가 있습니까?


의 중복 가능성 메이븐와 종속 모듈
oberlies

답변:


694

여기에 모범 사례가 있습니까?

Maven 고급 원자로 옵션 을보다 구체적으로 사용하십시오 .

-pl, --projects
        Build specified reactor projects instead of all projects
-am, --also-make
        If project list is specified, also build projects required by the list

따라서 cd부모 P 디렉토리로 들어가서 다음을 실행하십시오.

mvn install -pl B -am

그리고 이것은 B와 B에 필요한 모듈을 구축 할 것입니다.

artifactId디렉토리 이름과 다른 것을 참조하는 경우 콜론을 사용해야합니다 .

mvn install -pl :B -am

여기에 설명 된대로 : https://stackoverflow.com/a/26439938/480894


15
2011 년에이 페이지를 방문한 사람은이 방법이 더 좋습니다. maven 자체 (Maven 2.1 이상) 내에서 다중 모듈을 더 잘 지원하므로 리액터 플러그인을 사용할 필요가 없습니다.
Spedge

17
또 다른 유용한 옵션은 "-amd, --also-make-dependents"로, 원자로 목록의 프로젝트에 따라 모든 모듈을 빌드합니다.
deterb

1
손자 모듈을 만드는 것은 어떻습니까?
Bax

12
@Bax, mvn install -pl .,parent/child,parent/child/grandchild 쉼표를 사용하여 여러 프로젝트를 구분하십시오. 부모 pom
Neo

1
clean package이 방법으로 모듈을 시도하면 아직 설치되지 않은 원자로 의존성을 해결할 수 없습니다. 로 -am그 불필요하게 deps 다시 작성됩니다.
분지

18

Parent pom.xml에 6 개의 모듈이 있으며 A , BF 를 실행한다고 가정하십시오 .

<modules>
        <module>A</module>
        <module>B</module>
        <module>C</module>
        <module>D</module>
        <module>E</module>
        <module>F</module>
  </modules>

1- 부모 프로젝트로 cd

 mvn --projects A,B,F --also-make clean install

또는

mvn -pl A,B,F -am clean install

또는

mvn -pl A,B,F -amd clean install

참고 : -am 을 사용하여 프로젝트를 지정할 때 옵션 Maven은 지정된 프로젝트가 의존하는 모든 프로젝트를 (직접 또는 간접적으로) 빌드합니다. Maven은 프로젝트 목록을 검토하고 종속성 트리를 내려 가서 빌드해야하는 모든 프로젝트를 찾습니다.

-am 명령은 다중 모듈 빌드에서 특정 프로젝트에 필요한 모든 프로젝트를 만드는 반면 -amd 또는 --also -make-dependents 옵션은 Maven이 프로젝트 및 해당 프로젝트에 종속 된 프로젝트를 빌드하도록 구성합니다. --also-make-dependents를 사용할 때 Maven은 원자로의 모든 프로젝트를 검사하여 특정 프로젝트에 의존하는 프로젝트를 찾습니다. 자동으로 해당 프로젝트를 빌드하고 다른 것은 없습니다.


8

Maven은 이러한 유형의 종속성을 위해 설계되었습니다.

mvn package 로컬 리포지토리에 아무것도 설치하지 않고 프로젝트를 패키징하고 대상 폴더에 남겨 둡니다.

수행 mvn install이 모든 서브 모듈은, 컴퓨터의 메이븐 저장소에 설치됩니다로, 상위 프로젝트 (A)에서 방금 / 컴파일 서브 모듈 패키지 (B)와 메이븐은 이미 포장 걸릴 필요가 변경이없는 경우 의존성을 바로 설치했습니다.

당신은 단지 필요 mvn install당신이 코드의 일부를 업데이트 한 경우 부모 프로젝트.


3
개발하는 동안 악몽이 될 것입니다. 이미지를 일단 서브 모듈에서 수정하면 설치 한 다음 서블릿 컨테이너를 시작합니다. 인생은 짧다 :(
hguser

7

이전 에 프로젝트 B에서 mvn install 을 실행 한 경우 로컬 저장소에 설치되어 패키지 A를 빌드 할 때 Maven이 종속성을 해결할 수 있습니다. 따라서 프로젝트 B를 변경할 때마다 프로젝트 B를 설치하는 한 프로젝트 A의 빌드는 최신 상태입니다.

집합 자 pom을 사용하여 다중 모듈 프로젝트를 정의하여 프로젝트 세트를 빌드 할 수 있습니다.

m2eclipse에 대해서도 언급 할 가치가 있으며 Maven을 Eclipse에 통합하고 작업 공간의 종속성을 (선택적으로) 해결할 수 있습니다. 따라서 여러 프로젝트를 해킹하는 경우 작업 영역 컨텐츠가 컴파일에 사용됩니다. 변경 사항에 만족하면 mvn install (각 프로젝트에서 차례로 또는 집계자를 사용하여)을 실행하여 로컬 리포지토리에 저장하십시오.


1
대상 프로젝트에 대한 모든 종속 프로젝트가 설치되었는지 쉽게 확인할 수 있습니까? 내가 가지고있는 계층 구조는 실제로 여기에 설명 된 계층 구조보다 훨씬 복잡하므로 마지막으로 코드 변경을 수행 한 후 각 종속 프로젝트에 대해 mvn install을 실행했는지 기억하십시오.
Brian Ferris

예, 모듈을 사용하여 프로젝트 세트를 빌드하려면 원래 답변에 추가 된 링크를 참조하십시오.
Rich Seller

5

내 답변 Maven 및 종속 모듈을 살펴보십시오 .

메이븐 원자로 플러그인 프로젝트의 일부를 구축 처리하도록 설계되었습니다.

당신이 그것을 사용하려는 특정 목표 reactor:make.


3
이것은 정답 이었지만 Maven 2.1에서는 더 이상 원자로 플러그인을 사용할 필요가 없습니다. 이 스레드에서 "고급 원자로 옵션"
Spedge

3

당신은 "정말 그냥 B를 원한다"고 말하지만, 이것은 거짓입니다. B를 원하지만 변경 사항이있는 경우 업데이트 된 A도 원합니다 ( "활성 개발").

따라서 때때로 A, B 및 C로 작업하려고합니다.이 경우 어 그리 게이터 프로젝트 P가 있습니다. A 및 B로 작업하려는 경우 ( C 원하지 않음 ) 어 그리 게이터 프로젝트 Q를 작성해야합니다. .

2016 편집 : 위의 정보는 2009 년에 관련되었을 수 있습니다. 2016 년 현재 대부분의 경우이를 무시 하고 허용 된 답변에 설명 된대로 -am또는 -pl명령 줄 플래그를 사용하는 것이 좋습니다 . v2.1 이전의 maven 버전을 사용하는 경우 먼저 변경하십시오 :)


Grmphh ... 그러면 프로젝트만큼 많은 애그리 게이터 프로젝트가 생길 것입니다.
Kris

@Kris 더 이상 권장하지 않습니다. 누군가가 여전히 방법을 알고 싶어하는 경우를 대비하여 여기에 두겠습니다. 그러나 항상 -am 및 -pl 플래그를 사용합니다. 내 답변을 업데이트했습니다.
Zac Thompson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.