Advertencia sobre el uso de project.parent.version como la versión de un módulo en Maven 3

79

En los proyectos de múltiples módulos de maven donde quiero que cada uno de los módulos mantenga siempre la misma versión que el padre, normalmente he hecho algo como lo siguiente en el pom.xml del módulo:

  <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>

Desde que comencé a usar maven 3.0-alpha-5, recibo la siguiente advertencia al hacerlo.

[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]

Tengo curiosidad por saber cuál es el problema real de vincular la versión de un módulo a la versión principal, si corresponde. ¿O se trata de un caso de advertencia general cuando se usa cualquier expresión, independientemente de si es project.parent.version, para el elemento de versión?

whaley
fuente

Respuestas:

91

Tengo curiosidad por saber cuál es el problema real de vincular la versión de un módulo a la versión principal, si corresponde. ¿O se trata de un caso de advertencia general cuando se usa cualquier expresión, independientemente de si es project.parent.version, para el elemento de versión?

Bueno, eso sería fácil de probar. Como tenía curiosidad, lo hice por ti usando el siguiente 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>

Y Maven de hecho se está quejando:

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

Para ser honesto, creo que maven está aquí, no tiene mucho sentido usar una propiedad para el <version>elemento (al menos no para project.version) y es bueno que maven se queje de ello.

Y si desea utilizar la versión de pom principal en submódulos, simplemente elimine la <version>etiqueta de los poms secundarios , estos heredarán la versión de los poms principales. Lo que está haciendo actualmente es innecesario.

Pascal Thivent
fuente
2
Solo veo su respuesta en negrita documentada aquí: maven.apache.org/guides/introduction/… . Se mencionó de esa manera en Maven: la guía definitiva, pero lo pasé por alto en el momento en que lo leí. Gracias por la corrección.
whaley
13
Los ejemplos en jira.codehaus.org/browse/MNG-4715 parecen tener algunas razones válidas para usar una propiedad para el elemento <version>, así que no estoy convencido de que no sirva para eso, sino +1 para recordarnos que en el caso de que desee que los submódulos utilicen la versión pom principal, simplemente elimine la etiqueta y deje que la herencia funcione.
metamatt
7
Eso es estúpido :-(. ¿Cómo uso $ {buildNumber} de buildnumber-maven-plugin en la versión?
Nux
6
¡No! En la versión 3.2.1 de Maven, elimine la etiqueta de versión de los poms secundarios, lo que da como resultado un 'error de compilación del proyecto: falta la
versión principal
6
@shanyangqu. Solo para ser claro aquí. Tiene razón al decir que no puede eliminar la versión de la sección principal del pom secundario. Eso es necesario para especificar el padre del que está heredando. Pero puede omitir la versión del niño en sí. Por defecto será parent.version (la versión en la sección principal).
drrob
2

Podría llegar tarde para discutir sobre esto. Tengo una solución simple para esto WARNING.

En primer lugar, si desea que todos los módulos secundarios tengan la misma versión que los padres, simplemente elimine la <version>etiqueta del POM secundario y, como lo incluye <parent>en el POM secundario, debería estar allí.

En ausencia de <version>un POM secundario, tomará automáticamente el POM principal version.

Ahora, si desea usar propertyen la versión principal de POM y desea obtener lo mismo en todos los módulos secundarios, puede realizar lo siguiente.

No hay limitación en el uso de la propiedad en <version>parte del POM padre o hijo. Pero si usa su propia etiqueta xml para especificar eso o usa su propia propiedad, entonces WARNINGviene, (aunque esto es solo una advertencia, todo funciona como se esperaba).

Pero si desea deshacerse de esto WARNING, puede seguir estos pasos:

  1. Cree <properties>dentro de POM.xml como se muestra a continuación

    <properties>
        <revision>1.0.0</revision>  <!-- Put your version -->
    </properties>
    
  2. En <version>el POM.xml, ponga lo siguiente

    <version>${revision}</version>
    

Fragmento de código de muestra (para proyectos de varios módulos):

<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>

Nota : En lugar de <revision>, si usa cualquier otro nombre (por ejemplo, <my.version>), enfrentará eseWARNING

Ahora, si desea pasar la versión durante mvn deploy, puede usar mvn deploy "-Drevision=1.0.0-SNAPSHOT"y de manera similar mvn installtambién.

Ahora, si la configuración anterior, desea usar como POM principal y desea usar la misma versionen todos los módulos secundarios, eso también se puede hacer. En cada uno child module POM, use a continuación

<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>

Como referencia, puede pasar por la configuración de múltiples módulos de maven

S.MANDAL
fuente