Maven 프로젝트 버전 상속-상위 버전을 지정해야합니까?


189

부모 프로젝트 : A, 하위 프로젝트 : B

A / pom.xml :

<groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>0.1-SNAPSHOT</version>
<packaging>pom</packaging>

그리고 B / pom.xml에는 다음이 있습니다.

    <parent>
        <groupId>com.dummy.bla</groupId>
        <artifactId>parent</artifactId>
        <version>0.1-SNAPSHOT</version>     
    </parent>

    <groupId>com.dummy.bla.sub</groupId>
    <artifactId>kid</artifactId>

B가 부모로부터 버전을 상속 받기를 원하므로 필자의 경우 유일한 위치 0.1-SNAPSHOTA/pom.xml입니다. 내가 제거한다면 <version>0.1-SNAPSHOT</version>에서 B/pom.xml부모 섹션에서, 받는다는 부모의 누락 된 버전에 대해 불평.

두 폼폼 ${project.version}을 피하기 위해 내가 사용할 수있는 방법 이 01.-SNAPSHOT있습니까?


4
당신은 그것을 위해 Maven 3.1을 기다려야 할 것입니다.
인식



1
위의 링크가 이동했습니다. 최종 상태는 "폐쇄 / 수정되지 않음" issues.apache.org/jira/browse/MNG-624
jocull

답변:


86

편집 : Maven 3.5.0부터 ${revision}자리 표시자를 사용하는 좋은 해결책이 있습니다. 자세한 내용은 FrVaBe의 답변 을 참조하십시오. 이전 Maven 버전의 경우 아래의 원래 답변을 참조하십시오.


아닙니다. 항상 부모의 버전을 지정해야합니다. 다행히도 대부분의 경우 바람직한 버전으로 모듈 버전으로 상속됩니다. 또한이 부모의 버전 선언은 Maven Release Plugin에 의해 자동으로 충돌하므로 실제로 릴리스 또는 범핑 버전에 Maven Release Plugin을 사용하는 한 2 곳의 버전이있는 것은 문제가되지 않습니다.

이 동작이 실제로 괜찮은 경우가 있으며 더 많은 유연성을 필요로하는 경우가 있습니다. 때로는 이전 부모 버전을 사용하여 상속하려고하지만 때로는 주류가 아닙니다.


3
이제 ${revision}자리 표시자를 사용할 수 있습니다 . 내 대답보기 ;-)
FrVaBe

2
이것은 현재 구식입니다-@FrVaBe의 답변을 확인하십시오 : stackoverflow.com/a/51969067/514483
robd

@FrVa 다른 버전의 부모를 중첩 한 경우 어떻게해야합니까? 하나의 $ {revision} 속성을 사용할 수 없습니다. 충분하지 않습니다.
halil

@halil 문제는 두 개의 아티팩트에서 동일한 버전을 갖는 것을 목표로 부모로부터 버전을 상속하는 것입니다. 상속 계층 구조에서 다른 버전을 가진 다른 부모가있는 경우 부모를 모두 동일한 버전으로 만들지 않을 것입니다. 그러므로 나는 그 의견을 완전히 이해하지 못한다.
FrVaBe

86

Maven은 그런 식으로 작동하도록 설계되지 않았지만이 목표를 달성하기위한 해결 방법이 있습니다 (부작용이있을 수 있으므로 시도해보십시오). 트릭은 자식 프로젝트에 순수한 maven 좌표 대신 상대 경로 를 통해 부모를 찾도록하고 속성에서 버전 번호를 외부화하는 것입니다.

부모 치어

<groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>${global.version}</version>
<packaging>pom</packaging>

<properties>
   <!-- Unique entry point for version number management --> 
   <global.version>0.1-SNAPSHOT</global.version>
</properties>

어린이 치어

<parent>
   <groupId>com.dummy.bla</groupId>
   <artifactId>parent</artifactId>
   <version>${global.version}</version>
   <relativePath>..</relativePath>    
</parent>

<groupId>com.dummy.bla.sub</groupId>
<artifactId>kid</artifactId>

필자는 빌드 초기에 maven이 많은 경고를 기록한다는 사실을 제외하고는 특별한 문제없이 내 프로젝트 중 하나에 대해 잠시 동안 그 트릭을 사용했는데, 이는 매우 우아하지 않습니다.

편집하다

maven 3.0.4는 더 이상 그러한 구성을 허용하지 않는 것 같습니다.


2
예, maven이 그런 식으로 작동하도록 설계되지 않았으므로 하위 pom.xml에 버전을 넣는 것이 좋습니다. maven release plugin은 어쨌든 버전에 신경 쓰지 않습니다.
Shengjie

7
3.0.5 작동합니다. 그래도 <properties>를 맨 위에 놓아야합니다.
ses

7
3.2.3에서 작동합니다. <properties>의 위치는 중요하지 않습니다. 경고 메시지가 나타납니다.'version' contains an expression but should be a constant.
kapex

4
제발 조심해 다른 프로젝트에서 프로젝트를 참조 할 때는 작동하지 않습니다. 부동산은 해결되지 않으며 그대로 처리됩니다 (예 : $ {my.version}). 이것은 의존성을 해결할 때 실패로 이어질 것입니다.
spekdrum

2
나는 또한 이것을 꽤 오랫동안 사용 해 왔으며 단일 멀티 모듈 프로젝트에서 잘 작동합니다 (현재 maven 3.3.9에서). 그러나 프로젝트가 다른 프로젝트의 종속성이되면 즉시 까다로워집니다. 아래 @pay에서 제안한 제안을 채택하는 것이 좋습니다.
독창적 인

81

버전 IMO를 업데이트하는 가장 쉬운 방법 :

$ mvn versions:set -DgenerateBackupPoms=false

(root / parent pom 폴더에서 수행하십시오).

POM이 구문 분석되고 설정할 버전을 묻는 메시지가 표시됩니다.


17
대화식으로 입력하지 않도록 -DnewVersion = {versionToBeUpdated}를 추가 할 수도 있습니다.
Mukesh

1
이것이 가장 좋은 대답이라고 생각합니다. 하위 프로젝트를 중단하지 않고 버전 변경을 자동화합니다 (부모 퐁이 없으면 참조 할 수 없음).
Tarek

예! 이것이 답입니다. 🙌
aaiezza

하위 및 상위 pom 버전이 초기에 다르면 먼저 일치하도록 업데이트하십시오. mvn versions:update-child-modules 그렇지 않으면 모든 하위 모듈 pom 버전을 건너 뜁니다.
Gautam Tadigoppula

75

Maven 3.5.0부터는 ${revision}플레이스 홀더를 사용할 수 있습니다 . 사용은 Maven CI Friendly Versions에 문서화되어 있습니다 .

간단히 말해 부모 pom 은 다음과 같습니다 (Apache 문서에서 인용).

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache</groupId>
    <artifactId>apache</artifactId>
    <version>18</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-parent</artifactId>
  <name>First CI Friendly</name>
  <version>${revision}</version>
  ...
  <properties>
    <revision>1.0.0-SNAPSHOT</revision>
  </properties>
  <modules>
    <module>child1</module>
    ..
  </modules>
</project>

그리고 이런 아이 퐁

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache.maven.ci</groupId>
    <artifactId>ci-parent</artifactId>
    <version>${revision}</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-child</artifactId>
   ...
</project>

또한 전개 용으로 포함 된 전용 버전 번호로 pom 문서를 생성 하려면 Flatten Maven 플러그인 사용해야 합니다. HowTo는 링크 된 문서에 설명되어 있습니다.

또한 @khmarbaise는이 기능에 대해 멋진 글을 올렸습니다. Maven : POM 파일이없는 버전?


설명대로 프로젝트를 구성했지만 "Flatten Maven Plugin"이 없으면 예상대로 작동하는 것 같습니다. 가능합니까? 또한 maven 3.2.1에 오류가 있지만 maven 3.3.9 이상이 제대로 작동하는 것 같습니다.
Max

@Max "예상 작업"으로 정의한 내용에 따라 다릅니다. 자식 폼에는 버전 번호가없고 자리 표시 자만 있기 때문에 빌드는 통과하지만 리포지토리에 설치 / 배포하는 것은 좋은 생각이 아닙니다 ( 문서 참조 )
FrVaBe

기본 속성 (<properties> <version> 0.1-default </ version> </ properties>과 함께 상위 pom에서 <version> $ {revision} </ version>을 사용합니다. 하위 폼도 <version> $ {revision} < / version>. "mvn clean install -Drevision = 0.1. $ {bamboo.buildNumber}"를 사용합니다. 배포 로그를 검색하면 모든 항목이 0.1.820로 설정되고 0.1-default는 로그에도 포함되지 않습니다 (820). 결과 jar을 스캔하면 매니페스트에 "Implementation-Version : 0.1.820"이 표시되고 pom.properties 파일에 "version = 0.1.820"도 표시됩니다 .pom 파일 자체에는 <version>이 있습니다. $ {revision} </ version> : 괜찮다고 생각하십니까?
Max

1
@Max ${revision} 다른 프로젝트의 종속성으로 버전이 pom (maven 저장소)에 있는 jar을 해결하십시오 . 나는 이것이 효과가 있다고 생각하지 않습니다.
FrVaBe

릴리스를 할 때를 제외하고는 유용합니다. ${revision}버전 태그가 새 버전으로 바뀝니다
Mike D

21

Yanflea가 언급 했듯이이 문제를 해결할 수있는 방법이 있습니다.

Maven 3.5.0 에서는 다음과 같은 방법으로 상위 프로젝트에서 버전을 전송할 수 있습니다.

부모 POM.xml

<project ...>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mydomain</groupId>
    <artifactId>myprojectparent</artifactId>
    <packaging>pom</packaging>
    <version>${myversion}</version>
    <name>MyProjectParent</name>

    <properties>
        <myversion>0.1-SNAPSHOT</myversion>
    </properties>

    <modules>
        <module>modulefolder</module>
    </modules>
    ...
</project>

모듈 POM.xml

<project ...>
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.mydomain</groupId>
        <artifactId>myprojectmodule</artifactId>
        <version>${myversion}</version> <!-- This still needs to be set, but you can use properties from parent -->
    </parent>

    <groupId>se.car_o_liner</groupId>
    <artifactId>vinno</artifactId>
    <packaging>war</packaging>
    <name>Vinno</name>
    <!-- Note that there's no version specified; it's inherited from parent -->
    ...
</project>

귀하는 myversion예약 된 자산이 아닌 원하는 것으로 자유롭게 변경할 수 있습니다.


3
다른 프로젝트에서 모듈을 참조 할 때 Maven은 속성을 확인하지 않습니다. 그게 정상인가요?
LeoLozes

나는 그 질문이 그 자체의 입장에 합당 할 수 있으며 이와 같은 의견에 있지 않을 것이라고 믿는다. 코드를 보지 않으면 난 단지 추측 만 할 수 있습니다.
eFox

@LeoLozes 문제를 해결 했습니까 (다른 프로젝트의 굴절 모듈)?
Morteza Malvandi

@MortezaMalvandi 예! 내 대답은 아래에 있습니다 :)
LeoLozes

2
Maven 3.6.0은이 구성에 대해 경고합니다. "이 문제는 빌드의 안정성을 위협하므로 이러한 문제를 해결하는 것이 좋습니다." "이러한 이유로 향후 Maven 버전은 더 이상 이러한 잘못된 프로젝트 작성을 지원하지 않을 수 있습니다."
d2k2

17

다음을 사용할 수도 있습니다.

$ mvn release:update-versions -DdevelopmentVersion={version}

POM의 버전 번호를 업데이트합니다.


10

eFox 의 답변은 단일 프로젝트에서 효과가 있었지만 다른 모듈에서 모듈을 참조 할 때는 그렇지 않았습니다 (pom.xml은 여전히 .m2버전 대신 속성으로 저장됩니다 ).

그러나 flatten-maven-plugin속성이 아닌 올바른 버전으로 폼을 생성하기 때문에 와 결합하면 작동합니다 .

플러그인 정의에서 변경 한 유일한 옵션은입니다. outputDirectory기본적으로 비어 있지만 target.gitignore구성 에서 설정 하는 것을 선호 합니다.

<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>flatten-maven-plugin</artifactId>
   <version>1.0.1</version>
   <configuration>
      <updatePomFile>true</updatePomFile>
      <outputDirectory>target</outputDirectory>
   </configuration>
   <executions>
      <execution>
         <id>flatten</id>
         <phase>process-resources</phase>
         <goals>
            <goal>flatten</goal>
         </goals>
      </execution>
   </executions>
</plugin>

플러그인 구성은 상위 pom.xml에 있습니다.



0
<parent>
    <groupId>com.dummy.bla</groupId>
    <artifactId>parent</artifactId>
    <version>0.1-SNAPSHOT</version>     
 </parent>

 <groupId>com.dummy.bla.sub</groupId>
 <artifactId>kid</artifactId>

당신은 B의 pom의 부모 블록에서 버전을 제거하고 싶다는 것을 의미합니다. 그룹 ID, artifactId 및 버전은 부모의 pom 좌표를 지정했습니다. 아이의 버전은 생략 할 수 있습니다.

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