Java SE 版本迁移

在 Java 代码审查规则集下,Java SE 迁移类别包含从 J2SE 5.0、Java SE 6、Java SE 7、Java SE 8 或 Java SE 11 或 Java SE 17 迁移的规则。 Java迁移目标为Java SE 8、11、17和21。

Sun 至 IBM Java 兼容性影响类别提供了一组规则,用于迁移 IBM Java 运行时环境上不可用的 Sun API。 可能时,这些规则会迁移代码以使用 javax.netcom.ibm.net.ssl 类。

所选的特定规则取决于应用程序先前使用的所选源 Java 运行时环境以及您要迁移至的 WebSphere 版本。 对于Liberty,您可以选择Java SE 8、11、17或21作为目标。 对于 WebSphere Traditional ,必须迁移到 Java SE 8。

在可能的情况下都会提供快速修订。 不具有快速修订的规则会标记规则违例,以便您可以根据需要对其用法进行评估并手动迁移代码。

Java SE 21 兼容性影响

Liberty 23.0.0.10 及更高版本支持 Java 21。 Java SE 21 兼容性影响包括 Java SE 17 至 21 版本的所有兼容性影响。

表 1. Java SE 21 兼容性影响
规则名称 规则描述 自动修复
Java SE 21 一般信息和潜在问题 本规则包含有关 Java SE 21 中的更改以及 Java SE 21 之后发布的先前非 LTS(长期支持)Java 版本的信息链接。 java-version-21.yml
org.openrewrite.java.migrate.UpgradeToJava17
当输出流为 PrintStream 时,避免使用默认字符集 该规则标记了 java.io.PrintStreamjava.io.PrintWriterjava.io.OutputStreamWriter Java 类构造函数,这些构造函数使用 java.io.OutputStream 和无字符集。 False
避免在 javax.security.auth.Subject 中使用已废弃的 getSubject() 和 doAs() 方法 该规则标记了 getSubject()doAs() 方法在 javax.security.auth.Subject 类中的使用。 Java SE 17 不再支持 getSubject() 方法,并标记为 forRemoval = true。 Java SE 18 不再支持 doAs() 方法,并标记为 forRemoval = true java-version-21.yml
org.openrewrite.java.migrate.RemovedSubjectMethods
java.security.manager系统属性的默认值已更改为禁止 该规则标记了 setSecurityManager(SecurityManager()) 方法在 java.lang.System 中的使用。 False
请勿使用 java.lang.Compiler 类 该规则标记了 java.lang.Compiler 类的使用。 Java SE 21 已删除该类。 False
避免使用 Thread.stop(), Thread.resume() 和 Thread.suspend() 方法 该规则标记了 Thread.stop()Thread.suspend()Thread.resume() 方法的使用。 这些方法在 Java SE 19 中已被废弃,并已更新为总是抛出 UnsupportedOperationException。 由于该方法本质上不安全,且自 Java 1.2 起已被弃用,因此最终将被降级并在未来的版本中删除。 False
请勿使用 ThreadGroup.allowThreadSuspension 方法 该规则标记了 ThreadGroup.allowThreadSuspension 方法的使用。 在 JDK 1.1 中,这种方法被用于低内存处理,但从未被完全指定。 在 JDK 1.2(1998 年)中,它已被弃用,改为 "什么也不做"。 Java 21 版本已删除此方法。 False
将 ObjectInputStream.GetField.get(name, object) 方法改为抛出 ClassNotFoundException 该规则标记了 get(String name, Object val) 方法在 java.io.ObjectInputStream.GetField 中的使用。 False
请勿使用 RMIIIOPServerImpl 类 该规则标记了 javax.management.remote.rmi.RMIIIOPServerImpl 类的使用,该类已在 Java SE 21 中删除。 False
避免使用旧版 PlainSocketImpl 和 PlainDatagramSocketImpl 实现 该规则标记了构造函数 java.net.Socket(Proxy proxy)java.net.DatagramSocket(SocketAddress bindaddr)java.net.MulticastSocket(SocketAddress bindaddr) 的使用 False
避免在 java.desktop 中使用已废弃的空 finalize() 方法 该规则标记了 java.awt.color.ICC_Profilejava.awt.image.ColorModeljava.awt.image.IndexColorModel 类中 finalize() 方法的使用。 java-version-21.yml
org.openrewrite.java.migrate.DeleteDeprecatedFinalize
避免使用已降级的 ThreadGroup 方法 该规则标记了 ThreadGroup.setDaemonThreadGroup.isDaemonThreadGroup.destroyThreadGroup.isDestroyed 方法的使用。 False

Java SE 17 兼容性影响

Java 17 在 Liberty 21.0.0.10 和更高版本上受支持。 Java SE 17 兼容性影响包括从 Java SE 版本 12 到 17 的所有兼容性影响。

表 2. Java SE 17 兼容性影响
规则名称 规则描述 自动修复
不兼容的 XML 文档的 Properties.loadFromXML 方法的行为更改 此规则将标记 java.util.Properties.loadFromXML​(java.io.InputStream) 方法调用。 该方法会在 Java SE 12 中为不兼容的 XML 文档抛出异常。 False
user.timezone 系统属性的行为更改 此规则将标记具有 user.timezone 属性值的 System.getProperty 方法调用。 该方法可能在 Java SE 12 中返回空值。 False
检查正则表达式模式匹配中的行为更改 如果所提供的正则表达式包含一个交集、一个嵌套字符类、一个非嵌套字符类,则该规则标记调用这些方法。 False
请勿使用已移除的 FileInputStream.finalize() 和 FileOutputStream.finalize() 方法 在 Java SE 12 中已移除了 java.io.FileInputStream.finalize()java.io.FileOutputStream.finalize() 方法。 java-version-17.yml
org.openrewrite.java.migrate.RemovedFileIOFinalizeMethods
请勿使用 com.sun.awt.SecurityWarning 类 在 Java SE 12 中已移除了 com.sun.awt.SecurityWarning 类。 False
请勿使用已移除的 ZipFile.finalize()、Inflater.finalize() 和 Deflater.finalize() 方法 在 Java SE 12 中已移除了 java.util.zip.ZipFile.finalize()java.util.zip.Inflater.finalize()java.util.zip.Deflater.finalize() 方法。 java-version-17.yml
org.openrewrite.java.migrate.RemovedZipFinalizeMethods
请勿使用已移除的 Runtime.traceInstructions(boolean) 和 Runtime.traceMethodCalls(boolean) 方法 在 Java SE 13 中已移除了 java.lang.Runtime.traceInstructions(boolean)java.lang.Runtime.traceMethodCalls(boolean) 方法。 java-version-17.yml
org.openrewrite.java.migrate.RemovedRuntimeTraceMethods
已移除 java.util.jar.Pack200 API 除了其 java.util.jar.Pack200.Packerjava.util.jar.Pack200.Unpacker 接口以外,还移除了 java.util.jar.Pack200 类。 False
已移除 sun.nio.cs.map 系统属性 在 Java SE 14 中移除了 sun.nio.cs.map 系统属性。 此规则将标记对“sun.nio.cs.map”的字符串字面值引用 False
已移除 java.security.acl 包 在 Java SE 14 中移除了 java.security.acl 包,应改为使用 java.security.Policy 类。 False
已移除弱命名曲线 已从 Java SE 16 的 SunEC 提供程序中移除了弱命名曲线。 此规则将标记对任何弱命名曲线的引用。 False
使用新 java.lang.Record 类检查名称空间冲突 已在 Java SE 14 中添加 java.lang.Record 类。 要避免名称空间冲突,请确保使用单类型导入(例如:“com.foo.Record”)而不是通配符导入(例如:“com.foo.*”)来导入名为“Record”的任何其他类。 False
已移除 netscape.javascript.JSObject.getWindow(Applet) 方法 在 Java SE 14 中移除了 netscape.javascript.JSObject.getWindow(Applet) 方法。 由于此方法仅与 Java 插件一起使用,而 Java 插件也已移除,因此无法替代此方法。 False
检查 DatagramPacket.getPort() 方法的行为更改 在 Java SE 15 中,DatagramPacket.getPort() 方法的缺省返回值已从 -1 更改为 0。 False
已移除 RMIConnectorServer.CREDENTIAL_TYPES 常量 在 Java SE 15 中移除了 RMIConnectorServer.CREDENTIAL_TYPES 常量。 java-version-17.yml
org.openrewrite.java.migrate.RemovedRMIConnectorServerCredentialTypesConstant
已移除 SSLSession.getPeerCertificateChain() 方法实现 在 Java SE 15 中移除了缺省的 SSLSession.getPeerCertificateChain() 方法实现。 java-version-17.yml
org.openrewrite.java.migrate.RemovedSSLSessionGetPeerCertificateChainMethodImpl
已移除 Modifier() 和 ConstantBootstraps() 构造函数 在 Java SE 15 中移除了 Modifier()ConstantBootstraps() 构造函数。 java-version-17.yml
org.openrewrite.java.migrate.RemovedModifierAndConstantBootstrapsConstructors
已移除 SO_FLOW_SLA Solaris 套接字选项 在 Java SE 15 中移除了 SO_FLOW_SLA Solaris 套接字选项以及相关的 SocketFlowSocketFlow.Status 类。 False
已移除 com.sun.net.ssl.internal.ssl.Provider 提供程序名称 在 Java SE 15 中移除了 com.sun.net.ssl.internal.ssl.Provider 原有的 SunJSSE 提供程序名称。 应将其替换为 SunJSSE 提供程序名称。 java-version-17.yml
org.openrewrite.java.migrate.RemovedLegacySunJSSEProviderName
检查 java.lang.CharSequence 接口上的 isEmpty() 缺省方法 在 Java SE 15 中向 java.lang.CharSequence 接口添加了缺省的 isEmpty() 方法。 可能需要更新用于实现 java.lang.CharSequence 接口和另一个定义缺省 isEmpty() 方法的接口的类。 False
Java SE 17 常规信息和潜在问题 有关此工具未检测到的 Java SE 17 更改的常规信息和潜在迁移问题。 java-version-17.yml
org.openrewrite.java.migrate.Java8toJava11
已移除 ToolProvider() 构造函数 在 Java SE 16 中移除了 ToolProvider 构造函数。 java-version-17.yml
org.openrewrite.java.migrate.RemovedToolProviderConstructor
已移除 com.sun.net.ssl 包 已移除了内部 API com.sun.net.ssl。 该包仅供内部使用,可以在 javax.net.ssl 包中找到替代 API。 java-version-17.yml
org.openrewrite.java.migrate.SunNetSslPackageUnavailable
避免使用 java.lang.ThreadGroup 和 java.lang.Thread 中不推荐的方法 在 Java SE 14 中不推荐使用 java.lang.Thread 中的 suspendresume 方法,以及 java.lang.ThreadGroup 中的 suspendresumeallowThreadSuspension 方法。 在 Java SE 16 中,不推荐使用 java.lang.ThreadGroup 中的 stopdestroyisDestroyedsetDaemonisDaemon 方法。 False
检查 java.util.stream.Stream 接口是否有缺省的 toList() 方法 在 Java SE 16 中,向 java.util.stream.Stream 接口添加了缺省的 toList() 方法。 可能需要更新用于实现 java.util.stream.Stream 接口和另一个定义缺省 toList() 方法的接口的类。 False
检查 HttpPrincipal.getName() 方法的行为更改 在 Java SE 16 中,更改了 HttpPrincipal.getName() 方法返回的值。 False
检查 java.io.LineNumberReader 类的行为更改 在 Java SE 16 中,更改了 java.io.LineNumberReader 类中行终止符的定义。 False
避免使用不推荐的 java.security.cert API 在 Java SE 16 中,不推荐使用 java.security.cert.X509Certificatejava.security.cert.X509CRLjava.security.cert.X509CertSelectorjava.security.cert.X509CRLSelector 中的 getIssuerDNgetSubjectDNgetIssuerDNsetIssuersetSubjectgetIssuerAsStringgetSubjectAsStringaddIssuerName 方法。 False
避免使用 java.util.logging.LogRecord 中不推荐的方法 在 Java SE 16 中,不推荐使用 java.util.logging.LogRecord 中的 getThreadIDsetThreadID 方法。 java-version-17.yml
org.openrewrite.java.migrate.DeprecatedLogRecordThreadID
避免使用不推荐的原语包装程序类构造函数 在 Java SE 16 中,不推荐使用原语包装程序类构造函数。 False
javax.security.cert 包已不推荐使用并将移除

在 Java SE 13 中不推荐使用 javax.security.cert,并已将其标记为移除。 不应再使用此包中的类。 java.security.cert 包中提供了适当的替换项。

java-version-17.yml
org.openrewrite.java.migrate.DeprecatedJavaxSecurityCert
Thread.countStackFrames() 方法已更改为无条件抛出 UnsupportedOperationException

在 Java SE 14 中,最终不推荐的方法 Thread.countStackFrames() 已更改为无条件抛出 UnsupportedOperationException

java-version-17.yml
org.openrewrite.java.migrate.DeprecatedCountStackFramesMethod
避免使用已除去的 RMI 激活包

在 Java SE 15 中不推荐使用 java.rmi.activation 包,在 Java SE 17 中已除去。

False
不推荐使用套接字实施工厂机制 以下方法用于设置在 Java SE 17 中不推荐使用的系统范围套接字实施工厂:static void ServerSocket.setSocketFactory(SocketImplFactory fac)static void Socket.setSocketImplFactory(SocketImplFactory fac)static void DatagramSocket.setDatagramSocketImplFactory(DatagramSocketImplFactory fac) False
检查 HttpClient.newHttpClient 和 HttpClient.Builder.build 上的行为变化 使用 Java SE 17 中的交叉部分,一些正则表达式的模式匹配行为已更改。 False
已除去 sun.misc.Unsafe 的 defineAnonymousClass 方法 已在 Java SE 17 中除去 sun.misc.Unsafe 中的 defineAnonymousClass 方法。 False
检查 Java 代理程序中的行为更改 Java 代理程序 premainagentmain 方法必须在 Java SE 17 中公开。 java-version-17.yml
org.openrewrite.java.migrate.Jre17AgentMainPreMainPublic
已不推荐使用并将移除 Applet API 在 Java SE 17 中已不推荐使用并将移除 Applet API。 False
现在限制使用 SHA-1 算法签名的 JAR 缺省情况下,现在限制使用 SHA-1 算法签名的 JAR,并被视为在 Java SE 17 中未签名。 False
Java SE 17 上的远程 EJB 调用可能失败 由于更严格的模块访问强制,在 Java SE 17 上远程 EJB 调用可能会失败。 False

Java SE 11 兼容性影响

在 Liberty V19.0.0.1 和更高版本上支持 Java 11。

表 3. Java SE 11 兼容性影响
规则名称 规则描述 自动修复
避免使用不推荐的 RMIIIOPServerImpl 类 此规则将标记是否使用 RMIIIOPServerImpl 类。 在 Java SE 11 中不推荐使用此类。 False
缺省语言环境数据的行为更改 在 Java 11 中,Unicode 联合会的通用语言环境数据存储库 (CLDR) 作为缺省语言环境数据启用。 在先前的发行版中,缺省值为 JRE(现在称为 COMPAT)。 使用语言环境敏感性服务(如日期、时间和数字格式)的代码可能会使用 CLDR 语言环境数据生成不同的结果。 False
调用 Class.getAnnotation() 方法时出现的异常的行为更改 在 Java 11 中,如果注释具有引用缺失类的数组值,那么 java.lang.Class.getAnnotation() 方法将抛出 java.lang.TypeNotPresentException 而非 java.lang.ArrayStoreException java-version-11.yml
org.openrewrite.java.migrate.ArrayStoreExceptionToTypeNotPresentException
java.util.concurrent.ThreadPoolExecutor.finalize() 方法的行为更改 在 Java 11 中,java.util.concurrent.ThreadPoolExecutor.finalize() 方法不再会关闭线程池。 False
java.lang.invoke.MethodHandles.filterArguments 方法的行为更改 此规则将标记使用 java.lang.invoke.MethodHandles.filterArguments 方法的应用程序。 False
javax.management.MBeanOperationInfo 构造函数的行为更改 如果所提供的影响不是 INFO、ACTION、ACTION_INFO 或 UNKNOWN 之一,那么此规则将标记使用 javax.management.MBeanOperationInfo 构造函数的应用程序 False
带有原始类型的 java.xml API 方法的行为更改 在 Java 11 中,已更新具有原始类型的包含方法声明的 java.xml API 以添加类型参数。 False
检查 Selector select 和 selectNow 方法的行为更改 此规则将标记 java.nio.channels.Selector.select()java.nio.channels.Selector.selectNow() 方法。 在 JDK 11 中,这些方法的行为已发生更改。 False
检查是否存在与分离 I/O 通道的阻止和非阻止代码路径相关的行为更改 在 Java 11 中,为了提高性能和可靠性,为 I/O 通道创建了单独的阻止和非阻止代码路径。 此规则将标记可能受此行为更改影响的 API 调用。 False
检查是否存在与 com.ibm.security.auth.module.Krb5LoginModule 类相关的配置更改 此规则将标记对在迁移到 Java 11 时可能需要配置更改的 com.ibm.security.auth.module.Krb5LoginModule 相关类的任何引用。 False
检测默认密钥库的更改 在Java 11中,默认的密钥库已从 JKS 更新为 PKCS12。 因此,依赖 KeyStore.getDefaultType() 的应用程序在迁移后可能会遇到问题,除非其JKS密钥库已转换为 PKCS12。 java-version-11.yml
org.openrewrite.java.migrate.ChangeDefaultKeyStore
检查 Pack200.Packer 和 Pack200.Unpacker 接口上的已移除的方法 在 Java 11 中,Pack200.PackerPack200.Unpacker 接口上不再定义 addPropertyChangeListenerremovePropertyChangeListener False
请勿使用 com.sun.image.codec.jpeg 包中的 API com.sun.image.codec.jpeg API 在 Java SE 11 中不可用。 False
请勿使用 com.sun.xml.internal.bind中的 API。.* 程序包 com.sun.xml.internal.bind.* 包中的 API 在 Java SE 11 中不再可用。 java-version-11.yml
org.openrewrite.java.migrate.InternalBindPackages
请勿使用来自星期日的 API。* 程序包 sun.* API 是不受支持的 JDK 内部 API,可能会随时移除。 False
请勿使用来自 sun.* 的 BASE64Encoder/Decoder 应用程序编程接口 程序包 在 Java SE 11 中已移除了 sun.misc.BASE64Encodersun.misc.BASE64Decoder java-version-11.yml
org.openrewrite.java.migrate.UseJavaUtilBase64
请勿使用 JCEKS 密钥存储格式 该规则可检测并标记 KeyStore.getInstance("JCEKS") 的使用。 开发人员应更新其应用程序,使用 PKCS12 以实现兼容性。 False
请勿使用 javax.security.auth.Policy 类 javax.security.auth.Policy 类在 Java SE 11 中不可用。 此规则将标记对 javax.security.auth.Policy 类的任何引用。 java-version-11.yml
org.openrewrite.java.migrate.RemovedPolicy
请勿使用已移除的 com.sun 类 此规则将标记在 Java SE 11 中不可用的 com.sun 类。 False
请勿使用已移除的 runFinalizersOnExit 方法 已从 Java SE 11 中移除 java.lang.Runtime.runFinalizersOnExitjava.lang.System.runFinalizersOnExit 方法。 False
不要使用 com.sun.awt.AWTUtilities 静态方法调用 com.sun.awt.AWTUtilities.isTranslucencySupported()com.sun.awt.AWTUtilities.setWindowOpacity()com.sun.awt.AWTUtilities.getWindowOpacity()com.sun.awt.AWTUtilities.getWindowShape()com.sun.awt.AWTUtilities.isWindowOpaque()com.sun.awt.AWTUtilities.isTranslucencyCapable() com.sun.awt.AWTUtilities.setComponentMixingCutoutShape() 方法已从Java SE 11中删除。 java-version-11.yml
org.openrewrite.java.migrate.ReplaceComSunAWTUtilitiesMethods
请勿使用 com.ibm.security.auth.module.Krb5LoginModule 类 com.ibm.security.auth.module.Krb5LoginModule 类在 Java SE 11 中不可用。 ibm-java.yml
org.openrewrite.java.migrate.Krb5LoginModuleClass
请勿使用 getPeer 方法 已从 Java 11 中移除了 Java SE API 中从 java.awt.peer 包返回类的所有方法。 要查看是否已设置同级,请使用 Component.isDisplayable()方法。 要测试组件是否是轻量级,请使用 Component.isLightWeight() 方法。 java-version-11.yml
org.openrewrite.java.migrate.ReplaceAWTGetPeerMethod
请勿使用 java.lang.ref.Reference clone 方法 Java 11 中不再支持 java.lang.ref.Reference 克隆方法。 java-version-11.yml
org.openrewrite.java.migrate.ReferenceCloneMethod
请勿使用 netdoc URL 协议 在 Java 11 中已移除了 netdoc 协议处理程序。 False
请勿使用已移除的 com.sun.java.browser.plugin2.DOM 和 sun.plugin.dom.DOMObject API com.sun.java.browser.plugin2.DOMsun.plugin.dom.DOMObject API 在 Java SE 11 中不可用。 False
请勿使用已移除的 com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel 或 apple.laf.AquaLookAndFeel Swing LookAndFeel Java SE 11 中的 javax.swing.UIManager.setLookAndFeel 方法不再支持 com.sun.java.swing.plaf.nimbus.NimbusLookAndFeelapple.laf.AquaLookAndFeel Swing LookAndFeels。 False
请勿使用已移除的 java.lang.Thread.destroy() 或 java.lang.Thread.stop(java.lang.Throwable) 方法 Java SE 11 中已移除 java.lang.Thread.destroy()java.lang.Thread.stop(java.lang.Throwable) 方法。 java-version-11.yml
org.openrewrite.java.migrate.ThreadStopDestroy
请勿使用已移除的 javax.crypto.ExemptionMechanism.finalize() 方法 已从 Java SE 11 中移除 javax.crypto.ExemptionMechanism.finalize() 方法。 False
请勿使用已移除的 jdk.Exported 注释 jdk.Exported 注释在 Java SE 11 中不可用。 False
请勿使用从 LogManager 中移除的 addPropertyChangeListener 或 removePropertyChangeListener 方法 在 Java 11 中,addPropertyChangeListenerremovePropertyChangeListener 方法在 java.util.logging.LogManager 类上不可用。 False
请勿使用已移除的 Runtime.getLocalizedInputStream 和 Runtime.getLocalizedOutputStream 方法 已从 Java SE 11 中移除 Runtime.getLocalizedInputStreamRuntime.getLocalizedOutputStream 方法。 java-version-11.yml
org.openrewrite.java.migrate.ReplaceLocalizedStreamMethods
请勿使用已移除的 SecurityManager 方法 此规则将标记从 Java SE 11 中的 java.lang.SecurityManager 类移除的方法。 False
请勿使用 SecurityManager 移除的方法(已自动修复) 此规则将标记从 Java SE 11 中的 java.lang.SecurityManager 类移除的方法。 该规则具有自动修复功能,可更新方法调用。 java-version-11.yml
org.openrewrite.java.migrate.RemovedSecurityManagerMethods
Java 11 版本号格式更改 Java 11 标志着新版本号命名约定的开始。 版本号格式从 1.8 (Java 8) 更改为 11 (Java 11)。 False
查看 FileInputStream 和 FileOutputStream overridden close 方法的资源清除 此规则将标记子类 java.io.FileInputStreamjava.io.FileOutputStream 上的 close() 方法。 False
运行 Java 类依赖关系分析器工具 (JDeps) JDK 附带了一个名为 jdeps 的命令行实用程序,用于分析类依赖关系。 可使用此工具来识别 JDK 11 中不再可用的 jdk 内部包。 False
java.awt.peer 和 java.awt.dnd.peer 包不可访问 已从 Java 11 中移除了引用 java.awt.peerjava.awt.dnd.peer 包中所定义类型的 Java SE API 中的所有方法。 在 Java 11 中,不再编译或运行用于调用先前接受或返回这些包中所定义类型的方法的代码。 False
java.nio.channels.DatagramChannel.send() 方法将抛出 AlreadyConnectedException 而不是 IllegalArgumentException 当地址传递到 java.nio.channels.DatagramChannel时。 send(ByteBuffer,SocketAddress) 方法与连接地址不同,在 Java SE 11 中,该方法会抛出 AlreadyConnectedException 而不是 IllegalArgumentException java-version-11.yml
org.openrewrite.java.migrate.IllegalArgumentExceptionToAlreadyConnectedException
可在并发线程中安全使用 java.nio.channels.Selector 和 java.nio.channels.SelectableChannel 类 已更新 java.nio.channels.Selectorjava.nio.channels.SelectableChannel 类以在 Java SE 11 中的并发线程中安全地使用。 False
在 JDK 11 中已移除了 java.transaction 模块 此规则将标记使用 javax.transaction 模块中的包的应用程序。 False
在 JDK 11 中已移除了 java.xml.bind 和 java.activation 模块(定制实现) 此规则将标记使用 java.xml.bindjava.activation 模块中的包并打包其自己的 JAXB 实现的应用程序。 ibm-java.yml
org.openrewrite.java.migrate.RemovedJaxBModuleProvided
在 JDK 11 中已移除了 java.xml.bind 和 java.activation 模块(缺省实现) 此规则将标记使用 java.xml.bindjava.activation 模块中的包并使用 WebSphere 缺省 JAXB 实现的应用程序。 False
在 JDK 11 中已移除了 JavaFX 模块 在 Java SE 11 中不提供 JavaFX 模块。 False
当数组包含空元素时,URLClassLoader 构造函数和 newInstance() 调用将抛出 NullPointerException URLClassLoader 构造函数和 newInstance() 调用将在 URL 数组包含空元素时在 Java SE 11 中抛出 NullPointerException False
在 JDK 11 中已移除了 Java Web Start 技术 在 JDK 11 中不提供 Java Web Start 技术。 此规则将标记应用程序中的 jnlp 文件。 False
ForkJoinPool 通用池类装入器的行为更改 此规则标记基于应用程序的线程上下文类装入器传播而导致行为差异的方法。 False
Java SE 11 一般信息和潜在问题 本规则包含有关 Java SE 11 中的更改以及 Java SE 11 之后发布的先前非 LTS(长期支持)Java 版本的信息链接。 java-version-11.yml
org.openrewrite.java.migrate.UpgradeToJava8
 

表 4. Java SE 11 兼容性影响(非 Liberty Core)
规则名称 规则描述 自动修复
在 JDK 11 中已移除了 java.corba 模块 此规则将标记使用 java.corba 模块中的包的应用程序。 False
在 JDK 11 中已移除了 java.xml.ws 模块(定制实现) 此规则将标记使用 java.xml.ws 模块中的包并打包其自己的 JAX-WS 实现的应用程序。 ibm-java.yml
org.openrewrite.java.migrate.RemovedJavaXMLWSModuleProvided
在 JDK 11 中已移除了 java.xml.ws 模块(缺省实现) 此规则将标记使用 java.xml.ws 模块中的包并使用 WebSphere 缺省 JAX-WS 实现的应用程序。 False

在 Java 11 中已移除了 IBM XML 实现。 有关详细信息,请参阅确定应用程序兼容性:XML

表 5. Java SE 11 IBM XML 实现兼容性影响
规则名称 规则描述 自动修复
已检测到对 IBM XML 实现内部包的依赖关系 此规则将标记对 IBM XML 内部包的引用。 False
已检测到对特定于 IBM XML 实现的配置参数的字符串字面值引用 此规则将标记对特定于 IBM XML 实现的配置参数的字符串字面值引用。 False
已检测到对 IBM XML 实现内部的字符串字面值引用 此规则将标记对 IBM XML 实现的字符串字面值引用。 False

Java SE 8 兼容性影响

Java 8 在 Liberty 和 WebSphere Application Server Traditional V8.5.5.9 和更高版本上受支持。

表 6. Java SE 8 兼容性影响
规则名称 规则描述 自动修复
设置 AWT 焦点遍历关键字时出现的异常的行为更改 在 Java 8 中,如果任何已通过的击键对象不是 AWTKeyStroke,那么 java.awt.Component setFocusTraversalKeysjava.awt.KeyboardFocusManager setDefaultFocusTraversalKeys 方法将抛出 ClassCastException 而不是 IllegalArgumentException False
java.lang.String 和 java.util.regex.Pattern 拆分方法的行为更改 在 Java 8 中,split 方法的行为可能导致 移除所返回数组开始部分的空 String False
某些语言的月名称格式的行为更改 在 Java 8 中,当使用 DateFormatSimpleDateFormat 类格式化日期时间值时,对于具有不同月份名称日期格式和独立形式的语言支持区分大小写的月份名称。 您可能看到由 DateFormatSimpleDateFormat 类格式化的字符串或由 DateFormatSymbols 类上的方法格式化的字符串中返回的月名称之间的差异。 False
大多数 Collection.removeAll 和 Collection.retainAll 实现的行为更改 在 Java 8 之前,如果集合本身为空,那么 Collection.removeAll(Collection)retainAll(Collection) 的大多数实施都返回 false 并忽略空参数。 在 Java 8 中,如果提供空值作为参数,那么集合将抛出 NullPointerException False
非公共接口的新实例创建的行为更改 在 Java 8 中,需要代码更改来使用 Proxy.getProxyClassConstructor.newInstance 方法为不同软件包中的非公共接口创建代理实例。 False
NumberFormat 和 DecimalFormat 格式化方法中的舍入行为更改 在 Java 8 中,NumberFormatDecimalFormat 格式方法的四舍五入行为已更改以与数字二进制表示法的四舍五入匹配。 False
用于零值的 BigDecimal stripTrailingZeros 方法的行为更改 Java 8 引入了当 java.math.BigDecimal stripTrailingZeros 以非零小数位对零值进行操作时的行为更改。 False
动态代理类的构造的行为更改 在 Java 8 中,调用带有 null 参数的 java.lang.reflect.Proxy(InvocationHandler) 时抛出 NullPointerException。 在 Java 8 之前,构造函数返回代理,但对该代理的任何方法调用都抛出 NullPointerException False
实现 TypeVisitor 接口的类必须实现 TypeVisitor.visitIntersection( ) 方法 此规则将检测并标记实现此接口但不实现 visitIntersection(IntersectionType t, P p) 方法的 Java 类。 任何没有 visitIntersection 方法的类,如果直接实现了这个 Java 接口,将无法编译。 False
具有 SocketAddress 的 DatagramPacket 构造函数不再抛出 SocketException 在 Java 8 中,java.net.DatagramPacket 构造函数已更改以移除SocketException 声明。 当该构造函数位于捕获 java.net.SocketException 或其超类 java.io.IOException 的 try 块中时,该规则会标记接受 java.net.SocketAddress 参数的java.net.DatagramPacket 构造函数。 False
检测已注册或实例化的 MBeans 和 MXBeans 根据 Java 8 的要求,该规则会标记非公有的 MBean 或 MXBean 接口。 它还会标记 registerMBeancreateMBean 调用,以突出界面可见性方面的潜在问题。 False
JAXP 服务提供程序的类装入差异 Java 8 包含 Java API for XML Processing (JAXP) 1.6,后者通过与先前版本不同的方式来处理服务提供程序的类装入。 False
MBean 和 MXBean 接口必须为公共接口 Java 8 强制要求 MBean 和 MXBean 管理接口为公共接口。 不允许非公共接口公开管理功能。 在 Java 7 和之前的版本中未强制实施该规范要求。 java-version-8.yml
org.openrewrite.java.migrate.MXBeanRule
java.util.concurrent.ConcurrentHashMap 中的新方法 在 Java 8 中,ConcurrentHashMap 类引入了超过 30 种新方法。 如果扩展 java.util.concurrent.ConcurrentHashMap 类,那么类可能需要更改。 False
用于选择语言环境服务提供程序的机制已更改 在 Java 8 中,用于选择语言环境服务提供程序的机制已发生更改。 LocaleServiceProvider 类中的新方法使实现能够确定是否支持给定的语言环境。 False
请勿使用 sun.io 包中的 API sun.io.* API 已在 Java SE 8 中删除。 替换或删除此 API。 False
已禁用 java.lang.Thread.stop(java.lang.Throwable) 此规则标记 java.lang.Thread.stop(java.lang.Throwable) 方法 invocations.When 如果调用此方法,现在会抛出 UnsupportedOperationException False

Java SE 7 兼容性影响

表 7. Java SE 7 兼容性影响
规则名称 规则描述 自动修复
检查空 TreeSet add 方法和空 TreeMap put 方法的行为更改 此规则会标记是否使用了 java.util.TreeSet 或 java.util.TreeMap。 根据规则的配置,将标记这些类的构造函数或 add()/put() 方法。 在 Java 7 中,为这些方法添加了新行为。 False
检查 AWT 异常处理程序的行为更改 此规则会标记字符串字面值 sun.awt.exception.handler。 在 Java 7 中,添加了一种新的异常处理机制。 False
检查 File setReadOnly、setWritable 和 canWrite 方法的行为更改 此规则会标记方法 java.io.File setReadOnly()setWritable(boolean arg)setWritable(boolean arg, boolean user)。 在 Java 7 中,为这些方法添加了新行为。 False
检查 URLConnection getInputStream 或 HttpURLConnection getInputStream 方法的行为更改 此规则会标记 URLConnectionHttpURLConnectiongetInputStream() 方法。 此方法在 Java 7 中具有新行为。 False
检查 DatagramChannel send、receive 和 connect 方法的行为更改 此规则会标记对 java.nio.channels.DatagramChannel sendreceiveconnect 方法的调用,这些方法在 Java 7 中具有新行为。 False
检查 isLowerCase 和 isUpperCase 方法的行为更改 此规则将标记 isLowerCaseisUpperCase 方法。 这些方法的行为更改影响到应用程序的可能性非常小。 False
检查 Locale getDefault 方法的行为更改 此规则将标记对 java.util.Locale getDefault() 方法的调用,因为该方法具有新行为。 False
检查 MouseEvent getButton 方法的行为更改 此规则会标记 java.awt.event.MouseEvent getButton() 方法的实例,因为该方法具有新行为。 False
检查 ThreadGroup setMaxPriority 方法的行为更改 此规则会标记 ThreadGroup 对象上的 setMaxPriority 方法。 方法行为在 JDK 7 中已发生更改。 False
检查 Toolkit getPrintJob 方法的行为更改 此规则会标记 java.awt.Toolkit getPrintJob(...) 方法的实例,因为该方法具有新行为。 False
检查 Window setBackground 方法的行为更改 此规则会标记对 java.awt.Window setBackground() 方法的调用,原因是该方法的行为已改变,会抛出新异常。 False
检查实现了 TypeVisitor 接口的类 此规则会标记用于实现 javax.lang.model.type.TypeVisitor 接口的类。 在 Java SE 7 中,已向此接口添加了新方法。 False
检查 JDBC 接口上的新方法 此规则会检测用于实现 JDBC 接口的类,这些接口已添加了新方法。 这些接口包括 java.sql.Connectionjava.sql.Driverjava.sql.Statementjavax.sql.CommonDataSource java-version-7.yml
org.openrewrite.java.migrate.JREJdbcInterfaceNewMethods
请勿定义已在 java.lang.Throwable 中声明为 final 的方法

此规则会检测用于扩展 java.lang.Throwable(可实现 addSuppressedgetSuppressed 方法)的类,这两个方法在 Java 7 中添加为新的 final 方法。

java-version-7.yml
org.openrewrite.java.migrate.JREThrowableFinalMethods
请勿覆盖 Path2D getPathIterator 方法 此规则会标记 Path2D getPathIterator 方法。 在 Java 7 中,这些方法现在标记为 final False
请勿使用已移除的 XSLTProcessorApplet 类 此规则会检测是否使用了 org.apache.xalan.client.XSLTProcessorApplet 类。 已从 JDK 7 发行版中移除了此类。 False
请勿使用 LinkedHashMap.Entry 类 此规则将标记是否使用了 java.util.LinkedHashMap.Entry 类,因为在 Java SE 7 中不能再访问该类。 False

Java SE 6 兼容性影响

表 8. Java SE 6 兼容性影响
规则名称 规则描述 自动修复
检查对 EventHandler 的调用的异常逻辑

在 Java SE 6 中,EventHandler 构造函数和 create() 方法要求传递非空参数。 此规则会标记构造函数和 create() 方法调用,以便您可以验证您的逻辑是否可以正确处理 NullPointerException。

False
检查持续时间和 XMLGregorianCalendar equals() 方法兼容性

检测是否使用了 DurationXMLGregorianCalendar equals() 方法。 如果传递的参数为空,那么 Java 6 现在返回 false。 先前会抛出 NullPointerException 异常。

False
检查 Java SQL 接口是否有新方法

java.sql.Wrapper 接口已添加为若干个 Java SQL 接口的超接口。 当您移至 Java 6 时,必须将缺少的方法添加到实现了已添加 java.sql.Wrapper 的接口的类。

java-version-6.yml
org.openrewrite.java.migrate.JREWrapperInterface
检查 FileChannel lock() 方法的 OverlappingFileLockException

在 Java SE 6 中,FileChannel.lock() 方法现在将抛出 OverlappingFileLockException。 此规则将标记该方法中没有 catch 块(对于 OverlappingFileLockException)或没有抛出声明(对于 OverlappingFileLockException)的 lock() 方法调用。

False
移除 JMX ObjectName 元素中使用的双斜杠

检测是否在 JMX ObjectNames 中使用了双斜杠字符串(“//”)。

False

Oracle 至 IBM 兼容性影响

当您要将应用程序从 Oracle Java 运行时环境迁移至 IBM Java 运行时环境时,请运行以下规则。 如果正在运行使用 Oracle Java 运行时的 Liberty 服务器,请不要对这些规则运行快速修订。

表 9。 Oracle 至 IBM 兼容性影响
规则名称 规则描述 自动修复
检测 com.sun.net.ssl.internal 包 此规则会标记不可用且不应该使用的 Java 文件中的某些 com.sun.net.ssl.internal 包的 import 语句。 False
请勿使用 com.sun.net.ssl 包中的 API 该规则检测 com.sun.net.ssl 包中的类和接口是否已被 javax.net.ssl 包中的类和接口取代。 ibm-java.yml
org.openrewrite.java.migrate.JREDoNotUseSunNetSslAPIs
请勿使用 com.sun.org.apache JAXP 内部类 此规则会标记 IBM Java 运行时环境中不可用的内部 Sun JAXP 类。 False
请勿在字符串字面值中使用 com.sun.org.apache JAXP 包名 此规则会检测用在字符串字面值中的 com.sun.org.apache JAXP 1.3 包名称。 False
请勿使用 com.sun.net.ssl.internal.ssl.Provider 类 此规则会标记是否应该将类 com.sun.net.ssl.internal.ssl.Provider 替换为 com.ibm.jsse.IBMJSSEProvider ibm-java.yml
org.openrewrite.java.migrate.JREDoNotUseSunNetSslInternalSslProvider
请勿使用 com.sun.net.ssl.internal.www.protocol.https.Handler 类 此规则会标记应由 com.ibm.net.ssl.www2.protocol.https.Handler替换的 com.sun.net.ssl.internal.www.protocol.https.Handler 类。 ibm-java.yml
org.openrewrite.java.migrate.JREDoNotUseSunNetSslInternalWwwProtocolHttpsHandler
请勿使用 com.sun.net.ssl.internal.www.protocol 包 此规则会标记应该替换为 com.ibm.net.ssl.www2.protocolcom.sun.net.ssl.internal.www.protocol 包引用。 ibm-java.yml
org.openrewrite.java.migrate.JREDoNotUseSunNetSslInternalWwwProtocol

Sun 内部 API

当您要将应用程序从 Oracle Java 运行时环境迁移至包含 IBM 类的 IBM Java 运行时环境时,请只运行以下规则。 例如,随 WebSphere Application Server 一起交付的 HP-UX 和 Solaris Java 运行时环境不含该类。 任何规则集都不自动选择此规则。

表 10. Sun 内部 API
规则名称 规则描述 自动修复
请勿使用 sun.security.x509 包中的 API 在某些操作系统上,sun.security.x509 包中的类和接口已替换为 com.ibm.security.x509 包中的类和接口。 False