【问题标题】:Spring 3.2.x with Java 8带有 Java 8 的 Spring 3.2.x
【发布时间】:2015-05-06 09:02:25
【问题描述】:

我们目前使用的是 spring 3.2.9。我们正在考虑将其升级到较新的版本。当我检查文档时,它说

随着 4.0 M1,我们发布了 Spring Framework 3.2.3,包含 修复了最近报告的问题,但也附带 OpenJDK 8 运行时 支持。 Spring Framework 3.2.x 将支持在 JDK 8 运行时上部署 适用于针对 JDK 7(使用 -target 1.7)或更早版本编译的应用程序。

这是否意味着我无法在 Java 8 上编译?
如果我想用 Java 8 编译,我应该使用 spring 版本 4.0.x 吗?

【问题讨论】:

    标签: java spring java-8 version


    【解决方案1】:

    从 3.2.9+ 开始,在 3.2.x 行中尽最大努力支持 JDK8。

    请参阅 SPR-11656 以了解 3.2.9 中的初始支持和 SPR-11979 了解 3.2.10 中的字节码支持改进。请注意 cmets 中解释的支持限制。

    如需全面支持 JDK8,请升级至 Spring 4.x - 有dedicated wiki page explaining the upgrade path,Spring 团队努力让升级体验变得非常简单。

    【讨论】:

      【解决方案2】:

      根据我的观察,您实际上可以将 spring 3 与在 Java 8 中编译的代码一起使用,只要您不在扫描的路径中使用新的 java8 语法(如 lambdas)。

      因此,您可以使用新的 API(流...),但不能使用新的语法(lambda...)。

      当我尝试时,我最终遇到了启动错误,例如 org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read Candidate component class

      【讨论】:

        【解决方案3】:

        早于 4.0M1 的 Spring Framework 版本不适用于为 Java 8 编译的类。

        Spring 尝试通过读取类文件来代理这些类,如果它们“太新”,这将不起作用。如果你的 @Service 类是用 Java 8 作为目标编译的,Spring 将无法在启动时加载这些类。

        这意味着如果您想以 Java 8 为目标(并使用 lambdas、默认实现等),则必须升级到 Spring 4.x.x。

        几个月前我自己在一个使用 Spring 3.x.x 的项目中遇到了这个问题。

        【讨论】:

        • 我赞成这个答案。但我仍在试图弄清楚是否可以使用 java 8 编译旧的 spring 应用程序。例如预订面孔网络应用程序
        • 您好,不是这样,Spring 3.2.X 兼容 java 8,只是您需要最低版本 3.2.9。我刚刚更新了一个使用 spring 3.2.3 并且不能在 Java 8 上运行到 spring 3.2.12 的应用程序,并且没有其他更改,该应用程序现在可以在 java 8 上运行。
        猜你喜欢
        • 1970-01-01
        • 2016-11-18
        • 2014-05-23
        • 2015-07-30
        • 2016-11-07
        • 2013-09-02
        • 1970-01-01
        • 2017-03-16
        • 1970-01-01
        相关资源
        最近更新 更多