今天查资料找到了除了EMT4J之外,其他可以用于Java版本迁移的工具。
这里简单的记录一下。
非Java er,有不同意见欢迎评论区交流。
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的检测结果,结果大体是四种:
都是字面意思,比较好理解,其中每一种又分为两类,这里以UNCHANGED为例:
二进制不兼容的更改用(!)标记。而源不兼容的更改用(*)标记。
源兼容性(Source Code Compatibility):
这种兼容性指的是旧版本的源代码在新版本的编译器中能够被编译成功,而不需要进行大量修改。
二进制兼容性(Binary Compatibility):
二进制兼容性是指使用旧版本的编译好的类文件(字节码)能够在新版本的 Java 运行时环境中正常运行,而无需进行修改。
这里列出了有影响或者有变化的class,右边蓝色的部分是超链接,可以跳转到对应的类里看详细信息。
下载项目之后,要先一些进行配置才能编译。
sudo vim ~/.m2/toolchains.xml
添加以下内容,因为我只打算比较LTS版本,所以这里选了8,11,17三个版本。
如果要比较其他版本,修改
- <toolchains xmlns="http://maven.apache.org/TOOLCHAINS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/TOOLCHAINS/1.1.0 http://maven.apache.org/xsd/toolchains-1.1.0.xsd">
- <toolchain>
- <type>jdktype>
- <provides>
- <version>8version>
- <vendor>openjdkvendor>
- provides>
- <configuration>
- <jdkHome>/usr/lib/jvm/java-8-openjdk-amd64jdkHome>
- configuration>
- toolchain>
- <toolchain>
- <type>jdktype>
- <provides>
- <version>11version>
- <vendor>openjdkvendor>
- provides>
- <configuration>
- <jdkHome>/usr/lib/jvm/java-1.11.0-openjdk-amd64jdkHome>
- configuration>
- toolchain>
- <toolchain>
- <type>jdktype>
- <provides>
- <version>17version>
- <vendor>openjdkvendor>
- provides>
- <configuration>
- <jdkHome>/usr/lib/jvm/java-1.17.0-openjdk-amd64jdkHome>
- configuration>
- toolchain>
- toolchains>
修改
忽略的部分是红色框出来的部分,可以看到默认是注释状态,这里不需要额外出来。
mvn clean install
项目会将对应的jdk版本全部打包成jar包,通过对比jar包的区别,来生成差别html。
这个我也没查明白,所以把pom.xml里的license-maven-plugin插件注掉解决的。
项目里测试的版本是8u301,我目前在用的版本是8u382,jdk有一些区别,所以会有这个报错。
这里注释掉相关代码解决。
ps:jfxrt.jar注释掉是因为这个也报错了,这个里不再粘贴报错信息。
对比的结果在target目录下,jdk-api-diff.html。
结果将近200m,比例子里的50m多了很多。
可以看到,这份检测结果里有内部类。