with taglibs example dependencia context java spring maven spring-security

taglibs - Spring core 3.2.2+Spring security 3.1.4: java.lang.IncompatibleClassChangeError: org.springframework.asm.ClassVisitor



spring security web maven (3)

Luego encontré esto: http://www.mkyong.com/mongodb/spring-asm-dependency-issue-in-spring-data/ con un problema similar en spring-data. La exclusión en el pom.xml funciona igual de bien:

<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>3.1.4.RELEASE</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-asm</artifactId> </exclusion> </exclusions> </dependency>

¡Comparto la solución para otros que reciben el mismo error!

Cuando agregué Spring-security 3.1.4 junto a Spring 3.2.2, tengo esta fea excepción a continuación. Lo busqué en Google y obtuve solo este enlace sobre el mismo error: http://forum.springsource.org/showthread.php?133706-Spring-3-2-0-RELEASE-breaks-with-JBoss-7 que apunta a la primavera JIRA explica que el asma de primavera está ahora en el núcleo primaveral. https://jira.springsource.org/browse/SPR-10134

Pensé que tenía que excluir a Spring-asm de la seguridad de primavera de alguna manera.

Esta es la excepción que tuve:

java.lang.IncompatibleClassChangeError: class org.springframework.core.LocalVariableTableParameterNameDiscoverer$ParameterNameDiscoveringVisitor has interface org.springframework.asm.ClassVisitor as super class java.lang.ClassLoader.defineClass1(Native Method) java.lang.ClassLoader.defineClass(ClassLoader.java:791) java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2895) org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1173) org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1681) org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559) org.springframework.core.LocalVariableTableParameterNameDiscoverer.inspectClass(LocalVariableTableParameterNameDiscoverer.java:112) org.springframework.core.LocalVariableTableParameterNameDiscoverer.getParameterNames(LocalVariableTableParameterNameDiscoverer.java:85) org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:193) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1051) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:955) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:490) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461) org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626) org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651) org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:599) org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665) org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:518) org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:459) org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) javax.servlet.GenericServlet.init(GenericServlet.java:160) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1008) org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) java.lang.Thread.run(Thread.java:722)


El problema es que Spring Security 3.1.4 depende de Spring 3.0.7, por lo que termina tirando en spring-aop 3.0.7, que tira en spring-asm 3.0.7. Lo que quiere hacer es usar la sección de gestión de dependencyManagement de maven para forzar a las inclusiones de Spring a usar la última versión, de esta forma:

<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <!-- etc... -- enumerate all Spring sub-projects here that spring-security includes --> </dependency> </dependencies> </dependencyManagement>

Puede verificar que ha eliminado todas las dependencias ejecutando mvn dependency:tree .

Por ejemplo, antes de dependencyManagement , mi mvn dependency:tree salida de mvn dependency:tree era:

[INFO] +- org.springframework.security:spring-security-core:jar:3.1.4.RELEASE:compile [INFO] | +- org.springframework:spring-aop:jar:3.0.7.RELEASE:compile [INFO] | | /- org.springframework:spring-asm:jar:3.0.7.RELEASE:compile [INFO] | +- org.springframework:spring-core:jar:3.2.3.RELEASE:compile (version managed from 3.0.7.RELEASE) [INFO] | +- org.springframework:spring-context:jar:3.0.7.RELEASE:compile [INFO] | +- org.springframework:spring-beans:jar:3.0.7.RELEASE:compile [INFO] | /- org.springframework:spring-expression:jar:3.0.7.RELEASE:compile [INFO] +- org.springframework.security:spring-security-config:jar:3.1.4.RELEASE:compile [INFO] +- org.springframework.security:spring-security-web:jar:3.1.4.RELEASE:compile [INFO] | +- org.springframework:spring-jdbc:jar:3.0.7.RELEASE:compile [INFO] | +- org.springframework:spring-web:jar:3.0.7.RELEASE:compile [INFO] | /- org.springframework:spring-tx:jar:3.0.7.RELEASE:compile

Observe en particular las primeras tres líneas, donde spring-aop trae el spring-aop de spring-asm . Después de agregar suficientes declaraciones de dependencyManagement , ahora obtenemos:

[INFO] +- org.springframework.security:spring-security-core:jar:3.1.4.RELEASE:compile [INFO] | +- org.springframework:spring-aop:jar:3.2.3.RELEASE:compile (version managed from 3.0.7.RELEASE) [INFO] | +- org.springframework:spring-core:jar:3.2.3.RELEASE:compile (version managed from 3.0.7.RELEASE) [INFO] | +- org.springframework:spring-context:jar:3.2.3.RELEASE:compile (version managed from 3.0.7.RELEASE) [INFO] | +- org.springframework:spring-beans:jar:3.2.3.RELEASE:compile (version managed from 3.0.7.RELEASE) [INFO] | /- org.springframework:spring-expression:jar:3.2.3.RELEASE:compile (version managed from 3.0.7.RELEASE) [INFO] +- org.springframework.security:spring-security-config:jar:3.1.4.RELEASE:compile [INFO] +- org.springframework.security:spring-security-web:jar:3.1.4.RELEASE:compile [INFO] | +- org.springframework:spring-jdbc:jar:3.2.3.RELEASE:compile (version managed from 3.0.7.RELEASE) [INFO] | +- org.springframework:spring-web:jar:3.2.3.RELEASE:compile (version managed from 3.0.7.RELEASE) [INFO] | /- org.springframework:spring-tx:jar:3.2.3.RELEASE:compile (version managed from 3.0.7.RELEASE)

Observe cómo spring-asm ya no está incluido, ya que el nuevo spring-aop no lo requiere.

Esta es una forma más limpia de administrar las versiones de Spring que las exclusiones de la respuesta anterior, ya que se aplicará a cualquier otra dependencia de terceros que pueda agregar esa referencia a Spring.


Agregue las siguientes dependencias en pom.xml:

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-asm</artifactId> <version>3.1.4.RELEASE</version> </dependency>