Spring 4.3.20是否可以与Java 11一起使用?

时间:2019-02-18 08:31:03

标签: java spring java-11 spring-web

对于支持的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的输出:

enter image description here

3 个答案:

答案 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版本中始终向后兼容的字节码。