Maven classpath ordena problemas

¿Alguien sabe de una manera de establecer un orden de ruta de clases específico en Maven2, en lugar del orden aleatorio que parece experimentar en este momento?

Hay una serie de razones legítimas para querer hacer esto:

  • Un proveedor ha suministrado un jar de parche, que contiene clases de anulación para un jar lanzado previamente y, por lo tanto, el parche de parche debe aparecer primero en el orden de clasificación de clase.
  • Dos jar encontrados en el classpath descubierto atravesando dependencias pom contienen la misma clase en el mismo paquete con diferentes firmas. Por ejemplo:

jboss jbossall-client 4.2.0.GA

org.hibernate hibernate 3.1

ambos contienen: org.hibernate.util.ReflectHelper.class, pero a la versión de jbossall-client le falta el método getFastClass.

De googlear veo que este es quizás un punto de discordia entre los entusiastas de maven y las personas que enfrentan este tema en particular, pero seguramente hay razones legítimas para ordenar classpath.

Cualquier consejo de cualquier persona que haya resuelto este dilema en particular sería muy apreciado.

Gracias

A partir de la versión 2.0.9, maven usa el orden pom para classpath, por lo que puedes manipularlo ahora. Sobre todo suprimimos las dependencias transitivas a bibliotecas externas que también incluimos directamente.

De las notas de la versión de maven 2.0.9:

MNG-1412 / MNG-3111 introdujo el ordenamiento determinista de las dependencias en el classpath. En el pasado, se usaba el orden de conjuntos naturales y esto conducía a resultados extraños. El orden ahora se conserva de su pom, con las dependencias agregadas por heredadas agregadas al final. En comstackciones que tenían dependencias conflictivas o duplicadas, esto puede introducir un cambio en el resultado. En resumen, si tiene problemas extraños con 2.0.9, eche un vistazo a las dependencias para ver si tiene conflictos en alguna parte.

Maven 2.0.9 agrega ordenamiento correcto, por lo que debe tener esa versión o más para que funcione lo siguiente.

En segundo lugar, necesitas el complemento actualizado. Los chicos de Maven están trabajando en una solución, está en su jira arreglarlo, pero esto es algo que necesitaba con urgencia. Mientras tanto, lo arreglé yo mismo y puedes extraer el código fuente del complemento modificado de github.

Editar: consulte http://jira.codehaus.org/browse/MECLIPSE-388

Hay dos formas de instalarlo, ya sea extraer mi código modificado e instalarlo o descargar el contenedor preconstruido y simplemente agregarlo.

Construyendo el plugin

Ejecute la maven install desde el directorio de complementos que ha desprotegido y luego agregue lo siguiente en la sección de complementos de sus proyectos pom:

    org.apache.maven.plugins maven-eclipse-plugin 2.8-cpfix    

Descargue el tarro

Alternativamente, si no desea descargar y comstackrse usted mismo, puede obtener el archivo jar e instalarlo usted mismo.

Una vez que haya ejecutado el archivo

 mvn install:install-file -Dfile= -DgroupId=org.apache.maven.plugins \ -DartifactId=maven-eclipse-plugin -Dversion=2.8-cpfix -Dpackaging=jar 

Independientemente de cómo lo instaló ahora cuando ejecuta mvn eclipse:eclipse , recogerá el código modificado y ordenará las dependencias en función del orden que haya definido en su archivo pom, sin orden alfabético. También colocará el contenedor JRE en la parte superior de las dependencias.

Espero que la versión real de este código salga pronto, pero mientras tanto, esta solución me ha funcionado en mi proyecto y espero que también pueda ayudar a otros.