2010-02-12 14 views
26

Estoy usando Spring 3 y Maven. Definí todos los módulos de primavera en mi pom.xml.¿Por qué Spring 3 necesita una declaración explícita de dependencia cglib cuando se usa Maven?

Cuando uso <aop:scoped-proxy />, aparece un mensaje de error que indica que falta CGLIB.

Bueno ... añadir CGLIB como una dependencia en mi pom y todo funciona ...

estoy un poco confundido ... Maven es un gestor de dependencias ... ¿Por qué no descarga CGLIB cuando uso el módulo Spring-Aop?

No es el único caso ... ¿Por qué algunos proyectos necesitan una declaración explícita de dependencia en lugar de utilizar el mecanismo de dependencia transitiva Maven?

+0

@Jerome C. Bueno, no puedes esperar que maven encuentre todo por sí mismo, no es algo mágico, porque a veces algunas dependencias no existen en el repositorio, a veces tienes que descargarlas manualmente.Sin embargo, debería haber descargado esa dependencia por su cuenta, pero no fue así, y Maven está lejos de ser perfecto, pero es la más cercana de todas las otras herramientas de compilación (aunque maven no es solo una herramienta de compilación). – ant

+0

@Pascal Thivent hmm Creo que omitiste mi comentario o lo escribí de manera incomprensible porque: 1. Maven encontrará una dependencia si está disponible en un repositorio y si el pom contiene la información requerida - ".. , porque a veces algunas dependencias no existen en el repositorio " 2. Pero en el caso de spring y cglib, cglib es una dependencia opcional por lo que no lo obtendrá a menos que lo especifique explícitamente -" Bueno, no puede esperar maven para encontrar todo por sí mismo, no es una cosa mágica "-> como dijiste porque es una dependencia opcional, no la encontrará. Donde me estaba equivocando – ant

+0

@Pascal Thivent De todas formas recién comencé con Maven hace un par de semanas su muy buena herramienta/plataforma, pero todos saben que eres un usuario experimentado y deberían usar el sentido común y concluir que tus publicaciones/comentarios es probable que sean más correctos que los míos. Personalmente me gusta leer sus publicaciones/comentarios sobre Maven porque siempre son útiles, así que no lo malinterprete. Cheers – ant

Respuesta

50

Es porque cglib está marcado como optional dependency.

Esencialmente no necesita cglib para cada uso de la biblioteca de Spring-Aop, por lo que maven no lo descarga automáticamente. Necesitas especificarlo manualmente, desafortunadamente.

+0

+1 para su respuesta – ant

+0

exacta, acabo de descubrir la característica opcional;) ​​ Pero cuando una dependencia se declara como opcional, ¿es solo para doc? o hay una forma de activarlo en la declaración del módulo? –

+1

@ Jerome, como yo lo entiendo, la dependencia se descarga cuando compilan Spring-aop, pero no cuando se construye un proyecto que depende de Spring-Aop. ¡Si eso tiene sentido! –

5

Supongo que cglib is not enabled in Spring by default. Y, por lo tanto, no está incluido en el pom a menos que lo habilite explícitamente.

Por lo que sé, Maven no puede acceder a los archivos de configuración de Spring y determinar si necesita bibliotecas adicionales habilitadas opcionalmente. Aunque parece que sería un plugin de Spring-Maven genial si fuera posible modificar el pom sobre la marcha mediante un plugin. No estoy seguro de si lo es, pero sería genial.

17

Estoy un poco confundido ... Maven es un administrador de dependencias ... ¿Por qué no descarga el cglib cuando uso el módulo spring-aop?

Debido a que no todo el mundo usa CGLIB (un proxy AOP en la primavera puede ser un proxy dinámico JDK o un proxy CGLIB) por lo CGLIB se marca como una dependencia optional en el pom de spring-aop y hay que añadirlo de forma explícita si quiero usarlo Esto es exactamente para lo que son las dependencias opcionales.

Otro ejemplo similar es Hibernate que le permite elegir entre cglib y javassist en hibernate-core de la misma manera. Hibernate también le permite choose entre varias agrupaciones de conexiones (si decide usar una de ellas) o proveedores de caché (solo ehcache, el valor predeterminado, no está declarado como opcional).

2

Buenas noticias - este es un problema del pasado:

A partir de la primavera 3,2, ya no es necesario añadir CGLIB a la ruta de clases proyecto , como clases CGLIB están empaquetados de nuevo bajo org .springframework e incluido directamente en el JAR de resorte-núcleo. Esto significa que el soporte de proxy basado en CGLIB solo funciona de la misma manera que siempre lo tienen los proxies dinámicos JDK .

Más información here.

+0

tan genial, gracias a que lo señaló;) –

Cuestiones relacionadas