【问题标题】:Does Spring Version 4.3.20 work with Java 11? [duplicate]Spring 版本 4.3.20 是否适用于 Java 11? [复制]
【发布时间】:2019-02-18 08:31:03
【问题描述】:

当谈到 spring 4.3.20 支持的 java 版本时,我感到很困惑。将 Spring 4.3.20 项目更新到 Java 11 没有任何问题。我所有的测试都运行良好,webapp 启动并且 Spring 的所有需要​​字节码魔术的功能,如@Cacheable 工作。这怎么可能?据我了解,我应该更新到 Spring 5+。我检查了我的 maven 设置中的语言级别和生成的.class-files 的字节码版本,他们确实使用了major version: 55

我错过了什么?

我使用 Java 11 构建并使用 Java 11 启动本地 tomcat。我仔细检查了所有设置并使用 visualvm 验证 tomcat 确实可以使用 Java 11 运行。

这是javap的输出:

【问题讨论】:

    标签: java spring java-11 spring-web


    【解决方案1】:

    Spring 5.1 支持 Java 11,早期版本不支持。见Spring Framework Versions

    JDK 版本范围

    • Spring 框架 5.1.x:JDK 8-12
    • Spring 框架 5.0.x:JDK 8-10
    • Spring 框架 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 兼容性仅在您使用的更高版本中得到保证,我不会使用 Java 11 那样庞大的 Spring 库集。如果您想在 Java 11 中使用 Spring,请升级到 Spring 5.1。

    【讨论】:

      【解决方案2】:

      记住:测试只能证明存在错误,不能证明它们不存在。

      根据他们发布的一些 cmets blog,4.3.20 实际上与 Java 11“不兼容”。

      另一方面:spring 是一个巨大的框架。因此,简单的答案可能是:只要您不遇到无法工作的区域,它就可以工作。

      请记住:任何版本 N 的 JDK 都可以为具有旧版本 N-x 的字节码运行字节码。

      【讨论】:

      • 但是spring广泛使用cglib(当类不实现接口时,对我来说就是这种情况)来实现@Cacheable@Transactional等。由于 cglib 无法理解该 spring 版本中的 java 11 字节码,因此应用程序根本不应该启动。关于您对测试的评论:是的,但正如我所说,包括启动、数据库连接、缓存等在内的一切都可以正常工作,没有任何问题。
      • @naze 你检查过spring本身的字节码版本了吗?该字节码很可能是 Java 11 之前的版本!
      • 正如我在原始答案中已经说过的那样:是的,我做到了。我附上了一张javap 输出的图片。
      • @naze 这不是重点。当然,JDK 11 包含 JDK 11 类文件。问题是 spring 4.3.20 是否以 JDK 11 字节码的形式出现(可能不是)。
      【解决方案3】:

      似乎兼容性是社区中的一个常见问题,所以Spring文档中有一个答案(有点):https://spring.io/blog/2015/04/03/how-spring-achieves-compatibility-with-java-6-7-and-8

      基本上,Spring 代码库本身甚至不使用 Java 7 的特性,因此它与 6 兼容。

      关于字节码转换,我相信 JVM 保持了一定程度的兼容性,因为它的规范允许框架的一些功能发挥作用。

      但是,如果官方文档说它不兼容,那么你应该相信这个意外,因为其他功能可能无法工作或被补丁和次要版本破坏。

      附:您还提到了cglib,它可用于操作字节码,但实际上并不是必需的。它生成的 Java 代码甚至字节码在新的 JVM 版本中总是向后兼容。

      【讨论】:

      • 关于 cglib 只生成向后兼容的字节码的好点!
      • 您引用的是 2015 年的帖子,从那时起情况发生了变化。 Spring 5.1 只是 Java 8-11,它们正在使用 Java 8 的特定功能。
      猜你喜欢
      • 2016-07-02
      • 2014-07-11
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      • 1970-01-01
      • 2014-01-15
      相关资源
      最近更新 更多