• JDK API Diff Report Generator-Java版本对比工具


    今天查资料找到了除了EMT4J之外,其他可以用于Java版本迁移的工具。

    这里简单的记录一下。

    非Java er,有不同意见欢迎评论区交流。


    JDK API Diff Report Generator的介绍

    JDK API Diff是一个用于比较不同Java版本API区别的工具,会将结果生成HTML文件,github地址在这里

    可以使用此工具比较OpenJDK 9和OpenJDK 10,OpenJDK 9和Oracle JDK 9等两个版本之间的API区别。

    如果不想编译可以在项目的 docs 目录下找到各种OpenJDK之间版本的对比,目前有的Java版本对比如下:

    ITS之间:

    8⇀11,8⇀17,11⇀17

    相邻版本之间的 :

    8⇀9,9⇀10,...,17⇀18

    检测结果

    这里以8⇀11为例解释检测结果:

    先是一个表格显示对比的两个版本,创建时间,忽略哪些类等等。

    这里简单解释下表格的意思(不是官方的,我自己的理解): 

    属性翻译功能
    Access modifier filter: PROTECTED访问过滤器设置为“PROTECTED” 不明
    Only modifications: true仅显示更改:是只有发生了修改的部分会被显示,而没有发生变化的部分会被隐藏
    Only binary incompatible modifications: false仅显示二进制不兼容:否展示了二进制兼容和源码兼容相关的内容
    Ignore missing classes: true忽略了不存在的类:是
    Includes: all表示包含了所有的包和类进行比较,没有排除任何内容
    Excludes: 排除了一些特定的包和类,这些包和类不会被包括在比较中

    可以看到这个检测结果忽略了内部类,我想看到内部类的变化,因此选择了重新生成检测结果。

    再往下来是class的检测结果,结果大体是四种:

    • NEW
    • MODIFIED
    • REMOVED
    • UNCHANGED

    都是字面意思,比较好理解,其中每一种又分为两类,这里以UNCHANGED为例:

    • UNCHANGED(*)
    • UNCHANGED(!)

    二进制不兼容的更改用(!)标记。而源不兼容的更改用(*)标记。

    补充:源兼容性&二进制兼容性

    源兼容性(Source Code Compatibility):
    这种兼容性指的是旧版本的源代码在新版本的编译器中能够被编译成功,而不需要进行大量修改。 

    二进制兼容性(Binary Compatibility):
    二进制兼容性是指使用旧版本的编译好的类文件(字节码)能够在新版本的 Java 运行时环境中正常运行,而无需进行修改。 


    这里列出了有影响或者有变化的class,右边蓝色的部分是超链接,可以跳转到对应的类里看详细信息。

    编译

    下载项目之后,要先一些进行配置才能编译。

    toolchain

    sudo vim ~/.m2/toolchains.xml

    添加以下内容,因为我只打算比较LTS版本,所以这里选了8,11,17三个版本。

    如果要比较其他版本,修改里的内容。

    1. <toolchains xmlns="http://maven.apache.org/TOOLCHAINS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/TOOLCHAINS/1.1.0 http://maven.apache.org/xsd/toolchains-1.1.0.xsd">
    3. <toolchain>
    4. <type>jdktype>
    5. <provides>
    6. <version>8version>
    7. <vendor>openjdkvendor>
    8. provides>
    9. <configuration>
    10. <jdkHome>/usr/lib/jvm/java-8-openjdk-amd64jdkHome>
    11. configuration>
    12. toolchain>
    13. <toolchain>
    14. <type>jdktype>
    15. <provides>
    16. <version>11version>
    17. <vendor>openjdkvendor>
    18. provides>
    19. <configuration>
    20. <jdkHome>/usr/lib/jvm/java-1.11.0-openjdk-amd64jdkHome>
    21. configuration>
    22. toolchain>
    23. <toolchain>
    24. <type>jdktype>
    25. <provides>
    26. <version>17version>
    27. <vendor>openjdkvendor>
    28. provides>
    29. <configuration>
    30. <jdkHome>/usr/lib/jvm/java-1.17.0-openjdk-amd64jdkHome>
    31. configuration>
    32. toolchain>
    33. toolchains>

    pom.xml

    修改里的内容,改成要比较的两个jdk版本,只能选toolchains.xml里配置过的版本。

    忽略的部分

    忽略的部分是红色框出来的部分,可以看到默认是注释状态,这里不需要额外出来。

    编译语句

    mvn clean install

    项目会将对应的jdk版本全部打包成jar包,通过对比jar包的区别,来生成差别html。

    遇到的问题

    Missing header in: jdk-api-diff/LICENSE.txt

    这个我也没查明白,所以把pom.xml里的license-maven-plugin插件注掉解决的。

    java.io.FileNotFoundException: /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/javaws.jar

    项目里测试的版本是8u301,我目前在用的版本是8u382,jdk有一些区别,所以会有这个报错。

    这里注释掉相关代码解决。

    ps:jfxrt.jar注释掉是因为这个也报错了,这个里不再粘贴报错信息。

    编译结果

    对比的结果在target目录下,jdk-api-diff.html。

    结果将近200m,比例子里的50m多了很多。

    可以看到,这份检测结果里有内部类。 

  • 相关阅读:
    NISP-SO网络安全运维是什么?安全运维工程师
    springboot操作influxdb
    自研 MySQL Binlog 分析程序介绍
    Chrome插件开发入门
    Chatgpt介绍及搭建步骤
    基于YOLOv5[n/s/m/l/x]全系列参数模型开发构建小麦麦穗智能化精准检测识别计数系统
    【重识云原生】第四章容器基础6.4.10.5节——Statefulset原理剖析
    删除A文件夹中 AB文件夹共有的文件
    产学研合作生态硬核来袭,共探数据库技术发展与应用
    JavaFX开发教程——快速入门FX
  • 原文地址:https://blog.csdn.net/weixin_48885322/article/details/134059235