Java 8 Spring 兼容性

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/32278878/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 00:45:59  来源:igfitidea点击:

Java 8 Spring compatibility

springjava-8

提问by cpkarthic

I am currently migrating my application from Java 7 to Java 8 and currently I am running the Spring 3.1.6 jar. Would this be compatible with Java 8 or I need to upgrade the Spring jar ?

我目前正在将我的应用程序从 Java 7 迁移到 Java 8,目前我正在运行 Spring 3.1.6 jar。这会与 Java 8 兼容还是我需要升级 Spring jar ?

I understand that the Spring 4x version has natural support for Java 8, but this is time critical and I am seeking to change as little jars as I can.

我知道 Spring 4x 版本自然支持 Java 8,但这是时间紧迫的,我正在寻求尽可能少地更改 jars。

回答by Channa Jayamuni

Basically Spring 3.xversions supports up to Java-7only. If you want to migrate to Java-8you should use Spring 4.xversion.

基本上Spring 3.x版本最多Java-7只支持。如果你想迁移到Java-8你应该使用Spring 4.x版本。

However some spring release notes says that the Spring Framework 3.2.xwill support deployment on JDK 8runtimes for applications compiled against JDK 7(with -target 1.7) or earlier. Note that it won't support JDK 8's bytecode format (-target 1.8, as needed for lambdas); please upgrade to Spring Framework 4.0for that purpose.

然而,一些 spring 发行说明表示,Spring Framework 3.2.x将支持在JDK 8运行时部署针对JDK 7(使用 -target 1.7)或更早版本编译的应用程序。请注意,它不支持JDK 8的字节码格式(-target 1.8,根据 lambdas 的需要);请Spring Framework 4.0为此目的升级到。

Follow thislink to the source article.

按照链接转到源文章。

回答by Ryba

No it is not compatible. I've run into the same issue and while many will say that Java 8 is completely backwards compatible with older versions of java, this turns out not to be true.

不,它不兼容。我遇到了同样的问题,虽然很多人会说 Java 8 与旧版本的 Java 完全向后兼容,但事实证明并非如此。

This has a very good explaination of the exact problem I ran into java 7 targeted code with java 8.

这很好地解释了我在 java 8 中遇到 java 7 目标代码的确切问题。

https://gist.github.com/AlainODea/1375759b8720a3f9f094

https://gist.github.com/AlainODea/1375759b8720a3f9f094

Because the API of ConcurrentHashMap has changed between the 2 java releases, spring breaks on startup and you end up with

因为 ConcurrentHashMap 的 API 在 2 个 java 版本之间发生了变化,启动时突然中断,你最终

SEVERE: Context initialization failed
java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView;
    at org.apache.catalina.core.ApplicationContext.getInitParameterNames(ApplicationContext.java:368)
    at org.apache.catalina.core.ApplicationContextFacade.getInitParameterNames(ApplicationContextFacade.java:367)
    at org.springframework.web.context.support.WebApplicationContextUtils.registerEnvironmentBeans(WebApplicationContextUtils.java:201)
    at org.springframework.web.context.support.AbstractRefreshableWebApplicationContext.postProcessBeanFactory(AbstractRefreshableWebApplicationContext.java:163)

I had no choice to but upgrade to Spring 4.x (not sure if 3.2 or above would have worked as I jumped straight to 4.x)

我别无选择,只能升级到 Spring 4.x(不确定 3.2 或更高版本是否可行,因为我直接跳到了 4.x)

回答by Gaetan

If some libraries (or the JRE itself) are JDK 8 and the component-scan feature of spring is enabled (and scans these libs/jdk classes), then the minimal spring version is 3.2.10-RELEASE.

如果某些库(或 JRE 本身)是 JDK 8 并且启用了 spring 的组件扫描功能(并扫描这些库/jdk 类),那么最小的 spring 版本是 3.2.10-RELEASE。

The reason is the upgrade of ASM (the library that spring uses to scan compiled classes and detect annotations, implemented interfaces, etc.) in spring.

原因是spring升级了ASM(spring用来扫描编译类和检测注解、实现接口等的库)。

See SPR-11979and SPR-11656for details.

SPR-11979SPR-11656了解详情。

回答by kag0

Java 8 and the jvm 8 is completely backwards compatible with all older versions of java. Java takes painstaking steps to ensure new releases do not break old code. Any code you wrote for java 7 can be compiled with java 8, and any code you compiled for java 7 can run on jvm 8.

Java 8 和 jvm 8 完全向后兼容所有旧版本的 Java。Java 采取艰苦的步骤来确保新版本不会破坏旧代码。您为 java 7 编写的任何代码都可以用 java 8 编译,您为 java 7 编译的任何代码都可以在 jvm 8 上运行。