Java 17:和遗留 25 年的漏洞 Say Goodbye

Posted 逆锋起笔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 17:和遗留 25 年的漏洞 Say Goodbye相关的知识,希望对你有一定的参考价值。


Student student = new Student("James "); System.out.println("Implementation " + student.implementation()); System.out.println("Student name James contains a blank: " + student.isBlankName());
清单2:为 Java 8 编写的 Student 类:
  • public class Student final private String firstName;public Student(String firstName) this.firstName = firstName; boolean isBlankName() return firstName == null || firstName.trim().isEmpty(); static String implementation() return "class";
    接下来,创建一个 Student 记录(清单3),它不仅使用记录(在 Java 14 中引入),还使用 String.isBlank() 方法(在 Java 11 中引入),并将其放在文件夹 src/main/java17/com/example 中。
    清单3:使用较新 Java 特性的 Student 记录
  • public record Student(String firstName) boolean isBlankName() return firstName.isBlank(); static String implementation() return "record";
    需要一些配置,但这是取决于你使用的构建工具。可以在我的 GitHub 存储库中找到一个 Maven 示例。该示例构建在 Java 17 上,并创建 JAR 文件。当在 JDK 17 或更新版本上执行 JAR 文件时,将使用 Student 记录。在旧版本上执行 JAR 文件时,将使用 Student 类。
    这个特性是非常有用的,例如,如果新的 API 提供更好的性能,因为你可以使用那些有最新 Java 版本的客户的 API 。使用旧 JDK 的客户可以使用相同的 JAR 文件,而不需要提高性能。
    请注意,在本示例中,所有的实现,即 Student,都应该具有相同的公共 API,以防止出现运行问题。但是,构建工具不验证公共 API,但一些 IDE 可以。此外,在 JDK 17 中,你可以使用 jar -validate 命令来验证 JRA 文件。
    需要注意的是,JDK 某些版本中提供的预览功能。一些较大的特性首先以预览的形式发布,可能会在下一个 JDK 中形成最终的特性。这些预览特性在 Java 的 LTS 和非 LTS 版本中都有,并且,这些特性是通过 enable-preview 标志启用的,默认情况下是关闭的。如果你在产品代码中使用这些预览特性,请注意它们可能会在 JDK 版本之间发生变化,这可能会导致需要进行一些调试或重构。

    关于 Java 弃用和特性移除的更多信息
    在升级 JDK 之前,请确保你的 IDE、构建工具和依赖项是最新的。Maven 版本插件和 Gradle 版本插件会显示你有哪些依赖项,并列出最新的可用版本。
    请注意,这些工具只显示您所使用文件的新版本——但有时文件名称会更改,会产生分叉,或者代码会移动。例如,JAXB 首先是通过 jakarta.xml.bind: jaxb-api,但改为 jakarta.xml.bind: jakarta.xml.bindapi 在它过渡到 Eclipse Foundation 之后。要找到这样的变化,你可以使用 Jonathan Lermitage 的 Maven Old Grouplds Alerter 插件或者它的 Gradle 插件。
    JavaFX从 Java 11 开始,平台不再将 JavaFX 作为规范的一部分,大多数 JDK 构建已经删除了它。你可以使用来自 Gluon 的独立 JavaFX 构建,或者将 OpenJFX 依赖项添加到你的项目中。
    字体曾经 JDK 包含一些字体,但是从 Java 11 开始,它们被删除了。例如,如果你使用 Apache POI(用于 Microsoft Office 兼容文档的 Java API)。你需要字体,操作系统需要提供字体,因为它们不再出现在 JDK 中。但是,在诸如 Alpine Linux 这样的操作系统中,字体必须使用 apt install fontconfigcommand 手动安装,根据您使用的字体,可能需要额外的字体包。
    Java 任务控制。对于监视和分析应用程序,这是一个非常有用的工具。我强烈建议你调查一下。Java Mission Control 曾经包含在 JDK 中,但现在它可以作为一个单独的下载,并以新的名称提供:JDK Mission Control。
    Java EE。JDK 11 中最大的变化是删除了 Java EE 模块。前面提到的 JAXB 等 Java EE 模块被许多应用程序使用。既然这些模块不再存在于 JDK 中,你应该添加相关的依赖项。表 1 列出了各种模块及其依赖关系。
    请注意,JAXB 和 JAX-WS 都需要两个依赖项:一个用于 API,另一个用于实现。另一个变化是命名约定,现在 Java EE 由 Eclipse Foundation 以 Jakarta EE 的名称维护。你的包导入需要反映这种变化,例如 jakarta.xml。绑定。应该使用 * 而不是 javax.xml.bind。
    表1:Java EE 模块及其当前替换
    CORBA。Java 的 CORBA 模块没有正式的替代,它在 Java 11 中被删除了。然而,Oracle GlassFish Server 包含 CORBA 的实现。
    Nashorn。Java 15 删除了 Nashorn javascript 引擎。如果你仍然想使用引擎,您可以使用 nashorncore 依赖项。
    实验的编译器。Java 17 删除了对 GraalVM 实验性的提前(AOT)和即时(JIT)编译器的支持,这在 JEP 410 的文档中有解释。

    注意不支持的主文件
    你可能会看到错误:Unsupported class file major version 61。我 在JaCoCo 代码覆盖库和各种其他 Maven 插件中看到过它。消息的主要版本 61指的是 Java 17。在这种情况下,这意味着你使用的框架或工具的版本不支持 Java 17。因此,你应该将框架或工具升级到新版本。(如果你看到一条包含主版本 60 的消息,那么它与 Java 16 有关。)
    请注意,一些工具,如 Kotlin 和 Gradle 还不支持 Java 17,至少在我写这篇文章的时候(2021年8月中旬)是这样的。
    有时可以解决这个问题,例如,将 Java 16 指定为 Kotlin 的 JVM 目标。不过,我希望 Java 17 支持很快就会加入。

    封装 JDK 内部 API
    Java 16 和 Java 17 封装了 JDK 内部 API,这影响了各种框架,比如 Lombok。你可能会看到类似module jdk.compiler 没有导出 com.sun.tools 这样的错误,这意味着你的应用程序不再能够访问 JDK 的那一部分。
    总的来说,我建议升级所有使用这些内部组件的依赖项,并确保您自己的代码不再使用它们。
    如果这实现不了,有一个解决方案仍然使你的应用程序访问内部。例如,如果你需要访问 comp 模块,请使用以下命令:
  • ——add-opens = jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED
    但是,只能将此解决方案作为最后的手段,最好是临时使用,因为您正在规避 Java 团队添加的重要保护措施。
    了解关于 JEP 396 中的 Java 16 和 JEP 403 中的 Java 17 的更多信息。

    Java升级资源
    建议查看我创建的 JavaUpgrades GitHub 存储库,其中包含一些示例、常见错误和解决方案,可以在升级过程中帮助你。

    结论
    升级依赖关系并为已删除的 JDK 特性添加依赖关系可以解决许多 Java 升级挑战。我建议采用一种结构化的方法逐步升级:首先,确保代码已编译,然后运行测试,再运行应用程序。
    如果你告诉自己、团队和公司你可以在 JDK 17 上编译和测试所有的东西,而不是告诉他们它几乎已经完成了,或者更糟的是,它只完成了 80%,那么迁移的过程就会容易很多。
    我个人的经验是,从 JDK 11 升级到 JDK 17 要比从 JDK 8 升级到 JDK 11 容易得多。然而,在这两种情况下,对于重要的应用程序来说都是几个小时到几天的时间不等,这主要是由于等待构建完成。
    希望本文能简化你的升级过程。
    说说大家留言说说你在用java几? 我还在用java 8!

    参考链接:

    https://spring.io/blog/2021/09/02/a-java-17-and-jakarta-ee-9-baseline-for-spring-framework-6

    https://blogs.oracle.com/javamagazine/migrate-to-java-17

    逆锋起笔是一个专注于程序员圈子的技术平台,你可以收获最新技术动态最新内测资格BAT等大厂的经验精品学习资料职业路线副业思维,微信搜索逆锋起笔关注!

    面试官:Java 反射是什么?
    快来围观 Java 16
    Java 9 到 16 新特性总结大全!
    编写高性能 Java 代码的最佳实践!
    排名前 16 的 Java 工具类,你用过哪个?

    Java17 新特性确定,Java之父:终于可以和一个长达25年的漏洞说再见了

    Java 17 目前已经进入Rampdown Phase One阶段,所有的功能特性都已经被冻结。这说明Java 17的新特性已经定了,不会再增加新的JEP(JDK增强建议)。之所以关心Java 17是因为和Java 8、Java 11一样它是下一个LTS版本。

     

    发布日程

    距离Java 17发布的时间已经越来越近了。Rampdown Phase One阶段将持续近一个月。接下来的工作将以JEP3为基准,对可能出现的Bug进行修复、延迟修复、甚至是将Bug所在特性从版本中移除。大家关心的Java17发布时间表如下:

     

    功能特性

    Java17将带来以下特性:

     

    插曲

    另外放一个小插曲,就在Java17特性JEP 306公布的时候“Java之父”高斯林科普了一个该特性相关而且搁置长达25年的漏洞,看上去很厉害的样子。Java17发布之后就可以和该漏洞Say Goodbye了。

    “Java之父”对该漏洞的评论

     

    Java 18也开始准备了

    另外随着Java17的特性冻结,Java18也构建了早期版本。

    Java 18 都开始构建了,你的Java 8还要坚持多久呢?

    
    往期推荐
    

    假如王撕葱是程序员。。。


    我的阿里二面,为什么MySQL选择Repeatable Read作为默认隔离级别?


    炸机了!!!

    如果你喜欢本文,

    请长按二维码,关注 Hollis.

    转发至朋友圈,是对我最大的支持。

    点个 在看 

    喜欢是一种感觉

    在看是一种支持

    ↘↘↘

    以上是关于Java 17:和遗留 25 年的漏洞 Say Goodbye的主要内容,如果未能解决你的问题,请参考以下文章

    隐藏17年的Office远程代码执行漏洞(CVE-2017-11882)

    ms17010漏洞利用windows啥服务

    tomcat沉睡十年的漏洞被公开,听说你还才刚知道?

    7-17 奥运排行榜 (25 分)

    1struts2漏洞利用小结

    java 38. Count和Say.java