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

부모 프로젝트 : 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있습니까?



답변

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


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

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


답변

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는 더 이상 그러한 구성을 허용하지 않는 것 같습니다.


답변

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

$ mvn versions:set -DgenerateBackupPoms=false

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

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


답변

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 파일이없는 버전?


답변

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예약 된 자산이 아닌 원하는 것으로 자유롭게 변경할 수 있습니다.


답변

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

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

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


답변

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에 있습니다.