java SpringBoot 2.7.x如何支持多版本JDK

ngynwnxp  于 2023-08-02  发布在  Java
关注(0)|答案(3)|浏览(497)

众所周知,SpringBoot 2.7.x是使用JDK 1.8开发的,但是当我们引入Spring Boot 2.7.x依赖项时,我们可以在JDK 1.8,JDK 11和JDK 17上开发和运行。
我想弄清楚Sping Boot 是如何支持多版本JDK运行的,以及SpringBoot如何处理弃用的API或依赖关系(例如,如果我们使用JDK 11,rt.jar将不包含在classpath中,SpringBoot如何解决这个问题?SpringBoot是否避免使用已弃用的API,或者是否有一种方法可以根据JDK版本选择API。
在我看来,如果SpringBoot 2.7.x使用JDK 8+中删除的API,使用JDK 11或JDK 17的用户在启动应用程序时会遇到ClassNotFoundException。谁能告诉我SpingBoot如何解决这个问题?或者他们只是使用可以在JDK 1.8、JDK 11和JDK 17中使用的API。
提前感谢!

mepcadol

mepcadol1#

一般来说,Java是非常向后兼容的,API很少被删除。这意味着很少有API存在于Java 8中,但不存在于Java 17中。
或者他们只是使用可以在JDK 1.8、JDK 11和JDK 17中使用的API。
由于上面描述的向后兼容性,这就是Sping Boot 目前能够做到的,没有真实的的缺点。
这将在Java 21中有所改变。Sping Boot 3.2将增加对Java 21中新的虚拟线程(除了早期的预览版)的支持。Spring Framework的虚拟线程支持是使用multi-release jar实现的,其中Java 21-specific code与JDK的虚拟线程API进行交互。这将允许Spring Framework 6.1和Sping Boot 3.2支持虚拟线程,同时也继续支持早期的JDK。Sping Boot 将在Java 21上启用Spring Framework的虚拟线程支持,并使用其@ConditionalOnJava支持。

tpgth1q7

tpgth1q72#

SpringBoot 2.7.x如何支持多版本JDK?
它被称为Toolchains support。它允许您为Sping Boot 应用程序的不同版本指定不同的JDK版本,Apache Maven中的(几乎不是新的)功能允许您指定不同版本的JDK。要做到这一点,您只需在项目的根目录中添加toolchains.xml文件,该文件指定了您希望用于构建和运行应用程序的JDK版本。

<?xml version="1.0" encoding="UTF-8"?>
<toolchains>
  <toolchain>
    <type>jdk</type>
    <provides>
      <version>11</version>
    </provides>
    <configuration>
      <jdkHome>/pathtojdk11/jdk11</jdkHome>
      ...
    </configuration>
  </toolchain>
  <toolchain>
    <type>jdk</type>
    <provides>
      <version>17</version>
    </provides>
    <configuration>
      <jdkHome>/pathtojdk17/jdk17</jdkHome>
      ...
    </configuration>
  </toolchain>
</toolchains>

字符串
Gradle也有,参见here
有谁能告诉我SpingBoot如何解决ClassNotFoundException问题?
Spring没有,它与框架无关,实际上它发生在runtime期间,当JVM无法找到在代码中引用的类时(就像JDK版本更改一样),并且它们有许多策略来防止它,其中大多数都与构建工具及其插件有关。

wqsoz72f

wqsoz72f3#

Java以向后兼容而闻名,因此为旧版本编写的代码通常可以与新版本一起使用。Sping Boot 利用了这一点,允许开发人员使用各种Java版本(如Java 8,11和17)中可用的API。
随着Java 21中新功能的引入,如虚拟线程,Sping Boot 3.2计划使用多版本JAR支持它们。这意味着Sping Boot 可以为虚拟线程提供Java 21特定的代码,同时与早期的JDK版本保持兼容。这样,开发人员可以从新的Java功能中受益,而不会失去对旧Java版本的支持。

相关问题