对于支持的Spring 4.3.20的Java版本,我感到困惑。将Spring 4.3.20项目更新为Java 11可以正常进行。我所有的测试工作正常,webapp启动,并且Spring需要像@Cacheable
这样需要字节码魔术的所有功能都可以正常工作。这怎么可能?据我了解,我应该更新到Spring 5+。我在自己的Maven设置和生成的.class
文件的字节码版本中检查了语言级别,它们确实使用了major version: 55
。
我想念什么?
我使用Java 11构建并使用Java 11启动本地tomcat。我仔细检查了所有设置,并使用visualvm
来验证tomcat确实可以在Java 11上运行。
此处显示javap
的输出:
答案 0 :(得分:2)
请记住:测试只能证明错误的存在,而不能证明缺陷的存在。
根据对其发布blog的一些评论,4.3.20确实与Java 11“不兼容”。
另一方面:spring是一个巨大框架。因此,简单的答案可能是:只要您不遇到无法解决的问题,它就会起作用。
请记住:版本N的任何JDK都可以为具有较早版本N-x的字节代码运行字节代码。
答案 1 :(得分:2)
Spring 5.1不支持Java 11,更早的版本不支持。参见Spring Framework Versions:
JDK版本范围
- Spring Framework 5.1.x:JDK 8-12
- Spring Framework 5.0.x:JDK 8-10
- Spring Framework 4.3.x:JDK 6-8
和What's New in Spring Framework 5.x:
5.1版的新增功能
常规核心修订
- 基础设施:
- 在类路径和模块路径上对JDK 11的免费警告。
4.3.x可以在Java 11上运行可能只是意味着您到目前为止很幸运(不使用与Java 11不兼容的功能)。而且,Java自向后兼容方面还是相当不错的,即使自从Java 9以来已删除了某些内容或有意向后不兼容的更改,Spring的实际损坏对象也可能非常小且晦涩难懂。
也就是说,如果作者说只有在比您使用的更高的版本中才能保证Java兼容性,否则我不会使用像Spring with Java 11那样庞大的一组库。如果要在Java 11中使用Spring,请升级到Spring 5.1。
答案 2 :(得分:1)
似乎兼容性是社区中的常见问题,因此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版本中始终向后兼容的字节码。