【问题标题】:spring-core 3.2.9 + java 8弹簧核心 3.2.9 + java 8
【发布时间】:2026-02-13 13:35:02
【问题描述】:

我们已将使用 spring 3.2.9 的项目升级到 java 8。一旦我们开始使用 java 8 功能,spring 将不再启动(参见下面的堆栈跟踪)。

我尝试排除 asm 的旧用法并包含以下依赖项:

<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm</artifactId>
    <version>5.0.3</version>
</dependency>
<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm-util</artifactId>
    <version>5.0.3</version>
</dependency>
<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm-commons</artifactId>
    <version>5.0.3</version>
</dependency>

但这并不能解决问题。有人知道如何解决这个问题吗?

很遗憾,我们无法升级到 spring 4,因为我们使用了一些依赖项,这会使升级非常耗时。

Offending resource: class path resource [xxxx/context-test.xml]; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [xxxxx.class]; nested exception is java.lang.IllegalArgumentException: INVOKESPECIAL/STATIC on interfaces require ASM 5
    at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68)
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85)
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:76)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:256)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseDefaultElement(DefaultBeanDefinitionDocumentReader.java:207)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:192)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:139)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:108)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:537)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:451)
    at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContextInternal(CacheAwareContextLoaderDelegate.java:64)
    at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:91)
    ... 23 more
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [xxxxxxxxxxxxx.class]; nested exception is java.lang.IllegalArgumentException: INVOKESPECIAL/STATIC on interfaces require ASM 5
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:290)
    at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:242)
    at org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:84)
    at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:73)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1438)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1428)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:195)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:139)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:108)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:250)
    ... 43 more
Caused by: java.lang.IllegalArgumentException: INVOKESPECIAL/STATIC on interfaces require ASM 5
    at org.springframework.asm.MethodVisitor.visitMethodInsn(Unknown Source)
    at org.springframework.asm.ClassReader.a(Unknown Source)
    at org.springframework.asm.ClassReader.b(Unknown Source)
    at org.springframework.asm.ClassReader.accept(Unknown Source)
    at org.springframework.asm.ClassReader.accept(Unknown Source)
    at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:64)
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
    at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:102)
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:266)
    ... 58 more

【问题讨论】:

标签: spring java-8


【解决方案1】:

只需尝试一次用 asm.5.0

版本更新 asm jar

【讨论】:

    【解决方案2】:

    您需要升级到 Spring 4.x 版本。

    Spring 3.2.x 将仅支持 针对 Java 7 编译的 Java 8 运行时。您不能使用“静态接口”,因为它是 Java 8 feature,并且不会针对 Java 7 进行编译。

    这是来自一些Spring 4 release notes 的相关sn-p,强调他们的:

    随着 4.0 M1,我们发布了 Spring Framework 3.2.3,包含 修复了最近报告的问题,但也与 OpenJDK 8 一起提供 运行时支持。 Spring Framework 3.2.x 将支持在 JDK 上部署 针对 JDK 7 编译的应用程序的 8 个运行时(使用 -target 1.7) 或更早。

    build.gradle file for spring-framework 中的 cmets,他们将 CGLib 重新打包为他们发布的一部分和embed ASM into the project

    // As of Spring 4.0.3, spring-core includes asm 5.0 and repackages cglib 3.1, inlining
    // both into the spring-core jar. cglib 3.1 itself depends on asm 4+, and is therefore
    // further transformed by the JarJar task to depend on org.springframework.asm; this
    // avoids including two different copies of asm unnecessarily.
    

    这是 4.0.3 发行说明中的​​另一个相关部分,展示了它们如何嵌入其中一些库以及 Spring 4.0.3 中支持的内容。

    我很高兴地宣布 Spring Framework 4.0.3 可用。 这是 Java 8 上次发布后框架的第一个版本 星期;它现在使用 OpenJDK 8 GA 构建并包含最新的 ASM 5.0.1(在 JDK 8 GA 级别也支持字节码,取代了我们之前使用的自定义 ASM 4.2 分支)。

    【讨论】:

    • 你能解释一下Spring 3.2.x will only support Java 8 runtimes compiled against Java 7吗?如果我有 JDK 1.8 和 JVM 版本 1.7,Spring 3.2.x 会兼容吗?
    • @VaibhavAgarwal 这意味着您的代码应该针对 Java 7 进行编译,但可以在 Java 8 JVM 上运行。 IE。 javac -source 1.7 -target 1.7 代码将使用 JVM 版本 1.8 运行。
    • 感谢您的解释。
    • 解决本文*.com/a/30204461/526438中给出的问题的步骤
    【解决方案3】:

    如果我没记错的话,Spring 3.2.x 不支持 Java 8,你需要升级到 Spring 4

    【讨论】:

    • 感谢链接 Andreas。关于 asm 的 3 个 Maven 依赖项,如果只声明第一个会发生什么?您正在使用什么 Java 8 更新?
    • 确保再次构建所有源代码,当然现在使用 Java 8。
    • +Andreas 您链接到的 SPR 说“自 3.2.9 起已修复”,所以大概就是在那时支持被认为是“完整的”