Características de Maven3 respecto a Maven2

RECU-0681 (Recurso Referencia)

Descripción

En el presente recurso se describen las novedades y diferencias aparecidas en la versión 3 de la herramienta Maven respecto a Maven2. Se describirán las ventajas que supone la migración de Maven2 a Maven3, los problemas que pueden surgir al migrar a Maven3 proyectos inicialmente desarrollados en Maven2, y los problemas de incompatibilidad que existen entre Maven3 y otras herramientas propuestas por MADEJA.

Mejoras ofrecidas por Maven3

Entre las principales mejoras ofrecidas por Maven3 frente a Maven2, las más destacables son:

  • Maven3 ofrece una notable mejora de rendimiento respecto a Maven2. Aunque en proyectos de tamaño pequeño esta mejora no resulta muy notable, se trata de una mejora muy destacable en proyectos de gran tamaño. Según las características del proyecto, la mejora en tiempo de construcción del proyecto puede ir del 50% hasta el 400%.
  • Maven3 ofrece un reporte de errores de construcción notablemente mejor que Maven2. Junto con un reporte más detallado de los errores detectados en la construcción del proyecto, se ofrecen enlaces a las páginas de la wiki de Maven en las  que se describen las características de cada error y sus posibles causas.

Otras mejoras de consideración ofrecidas por la versión 3 son las siguientes:

  • En Maven3 no es necesario especificar la versión de los submódulos construidos a partir de un módulo padre.
  • Maven3 permite conectar distintos puntos de extensión para modificar el comportamiento de un plugin, en lugar de tener que extender el plugin como hasta ahora.
  • Se permite formar un POM mediante fragmentos de otros POM, en lugar de usar la herencia.

Existen una serie de mejoras de interés que dependen de extensiones o plugins desarrollados para la nueva versión. Las principales mejoras de este tipo son las siguientes:

  • Una nueva extensión para la versión Maven3 es la que permite emplear ficheros de construcción políglotas. Es decir, esta extensión nos permite que el fichero POM esté escrito en idiomas distintos a XML, como Groovy, Ruby, Scala, Clojure, YAML, etc.
  • Otra extensión nueva en esta versión es Maven Shell. Se trata de una  interfaz de línea de comando que mejora el rendimiento de la construcción manejando un caché de POM parseado, eliminando la necesidad de invocar Maven de forma repetida.
  • El plugin M2Eclipse que proporciona la integración entre Maven y Eclipse ha sido totalmente reescrito para esta nueva versión, proporcionando una mejora del rendimiento que pueda ir del 200% al 500% según las características del proyecto.

Problemas de compatiblidad entre Maven2 y Maven3

Uno de los objetivos de la nueva versión de Maven ha sido que no haya problemas de compatibilidad con la versión anterior. Sin embargo, existen diferencias que pueden obligar a modificar el código existente en un proyecto Maven para su transición entre la versión 2 y la versión 3:

TítuloDescripción
 Uso de profiles.xmlSe ha eliminado el soporte para los perfiles que se encuentren fuera de los ficheros POM y settings.xml. Estos perfiles hasta ahora podían declararse en ficheros profiles.xml. Los proyectos en los que se estén empleando perfiles declarados en ficheros profiles.xml deberán ser modificados previamente a la migración a Maven3 para integrar la información de perfiles en el fichero pom.xml.
 Reporte y generación de site en coreComo resultado de una refactorización, las funcionalidades de reporte y de generación de site han sido suprimidas del “core” de Maven en la nueva versión. Ambas funcionalidades han sido incluidas como plugin. Debido a este mismo proceso de refactorización, el plugin de site Maven (Maven Site Plugin) de la versión 2.x no funciona en esta nueva versión 3.x. Existe un plugin desarrollado para la versión 3.x, que deberá emplearse con Maven3.
 Asociación de descriptores Se ha eliminado la ejecución por defecto de la asociación de descriptores (site:attach-descriptor), haciendo obligatoria su declaración explícita.
 Configuración de plugins en reporting La configuración de los plugins en la sección “reporting” ya no afecta a la sección “build”, haciendo obligatorio duplicar la configuración de plugins en ambas secciones cuando sea necesario.
 Soporte legacy La versión 3 de Maven ya no soporta repositorios de legado (<layout>legacy</layout>). Esta característica se había mantenido únicamente para repositorios que tuvieran compatibilidad con la versión 1.x pero no con la versión 2.x.
 Cache de artefactos La versión 3 de Maven recuerda cuando no se ha podido resolver un artefacto. El mantenimiento de esta caché de artefactos no resueltos se realiza según la política de actualizaciones del repositorio en el que se encuentre el artefacto y se eliminará cuando se sustituya la URL del repositorio a utilizar. En algunas situaciones, como cuando se está accediendo a repositorios a través de una conexión con proxy, puede ser necesario desactivar este caché mediante el parámetro -U de la llamada a Maven por línea de comandos.
 Almacenamiento de metadatos La estructura de ficheros empleada por Maven2 y Maven3 para almacenar los metadatos en el repositorio es distinta. Esto debe tenerse en cuenta para proyectos que empleen simultáneamente ambas versiones de Maven, ya que la comprobación de versiones “snapshot” se realizará de forma independiente para cada versión.
Etiqueta  uniqueVersion La etiqueta “<uniqueVersion>false</uniqueVersion>” no tiene efecto en Maven3. Los artefactos de tipo “snapshot” siempre se desplegarán empleando una versión de etiqueta temporal.
 Artefactos de tipo snapshot Maven3 permite desplegar en el repositorio distintos artefactos de tipo “snapshot” con distintos clasificadores a partir de distintos builds o códigos, permitiendo resolverlos de forma correcta. Para ello, el clasificador de cada artefacto debe estar incluido en los metadatos del artefacto mantenidos en el repositorio. Esto puede dar problemas si se está empleando el mismo repositorio para proyectos que empleen Maven2, ya que esta versión desplegará la última versión disponible de dichos artefactos y eliminará las etiquetas de los clasificadores, por lo que dichos artefactos pueden ser posteriormente imposibles de acceder por Maven3.
Versión de plugin de tipo release Maven2 despliega siempre la última versión disponible de un plugin cuando no se especifica una versión en el POM, independientemente de si esta versión es de tipo “release” o “snapshot”. Maven3 desplegará siempre la última versión disponible del tipo “release”, por motivos de estabilidad. Cuando se despliegue un plugin de esta forma, Maven3 generará un mensaje de advertencia. Se prevee que esta funcionalidad desaparezca en próximas versiones, haciendo obligatoria la declaración de la versión de todos los plugins declarados en el POM. Esta característica debería incluirse en el nuevo recurso a crear relativo al uso de Maven3.
 Marcadores RELEASE y LATEST Maven3 ya no contempla los marcadores especiales de versión “RELEASE” ni “LATEST”, tanto en los metadatos del repositorio como en la declaración de versión del POM. Es necesario sustituir estos marcadores por valores concretos de versión.
 Etiqueta pluginRepositories En Maven3, las extensiones, plugins y dependencias de plugins se declararán únicamente en el interior de la etiqueta <pluginRepositories> y no también desde la etiqueta <repositories> como en la versión 2.
 Repositorio local El repositorio local en Maven3 ha sido actualizado para mantener un registro del repositorio remoto del que ha sido descargado cada artefacto. Esto se emplea para asegurar que los proyectos se construyan solo a partir de los artefactos incluidos en el repositorio local. Los proyectos que no incluyan todos los artefactos necesarios para su construcción en el POM pueden fallar.  Se ha mejorado la resolución de dependencias en Maven3 para resolver problemas originados por conflictos en dependencias recursivas. Los conflictos de dependencias aparecerán como errores en la construcción de proyectos, siendo posible examinar el árbol de dependencias de los artefactos ejecutando una construcción en modo “debug”.
 Comparación de versionesLa lógica de comparación de versiones de Maven3 ha sido modificada. Ahora se asume que una versión “beta” es mayor que una versión “alfa”, que una versión “snapshot” es mayor que una versión “beta” y que una versión “release” es mayor que una versión “snapshot” (alfa < beta < snapshot < release). Esto puede dar conflictos con la ordenación de versiones empleada en Maven2.
Maven3 ha eliminado el soporte del parámetro de línea de comandos “- - reactor”, empleada para la construcción de sub-proyectos. En próximas versiones se incluirá una funcionalidad similar.
 Validación del fichero POM La validación de ficheros POM en Maven3 es más estricta que la de Maven2, considerándose como errores las declaraciones duplicadas de dependencias o declaraciones de alcance erróneas en plugins.
 Resolución de POMs padre Por motivos de consistencia, la resolución de POMs padre en Maven3 no se realizará si la ruta del POM hijo (<relativePath>) no es correcta, sea esta declarada o por defecto.
 Extensiones de construcción En Maven3, las extensiones de construcción afectan únicamente al módulo en el que se declaró la extensión, en vez de tener efecto global como en Maven2. Debido a esto, es posible que se produzca un error de construcción de un módulo que requiere alguna extensión que no ha sido declarada, aunque haya sido declarada en otro módulo.
 Protocolos de transporte A diferencia de lo que ocurría con Maven2, Maven3 solo contiene soporte por defecto de los protocolos de transporte http, https y file. Para emplear otros protocolos de transporte, la extensión correspondiente debe ser declarada explícitamente en el POM.
 Reporte de errores El reporte de errores de Maven3 es más detallado que en Maven2, pero sólo para errores que deriven de las clases MojoFailureException y MojoExecutionException. Para otro tipo de errores, es necesario que la programación del plugin sea más precisa en el reporte de los posibles errores que puedan producirse.

Problemas de compatibilidad entre Maven3 y otras herramientas incluidas en la propuesta de Plataforma Tecnológica de MADEJA

HerramientaCompatibilidad con Maven3Recomendación
HudsonExisten problemas de compatibilidad reportados entre versiones anteriores de Hudson y Maven3, que impedían que se realizara un build de forma correcta y obligaban a realizar el build mediante la opción “freestyle”. Estos problemas de compatibilidad han sido resueltos a partir de la versión 1.392.Migrar la versión de Hudson a partir de la 1.392.
ArtifactoryDebido a que Maven3 no permite artefactos “snapshot” no únicos, pueden existir problemas con repositorios Artifactory que publiquen artefactos con estas características.Modificar la configuración de metadatos de Artifactory para que no se publiquen “snapshots” no únicos, para ello modificar el valor de <maxUniqueSnapshots> para que valga 1 en el fichero artifactory.config.xml.
JenkinsExistían problemas de compatibilidad entre Maven3 y Jenkins que fueron resueltos a partir de la versión 1.447.Migrar a una versión de Jenkins a partir de la 1.447.
SonarA partir de la versión de Sonar 2.2, se soporta el empleo de Sonar mediante Maven3.Migrar a una versión de Sonar a partir de la 2.2.
ArquetiposLos arquetipos actualmente incluidos en MADEJA solo son válidos para Maven2, ya que hacen uso de ficheros profiles.xml para el almacenamiento de los perfiles.Sería necesario crear nuevas versiones de estos arquetipos para su empleo en Maven3, unificando el contenido de profiles.xml con el de pom.xml y corrigiendo otros problemas surgidos por la comprobación más estricta de errores de Maven3.
Plugin XPathSe han compilado y construido con éxito tanto el plugin de XPath como el plugin de Sonar mediante Maven3, en base a los arquetipos publicados en MADEJA. 
RichfacesNo se han encontrado problemas de compatibilidad entre Richfaces y Maven3. 
Maven EnforcerEl plugin Maven Enforcer puede ser empleado sin problemas en Maven3. 
Repositorio de Artefactos MADEJAConfigurando el repositorio de artefactos de MADEJA como mirror tal y como se indica en la pauta “PAUT-0083 Uso del Repositorio de Artefactos de MADEJA” no se ha producido ningún problema al compilar y construir con Maven3. 
CheckstyleNo se han encontrado problemas durante el empleo de Checkstyle con Maven3. 
PMDNo se han encontrado problemas durante el empleo de PMD con Maven3. 
JMeterNo se han encontrado problemas durante el empleo de JMeter con Maven3. 
Maven Licence PluginEl plugin “Maven Licence Plugin” soporta la versión Maven3 a partir de su versión 1.0-alpha-5.Emplear una versión del plugin a partir de la 1.0-alpha-5.
Librería JAVA para la integración de aplicacionesNo se han encontrado problemas durante el empleo de la librería de integración mag4j en Maven3. 
JiBXNo se han encontrado problemas durante el empleo de JiBX en Maven3. 
JSFUnitExisten problemas de compatibilidad reportados entre JSFUnit y Maven3. Concretamente, los test del plugin Ant no funcionan de forma correcta en Maven3. Se espera que estos problemas sean corregidos en la próxima versión 2.0.0.FinalNo emplear Maven3 para proyectos que hagan uso de JSFUnit.
TobagoExisten problemas de compatibilidad entre el plugin Tobago Maven APT y Maven3. Para solucionar este problema, existe un plugin alternativo (Mojo Maven APT Plugin).Emplear el plugin de Mojo para los proyectos que hagan uso de Maven3.

Contenidos relacionados