Maven 3의 모듈 버전으로 project.parent.version 사용에 대한 경고


80

각 모듈이 항상 부모와 동일한 버전을 유지하기를 원하는 Maven 다중 모듈 프로젝트에서 일반적으로 모듈의 pom.xml에서 다음과 같은 작업을 수행했습니다.

  <parent>
    <groupId>com.groupId</groupId>
    <artifactId>parentArtifactId</artifactId>
    <version>1.1-SNAPSHOT</version>
  </parent>

  <groupId>com.groupId</groupId>
  <artifactId>artifactId</artifactId>
  <packaging>jar</packaging>
  <version>${project.parent.version}</version>
  <name>name</name>

maven 3.0-alpha-5를 사용하기 시작한 이후로 다음과 같은 경고가 표시됩니다.

[WARNING] 
[WARNING] Some problems were encountered while building the effective model for com.groupid.artifactId:name:jar:1.1-SNAPSHOT
[WARNING] 'version' contains an expression but should be a constant. @ com.groupid.artifactId:name::${project.parent.version}, /Users/whaley/path/to/project/child/pom.xml
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]

모듈의 버전을 부모 버전에 묶는 실제 문제가 무엇인지 궁금합니다. 또는 project.parent.version인지 여부에 관계없이 모든 표현식이 버전 요소에 사용되는 경우 일반적인 경고의 경우입니다.

답변:


91

모듈의 버전을 부모 버전에 묶는 실제 문제가 무엇인지 궁금합니다. 또는 project.parent.version인지 여부에 관계없이 모든 표현식이 버전 요소에 사용되는 경우 일반적인 경고의 경우입니다.

글쎄, 그것은 테스트하기 쉽습니다. 호기심이 많았 기 때문에 다음 pom을 사용하여 방금 수행했습니다.

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>parent</artifactId>
    <groupId>com.mycompany</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <groupId>com.mycompany</groupId>
  <artifactId>module</artifactId>
  <version>${myversion}</version>
  <name>module</name>
  <url>http://maven.apache.org</url>
  <properties>
    <myversion>1.0-SNAPSHOT</myversion>
  </properties>
  ...
</project>

그리고 maven은 실제로 불평합니다.

[WARNING] 'version' contains an expression but should be a constant. @ com.mycompany:module:${myversion}, /home/pascal/Projects/maven-maven3-testcase/module/pom.xml

솔직히 말해서, maven이 바로 여기에 있다고 생각합니다. <version>요소 (적어도 project.version은 아님)에 속성을 사용하는 것이별로 이치에 맞지 않으며 maven이 그것에 대해 불평하는 것이 좋습니다.

하위 모듈에서 부모 pom 버전을 사용하려면 자식 poms에서 태그를 제거<version> 하면 부모로부터 버전을 상속받습니다. 현재하고있는 일은 불필요합니다.


2
maven.apache.org/guides/introduction/…에 문서화 된 굵게 표시된 답변을 확인하십시오 . Maven : The Definitive 가이드에서 그런 식으로 언급되었지만 읽었을 때 그 부분에 대해 설명했습니다. 수정 해 주셔서 감사합니다.
whaley 2009

13
jira.codehaus.org/browse/MNG-4715 의 예제 는 <version> 요소에 대한 속성을 사용하는 몇 가지 타당한 이유가있는 것 같습니다. 그래서 나는 그것에 대한 소용이 없다고 확신하지는 않지만 우리에게 상기시켜주는 +1 하위 모듈이 부모 pom 버전을 사용하도록하려면 태그를 제거하고 상속이 작동하도록합니다.
metamatt 2011

7
어리석은 일입니다 :-(. 버전의 buildnumber-maven-plugin에서 $ {buildNumber}를 어떻게 사용합니까?
Nux

6
아니! 메이븐 버전 3.2.1 제거 아이 리딩에서 버전 태그에서 발생 '프로젝트 빌드 오류 : parent.version이없는'
Junchen 리우

6
@shanyangqu. 여기서 명확하게. 자식 pom 의 부모 섹션 에서 버전을 제거 할 수 없다고 말하는 것이 맞습니다 . 상속하는 부모를 지정하는 데 필요합니다. 그러나 자녀 자체의 버전은 생략 할 수 있습니다 . 기본값은 parent.version (부모 섹션의 버전)입니다.
drrob

2

이것에 대해 논의하기 위해 여기에 늦을 수도 있습니다. 이것에 대한 간단한 해결책이 WARNING있습니다.

우선, 모든 하위 모듈이 상위와 동일한 버전을 사용하도록하려면 <version>하위 POM에서 태그를 제거 하고 하위 POM에 포함하면 <parent>거기에 있어야합니다.

<version>하위 POM 이 없으면 자동으로 상위 POM을 사용 version합니다.

이제 property부모 POM 버전에서 사용 하고 모든 자식 모듈에서 동일하게 사용하려면 다음과 같이 진행할 수 있습니다.

<version>부모 또는 자식 POM의 일부 에서 속성을 사용하는 데 제한이 없습니다 . 그러나 그것을 지정하기 위해 자신의 xml 태그를 사용하거나 자신의 속성을 사용하면 발생합니다 WARNING(이것은 경고 일뿐이지만 모든 것이 예상대로 작동합니다).

그러나 이것을 제거 WARNING하려면 다음 단계를 따르십시오.

  1. <properties>아래와 같이 POM.xml 내부에 생성

    <properties>
        <revision>1.0.0</revision>  <!-- Put your version -->
    </properties>
    
  2. 에서 <version>pom.xml 파일의, 다음과 같이 넣어

    <version>${revision}</version>
    

샘플 코드 스 니펫 (다중 모듈 프로젝트 용) :

<groupId>abc.xyz</groupId>
<artifactId>pqr</artifactId>
<!-- <version>1.0.0</version> -->
<version>${revision}</version>
<packaging>pom</packaging>
<description>Parent POM</description>

<properties>
    <revision>1.0.0</revision>
</properties>

참고 : 대신 <revision>다른 이름 (예 <my.version>:)을 사용하면WARNING

당신이 버전을하는 동안 전달하려면 지금 mvn deploy, 당신은 사용할 수 있습니다 mvn deploy "-Drevision=1.0.0-SNAPSHOT"과 유사하게 mvn install도.

이제 위의 구성이라면 부모 POM으로 사용 version하고 모든 자식 모듈에서 동일하게 사용하려는 경우 에도 수행 할 수 있습니다. 각각 child module POM에서 아래 사용

<parent>
    <groupId>abc.xyz</groupId>
    <artifactId>Parent</artifactId>
    <!-- <version>1.0.0</version> -->
    <version>${revision}</version>
</parent>

<groupId>abc.xyz</groupId>
<artifactId>Child</artifactId>
<!-- <version>1.0.0</version> -->     <!-- Automatically inherit parent POM version -->
<name>Demo</name>

참고로 maven 다중 모듈 설정을 진행할 수 있습니다.

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