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

当我在Spring 3.2.2旁边添加Spring-security 3.1.4时,我在下面有这个丑陋的例外。 我搜索了它,只得到了关于同样错误的链接: http : //forum.springsource.org/showthread.php? 133706-Spring-3-2-0-RELEASE-breaks-with- JBoss-7指向springJIRA解释说spring-asm现在处于spring-core状态。 https://jira.springsource.org/browse/SPR-10134

我想我需要以某种方式从spring-security中排除spring-asm。

这是我的例外:

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) 

然后我发现了这个: http : //www.mkyong.com/mongodb/spring-asm-dependency-issue-in-spring-data/在spring-data中有类似的问题。 pom.xml中的排除也同样适用:

   org.springframework.security spring-security-web 3.1.4.RELEASE   org.springframework spring-asm    

我为那些得到同样错误的人分享了解决方案!

问题是Spring Security 3.1.4依赖于Spring 3.0.7,所以它最终会在spring-aop 3.0.7中拉动,从而引入spring-asm 3.0.7。 你想要做的是使用maven的dependencyManagement部分强制任何Spring包含使用最新版本,如下所示:

    org.springframework spring-aop ${spring.version}   org.springframework spring-core ${spring.version}      

您可以通过运行mvn dependency:tree来validation是否已经清除了所有依赖项。

例如,在dependencyManagement之前,我的mvn dependency:tree输出是:

 [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 

特别注意前三行,其中spring-aop spring-asm 。 添加足够的dependencyManagement声明后,我们现在得到:

 [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) 

注意spring-asm是如何不再包含的,因为新的spring-aop不需要它。

这是一种比上面的答案中的排除项更清晰的管理Spring版本的方法,因为它将适用于您可能添加引用Spring的任何其他第三方依赖项。

在pom.xml中添加以下依赖项:

  org.springframework spring-core 3.2.4.RELEASE   org.springframework spring-asm 3.1.4.RELEASE