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

각 모듈이 항상 부모와 동일한 버전을 유지하기를 원하는 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인지 여부에 관계없이 모든 표현식이 버전 요소에 사용되는 경우 일반적인 경고의 경우입니다.



답변

모듈의 버전을 부모 버전에 묶는 실제 문제가 무엇인지 궁금합니다. 또는 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> 하면 부모로부터 버전을 상속받습니다. 현재하고있는 일은 불필요합니다.


답변

이것에 대해 논의하기 위해 여기에 늦을 수도 있습니다. 이것에 대한 간단한 해결책이 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 다중 모듈 설정을 진행할 수 있습니다.


답변