¿Cómo puedo actualizar una propiedad en un Maven POM?
pom.xml versions-maven-plugin (6)
¿Existe una forma sencilla de volver a escribir una entrada de propiedad de Maven a un valor específico?
Desde la versión 2.5
podemos usar set-property
( documentation ):
mvn versions:set-property -Dproperty=your.property -DnewVersion=arbitrary_value
Como se documentó, el objetivo de set-property
no realiza ninguna "comprobación de validez" en el valor que especifique, por lo que siempre debería funcionar, pero debe usarlo con cuidado.
Tengo dos proyectos de nivel superior de Maven, backend
y frontend
, que hacen avanzar las versiones a su propio ritmo. Dado que cada uno tiene varios módulos, defino mis versiones de dependencyManagement
en dependencyManagement
secciones de administración de dependencyManagement
en los POM principales / agregados y utilizo una propiedad para el número de versión.
Quiero actualizar limpiamente la propiedad con el número de versión en el frontend
, preferiblemente de manera arbitraria, pero puedo vivir con la necesidad de una versión anterior en vivo para que coincida. He intentado usar versions:update-property
, pero ese objetivo parece ser completamente no funcional; independientemente de si hay realmente una versión ascendente coincidente, obtengo este resultado de depuración:
$ mvn versions:update-property -Dproperty=frontend.version -DnewVersion=0.13.2 -DautoLinkItems=false -X
...
[DEBUG] Searching for properties associated with builders
[DEBUG] Property ${frontend.version}
[DEBUG] Property ${frontend.version}: Looks like this property is not associated with any dependency...
[DEBUG] Property ${frontend.version}: Set of valid available versions is [0.9.0, 0.9.1, 0.9.2, 0.9.3, 0.9.4, 0.9.5, 0.10.0, 0.10.1, 0.11.0, 0.12.0, 0.13.0, 0.13.1, 0.13.2, 0.13.3]
[DEBUG] Property ${frontend.version}: Restricting results to 0.13.2
[DEBUG] Property ${frontend.version}: Current winner is: null
[DEBUG] Property ${frontend.version}: Searching reactor for a valid version...
[DEBUG] Property ${frontend.version}: Set of valid available versions from the reactor is []
[INFO] Property ${frontend.version}: Leaving unchanged as 0.13.1
[INFO] ------------------------------------------------------------------------
He especificado -DautoLinkItems=false
, y esto parece no tener ningún efecto; versions-maven-plugin
aún escanea todos mis POM para buscar dependencias coincidentes, levanta sus manos y se cierra. También he intentado establecer searchReactor
en false
para esa propiedad en la configuración del complemento. Parece que el complemento (1) escanea incorrectamente las dependencias, incluso cuando he dicho explícitamente que las ignore y (2) incluso filtra una coincidencia específica explícita.
¿Existe una forma sencilla de volver a escribir una entrada de propiedad de Maven a un valor específico, ya sea forzando a las versions-maven-plugin
a hacer lo que digo sin validar un número de versión o usando otro objetivo? Prefiero evitar una herramienta como sed
que no entienda XML (como he visto recomendado en una pregunta similar), pero estaría bien con una simple manipulación de XPath.
Cuando defina su propiedad en el archivo pom.xml, debe declararlo como un intervalo si desea que la actualización de la propiedad funcione.
Quiero decir, seguro que tu versión frontal se define de la siguiente manera:
<frontend.version>0.13.1</frontend.version>
Luego el complemento cuando establece -DnewVersion = 0.13.2 no reconoce el valor como un valor válido. En lugar de si lo define como un intervalo, el complemento funciona.
<frontend.version>[0.13.0,0.13.2]</frontend.version>
En una de mis pruebas obtengo el siguiente resultado:
mvn versions:update-property -Dproperty=absis.version -DnewVersion=[2.20.4] -X
[DEBUG] Property ${test.version}: Set of valid available versions is [2.19.0-RC-REVISION-1, 2.19.0-RC0.1, 2.19.0-RC0.2, 2.19.0-RC0.3, 2.19.0-RC0.4, 2.19.0-RC0.5, 2.19.0-RC0.6, 2.19.0-RC0.7, 2.19.0-RC1, 2.19.0-RC2, 2.19.0-RC3, 2.19.0, 2.19.0-revision, 2.19.0-revision2, 2.19.0.2, 2.19.1, 2.19.2, 2.19.3, 2.19.4, 2.20.0-RC0, 2.20.0-RC0.1, 2.20.0-RC1, 2.20.0-RC2, 2.20.0-RC3, 2.20.0, 2.20.0-PRUEBA-VERSION, 2.20.0-PRUEBA-VERSION-2, 2.20.0-PRUEBA-VERSION-3, 2.20.0i-RC1, 2.20.0i-RC1.1, 2.20.0i, 2.20.0i.2, 2.20.1, 2.20.2, 2.20.4, 2.20.5, 2.20.5-LT, 2.20.5.1, 2.20.6i-RC1, 2.21.0-RCtest1, 2.21.0-RCtest2]
[DEBUG] Property ${test.version}: Restricting results to [2.20.4,2.20.4]
[DEBUG] Property ${test.version}: Current winner is: 2.20.4
[DEBUG] Property ${test.version}: Searching reactor for a valid version...
[DEBUG] Property ${test.version}: Set of valid available versions from the reactor is []
[INFO] Updated ${test.version} from [2.19.0,2.21.0-SNAPSHOT] to 2.20.4
Compre que necesita cambiar el valor de la propiedad a un rango.
Es una pena porque no puedo usar el rango en mi definición de poms.
El parámetro newVersion está mal documentado (como lo está la mayoría de este complemento). Al verificar las pruebas de integración, veo que toma un rango de versiones de Maven, no un número de versión simple. Además, no le permite proporcionar ningún valor, debe ser válido y Maven puede resolverlo. El parámetro sería mejor si se llamara constrainRange
Para cualquier otra persona en el futuro, intente esto:
mvn versions:update-property -Dproperty=frontend.version -DnewVersion=[0.13.2]
Si necesita actualizar a una instantánea, asegúrese de establecer la propiedad allowSnapshots
en true
mvn versions:update-property -Dproperty=frontend.version -DnewVersion=[0.13.2] -DallowSnapshots=true
Lo siguiente se aplica a las versiones: objetivo de actualización de propiedades. Creo que lo mismo se aplicaría a las versiones: update-property.
El objetivo por defecto solo funciona si la definición de propiedad y la declaración de dependencia correspondientes aparecen en el mismo archivo POM.
Si, por ejemplo, la propiedad se define en un POM de proyecto pero se usa en una declaración de dependencia en un módulo POM, entonces se requiere la siguiente configuración en el POM de proyecto para la actualización automática a través del complemento Versions.
<properties>
<my.version>3.7.11</my.version>
</properties>
...
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<properties>
<property>
<name>my.version</name>
<dependencies>
<dependency>
<groupId>com.acme.test</groupId>
<artifactId>demo-arti</artifactId>
</dependency>
</dependencies>
</property>
</properties>
</configuration>
</plugin>
</plugins>
</build>
La configuración del complemento entra en acción cuando el complemento Versions maven se ejecuta en el POM e intenta actualizar la propiedad. La configuración le dice al complemento de Versiones que la propiedad se usará para la dependencia indicada "en un POM en algún lugar", incluso si no está en el POM actual.
Tuve el mismo problema y no encontré nada que cambiara las propiedades de pom en el archivo. Terminé usando sed como tu sugeriste
cat pom.xml | sed -e "s%<util.version>0.0.1-SNAPSHOT</util.version>%<util.version>$bamboo_planRepository_branch</util.version>%" > pom.xml.transformed;
rm pom.xml;
mv pom.xml.transformed pom.xml;
Cómo actualizar la propiedad en POM existente:
Trate de usar el filtrado en el maven-resource-plugin :
- especifique la versión en el archivo de propiedades;
- agregue un filtro personalizado con la ruta a este archivo (en pom.xml secundario, donde se debe inyectar la dependencia);
- versión actualizada en el archivo de propiedades;
- ejecutar construir
Ventajas:
- deberia de funcionar;
- la versión se especifica una sola vez;
- archivo de propiedad podría ser agregado bajo control de versión;
- proceso-recursos es uno de los primeros pasos del ciclo de vida de Maven.
Desventajas:
- bueno, pom.xml todavía usa marcador de posición;
- trabajo adicional para actualizar automáticamente el archivo de propiedades desde la construcción inicial (demasiado complicado, supongo que debería haber soluciones fáciles).
Cómo proporcionar propery en tiempo de construcción:
Podrías especificar cualquier propiedad por parámetro de compilación.
Por ejemplo, tengo propiedades en mi pom.xml como:
<properties>
<build.date>TODAY</build.date>
</properties>
Para cambiarlo durante la compilación simplemente uso el parámetro:
mvn compile -Dbuild.date=10.10.2010
Estoy bastante seguro de que funcionará para la versión también. Además, las propiedades de los proyectos de nivel superior son heredadas por los niños.