Más sobre pom_version

 

Hace tiempo comenté que me había hecho un plugin de maven, pom_version, para ayudarme a cambiar los números de versión en los pom.xml de los proyectos maven. El problema era que en proyectos grandes, con muchos subproyectos, muchos pom.xml y muchas dependencias, era un pequeño infierno cambiar la versión de uno de los jar, ya que requería ir buscando y editando todos los pom.xml uno a  uno. El plugin hacía esto de forma más o menos automática en un proyecto maven.

El otro día me tocó hacer una rama de CVS para un hito con el cliente. Por un lado, eché casi un día entero haciendo sólo la rama de CVS. Los proyectos son grandes y los cvs tag recorren todos los ficheros uno a uno, por lo que sólo hacer los "cvs tag" en todos los proyectos implicados me llevó todo el día.

Al día siguiente me dediqué al cambio de números de versione en los pom.xml. Al crear una rama para un hito de cliente, todos los jar deben pasar a un número de versión nuevo, el del entregable y la rama en cuestión. Pensé que con el plugin el tema iba a ser rápido, pero no lo fue. Eché toda la mañana y no terminé.

El primer problema es que el plugin sólo maneja un proyecto maven con todos sus subproyectos. Pero nuestros proyectos tiran de librerías propias que a su vez tiran de librerías propias y muchas de ellas son grandes, con subproyectos y más subproyectos. La ejecución del plugin es inmediata en un proyecto maven, pero tengo que ir pasando manualmente por todos los proyectos, empezando por los más básicos hasta el de más alto nivel, revisando que no se quedan dependencias sin cambiar, que todo compila como debe, etc, etc.

El segundo problema, menor, es que el plugin no me soporta las propiedades en los números de versión. Si un pom.xml se define una propiedad "numeroVersion=1.2.3" y luego en las dependencias unos usas ${numeroVersion} y otros 1.2.3, el plugin sólo cambia los que usan variable o los que usan número, según se le diga.

Así que me he replanteado el tema, no puedo echar dos días cada vez que quiera hacer una rama general de todo el proyecto.

  1. Sólo para entretenerme, porque quizás deje de usarlo, en el plugin le he hecho un arreglo para que soporte bien las propiedades. Ahora está en versión pom_version 1.1.0. He aprovechado además para quitarle la dependencia que tenía con Xerces y hacer algo más de test junit (he intentado aplicar TDD para estas mejoras).
  2. La primera medida seria va a ser pasar de CVS a Subversion. En Subversion la creación de un tag o rama tarda entre dos o tres segundos, independientemente del tamaño del proyecto. A veces me gusta darle un comando al ordenador y luego estar un rato rascándome la barriga (por no decir otra cosa) mientras el ordenador trabaja, pero estar rascándome un día entero, acaba escociendo.
  3. La segunda medida seria y es sólo una idea, es hacerme una pequeña aplicación a la que se le configure diciéndole dónde están todos los proyectos maven que usa un determinado proyecto de cliente, decirle qué número de versión quiero para cada proyecto y que él se encarge de hacer todos los cambios en todos los proyectos. Por supuesto, esa pequeña configuración por proyecto, debe guardarse en algún sitio para no tener que indicar todos los directorios cada vez. No creo que una herramienta así me lleve mucho hacerla, ya que es simplemente buscar ficheros xml de nombre pom y hacer cambios en ellos. En el punto 1 comenté que quizás dejaría de usar el plugin y lo dejare si hago esta herramienta.

La duda que tengo respecto a la herramienta, es si hacerla yo mismo en mis ratos libres (y así disfrutar de un rato de codificación) o pasársela a uno de los FP que van a venir a hacer tres meses de prácticas…

Esta entrada ha sido publicada en maven y etiquetada como , . Guarda el enlace permanente.

3 respuestas a Más sobre pom_version

  1. ¿Has considerado usar maven-release-plugin? Y si no cubre todas tus necesidades quizás podáis hacer una contribución… 🙂

  2. Chuidiang dijo:

    Hola Jose Manuel:

    Lo estuve mirando en su día y funciona bien para un proyecto maven. Sin embargo a mí no me sirve 100% porque tenemos muchos proyectos maven independientes. Cambiar el número de versión en un proyecto básico, implica cambiar ese número de versión en los demás proyectos que aunque son también maven, no están en la estructura de directorios del primero. maven-release-plugin no me permite cambiar la versión de las dependencias ni tampoco navegar entre distintos proyectos.

    El plugin que me hice, pom-xml, sí permite cambiar la versión de las dependencias, además de la versión del proyecto en sí, pero me hace ir ejecutándolo en los distintos proyectos independientes uno a uno. Por ello estoy planteándome una herramienta, que ya no sería un plugin, a la que se configura con los paths locales de todos los proyectos, se le dice que artifacts tiene que cambiar de versión y los cambia, sean o no dependencias.

    Lo de la contribución… ¿a qué te refieres exactamente?

    Se bueno.

  3. Vaya, no conozco suficientemente bien maven-release-plugin como para aconsejarte aquí, pero se me antoja que si todos esos proyectos se ven afectados juntos por un cambio de versión es porque realmente forman parte de un mismo proyecto. Yo me plantearía si es posible tener un proyecto (con su pom.xml) «padre» de todos ellos (no en el sentido de que los demás heredan de él con ) y tendría a los demás como módulos (con ). Eso te permitiría hacer «release» de todos los módulos a la vez. Pero no sé si eso te valdrá.

    En cuanto a lo de las contribuciones, me refería a que a lo mejor maven-release-plugin no hace exactamente lo que necesitas, pero es posible «tocarlo» para que lo haga (es open source). Entonces, podrías contribuir a la comunidad Maven con ese «retoque». No sé exactamente cuáles son las condiciones para contribuir a maven-release-plugin, pero seguramente es tan fácil como hacer un parche y publicarlo en el JIRA correspondiente. http://jira.codehaus.org/browse/MRELEASE

    Un saludo,
    JMB

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.