当涉及到支持的Spring4.3.20的java版本时,我感到困惑。将Spring4.3.20项目更新到Java 11没有任何问题。我所有的测试都很好,webapp启动了,所有需要字节码的Spring特性--比如@Cacheable --都能工作。这怎么可能?据我所知,我应该更新到Spring5+。我检查了生成的.class-files的maven设置和字节码版本中的语言级别,它们确实使用major version: 55。
我遗漏了什么?
我用Java 11构建,用Java 11启动本地tomcat,我检查了所有设置,并使用visualvm验证tomcat确实与Java 11一起运行。
这是javap的输出

发布于 2019-02-18 09:50:53
Spring5.1支持Java 11,早期版本不支持。请参阅Spring框架版本
JDK版本范围
5.1版的新内容是什么? 一般核心修订
4.3.x在Java 11上工作可能只是意味着到目前为止你还很幸运(不使用与Java 11不兼容的东西)。而且,Java在向后兼容性方面很好,即使是自Java 9以来移除的东西或有意向后兼容的更改,Spring中真正损坏的东西也完全有可能是非常小和模糊的。
尽管如此,如果作者说Java兼容性只在比您使用的更晚的版本中得到保证,我就不会使用与Java 11一样庞大的库集。如果您想在Java 11中使用Spring,请升级到Spring5.1。
发布于 2019-02-18 08:37:13
记住:测试只能证明错误的存在性(),而不是它们的缺失。
根据他们发布的博客的一些评论,4.3.20实际上与Java 11“不兼容”。
另一方面,spring是一个巨大的框架。因此,简单的答案可能是:只要你不遇到不起作用的区域,它就能工作。
请记住:任何版本N的JDK都可以为具有旧版本N的字节码运行字节码。
发布于 2019-02-18 08:43:27
在社区中,兼容性似乎是一个常见的问题,所以在Spring文档中有一个答案(有点):https://spring.io/blog/2015/04/03/how-spring-achieves-compatibility-with-java-6-7-and-8
基本上,Spring代码库本身甚至不使用Java 7的特性,因此它与6兼容。
至于字节码转换,我认为JVM保持了一定程度的兼容性,因为它的规范允许框架特性的某些工作。
但是,如果官方文档说它是不兼容的,那么您应该依赖这个意外,因为其他特性可能无法工作或与补丁和次要版本中断。
P.S.您还提到了可以用来操作字节码的cglib,但它实际上并不是必需的。它确实生成Java代码,甚至在新JVM版本中总是向后兼容的字节码。
https://stackoverflow.com/questions/54743146
复制相似问题