멀티 모듈 Maven 프로젝트에서 모듈의 버전 번호 업데이트


325

멀티 모듈 maven 프로젝트가 있습니다. 우리는이 모든 모듈을 함께 버전 화하려고합니다. 그러나 지금은 아래와 같이 각 모듈 pom.xml에서 하드 코딩 버전을 끝내고 있습니다.

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>
<version>2.50.0.g</version>

기본 상위 모듈의 구성은 다음과 같습니다.

<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-application</artifactId>
<version>2.50.0.g</version>
<packaging>pom</packaging>

1
귀하의 질문이 잘못되어 진정한 다중 모듈 ( "집계") POM을 가진 사람들을 혼동합니다. 귀하의 예와 답변에서 실제로 다중 모듈 집계 POM이 아닌 상위 POM에 대해 이야기하고있는 것 같습니다. maven.apache.org/pom.html#Aggregation을 참조하십시오 .
Garret Wilson

답변:


631

versions-maven 플러그인versions:set 에서 사용하십시오 .

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

다중 모듈 프로젝트에서 모든 pom 버전, 상위 버전 및 종속성 버전을 조정합니다.

실수를했다면

mvn versions:revert

나중에 또는

mvn versions:commit

결과에 만족한다면.


참고 :이 솔루션은 모든 모듈이 집계 pom을 부모 pom으로 사용한다고 가정합니다.이 답변은 당시 표준으로 간주되었습니다. 그렇지 않은 경우 Garret Wilson의 답변으로 이동하십시오 .


5
실제로 각 모듈을 변경할 필요가없는 솔루션이 있다면 좋을 것입니다. 내가 생각할 수있는 유일한 대안은 항상 부모 pom에 스냅 샷 버전을 사용하는 것입니다.
AmanicA

54
또한 이 플러그인은 기본적으로 원본 pom 파일을 백업하므로을 versions:set지정할 수 -DgenerateBackupPoms=false있습니다.
Maksim Sorokin 8

20
요점은 versions:commit: "폼의 초기 백업을 제거하여 변경 사항을 수락합니다."
Michael Laffargue

2
새로운 플러그인은이 질문에 설명 된 문제를 다르게 해결합니다 : mojo.codehaus.org/flatten-maven-plugin/examples/…
Stephan

1
@MichaelLaffargue mvn versions : commit은 이전 pom.xml에서 생성 된 백업 파일을 제거하는 것으로 보입니다
Cris Rockwell

58

주어진 답변은 해당 프로젝트가 모듈 집계 외에도 프로젝트 상속을 사용한다고 가정합니다. 실제로 이들은 고유 한 개념입니다.

https://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Project_Inheritance_vs_Project_Aggregation

일부 프로젝트는 모듈의 집계 일 수 있지만 집계 자 POM과 집계 된 모듈간에 상위-하위 관계가 없습니다. 부모-자식 관계가 전혀 없거나 하위 모듈이 모두 "부모"로 별도의 POM을 사용할 수 있습니다. 이러한 상황에서는 주어진 답변이 작동하지 않습니다.

많은 독서와 실험 끝에 Versions Maven Plugin 을 사용하여 애그리 게이터 POM뿐만 아니라 모든 집계 된 모듈도 업데이트 할 수있는 방법이 있습니다 . 그것은이다 processAllModules옵션을 선택합니다. 수집기 프로젝트의 디렉토리에서 다음 명령을 수행해야합니다.

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules

Versions Maven Plugin은 포함 된 모든 모듈의 버전을 업데이트 할뿐만 아니라 모듈 간 종속성도 업데이트합니다! 이것은 큰 승리이며 많은 시간을 절약하고 모든 종류의 문제를 방지합니다.

물론 모든 모듈에서 변경 사항을 커밋하는 것을 잊지 마십시오. 동일한 스위치로 수행 할 수도 있습니다.

mvn versions:commit -DprocessAllModules

백업 POMS를 모두 사용하지 않고 하나의 명령으로 모든 작업을 수행 할 수 있습니다.

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules -DgenerateBackupPoms=false

빌드 헬퍼 플러그인과 마찬가지로 다음 버전을 어떻게 자동화합니까?
lostintranslation

Maven 3.5.0을 사용하면이 작업을 수행 할 수 없습니다. 프로젝트 집계가 있고 상위 pom 만 업데이트되었습니다. 또한 프로젝트 상속 (제공된 링크의 "세 가지 규칙"과 함께 집계)을 시도했지만 부모 pom 만 다시 업데이트되었습니다.
SiKing

1
비밀 제작 용 스위치를 찾았습니다. 상위 pom의 시작 버전과 모듈이 동일해야합니다! 부모님 폼은 "1-SNAPSHOT"로 시작했고 모듈에는 "1.0.0-SNAPSHOT"이있었습니다. :)
SiKing

1
애그리 게이터 프로젝트의 경우 애그리 게이터 버전과 서브 모듈의 버전 이 같을 필요는 없습니다 . 예를 들어 애그리 게이터 폼은 거의 변경되지 않고 특정 버전으로 유지 될 수 있지만 개별 하위 모듈에는 자체 릴리스주기가있을 수 있습니다. 받는 핵심 속성은 지정하는 versions:set플러그인이 -DoldVersion='*'mojohaus.org/versions-maven-plugin/set-mojo.html 명시 적으로 애그리 게이터 (aggregator) 프로젝트를 처리 할 때이 속성을 지정해야합니다 말한다.
Matthew Wise

2
-DprocessAllModules실제로 어떤 조건에서 작동합니까? 그것은 나를 위해 작동하지 않습니다.
Alex R

24

프로세스를 완전히 자동화하려면 (즉, 현재 버전 번호가 무엇인지 알 필요없이 버전 번호를 늘리려면) 다음을 수행하십시오.

mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} versions:commit

3
감사합니다, @Crummy, 당신은 내 하루를 저장
Maksim Kostromin


또는 사용할 수 있습니다-DoldVersion='*'
Matthew Wise

23

Maven 릴리스 플러그인의 release : update-versions 목표 를 살펴볼 수 있습니다 . 부모의 버전과 그 아래의 모든 모듈을 업데이트합니다.


업데이트 : 위의 릴리스 플러그인입니다. 출시하지 않을 경우 사용할 수 있습니다versions:set

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT

1
mvn version : set은 모듈에 영향을 미치지 않습니다.
9ilsdx 9rvj 0lo


원자로 건설이 같은 시간 부모에있을 때 가능합니다. 구조가 다르게 보일 때 혼란 스럽다 ...
9ilsdx 9rvj 0lo

mvn release:update-versions -DautoVersionSubmodules:-)를 해제하지 않더라도 나를 위해 잘 작동했습니다.
msa

11

멀티 모듈 (리액터) 빌드에 대한 Maven Book 을 읽으십시오 .

나는 특히 다음을 의미했다.

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>
<version>2.50.0.g</version>

로 변경해야합니다. 여기서 정의되지 않은 버전은 정의 된 상위 부분에만주의하십시오.

<modelVersion>4.0.0</modelVersion>

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>

이것은 더 나은 링크입니다 .


10
구체적으로 무엇을 찾으십니까?
Thorbjørn Ravn Andersen

2
pom.xml파일 의 올바른 형식을 가져 오면 +1 하지만 (@ ThorbjørnRavnAndersen과 함께)이 정보에 대한 전체 책을 읽는 것이 과도하다는 데 동의합니다. : p
Priidu Neemre

7
불행하게도 수정해야하는 부담을 제거하지 않는 부모로부터 버전 정보를 상속 모든 치어 파일을 그들 때문에 모든 참조하여 부모 - 프로젝트에 버전 번호를.
스티븐은 쉽게 즐겁게

1
이 모든 것을 처리하는 버전 -maven-plugin을 사용하거나 maven-release-plugin을 사용할 수 있으므로 수동으로 처리 할 필요가 없습니다.
khmarbaise

5

versions:update-child-modules당신이 찾고있는 것처럼 들립니다. 언급 한대로 버전 : 세트를 수행 할 수 있지만 이것은 상위 버전 번호를 업데이트하는 간단한 방법입니다. 자식 모듈의 <version>경우 부모 모듈의 버전 번호를 상속하므로 정의를 제거해야한다고 생각합니다 .


3

가장 좋은 방법은 모듈을 함께 묶으려고하므로 <dependencyManagement>태그 pom.xml아래 가장 바깥 쪽 (상위 모듈)에 직접 태그를 지정할 수 있습니다 <project>. 버전 및 그룹 이름을 제어합니다. 개별 모듈에서는에 <artifactId>태그 를 지정하면 pom.xml됩니다. 부모 파일에서 버전을 가져옵니다.


pom.xml에서 dependencyManagement 태그를 찾을 수 없습니다 . 다른 것에 대해 생각하고 있습니까?
ArturoTena

0

가장 쉬운 방법은 모든 pom.xml의 버전을 임의의 버전으로 변경하는 것입니다. 그런 다음이 모듈에 사용 된 올바른 버전의 모듈을 사용하도록 종속성 관리를 확인하십시오! 예를 들어, 견인 모듈 프로젝트의 버전을 늘리려면 흐름과 같이해야합니다.

childe 모듈에서 :

    <parent>
       <artifactId>A-application</artifactId>
       <groupId>com.A</groupId>
       <version>new-version</version>
    </parent>

그리고 부모 모듈에서 :

<groupId>com.A</groupId>
<artifactId>A-application</artifactId>
<version>new-version</version>

0

하위 모듈에서 기본 pom.xml 및 상위 버전을 업데이트하려면

mvn versions:set -DnewVersion=1.3.0-SNAPSHOT -N versions:update-child-modules -DgenerateBackupPoms=false
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.