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.net 或 com.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 版本的所有兼容性影响。
| 规则名称 | 规则描述 | 自动修复 |
|---|---|---|
| Java SE 21 一般信息和潜在问题 | 本规则包含有关 Java SE 21 中的更改以及 Java SE 21 之后发布的先前非 LTS(长期支持)Java 版本的信息链接。 | java-version-21.yml org.openrewrite.java.migrate.UpgradeToJava17 |
| 当输出流为 PrintStream 时,避免使用默认字符集 | 该规则标记了 java.io.PrintStream、java.io.PrintWriter 和 java.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_Profile、java.awt.image.ColorModel 和 java.awt.image.IndexColorModel 类中 finalize() 方法的使用。 |
java-version-21.yml org.openrewrite.java.migrate.DeleteDeprecatedFinalize |
| 避免使用已降级的 ThreadGroup 方法 | 该规则标记了 ThreadGroup.setDaemon、ThreadGroup.isDaemon、ThreadGroup.destroy 和 ThreadGroup.isDestroyed 方法的使用。 |
False |
Java SE 17 兼容性影响
Java 17 在 Liberty 21.0.0.10 和更高版本上受支持。 Java SE 17 兼容性影响包括从 Java SE 版本 12 到 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.Packer 和 java.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 套接字选项以及相关的 SocketFlow 和 SocketFlow.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 中的 suspend 和 resume 方法,以及 java.lang.ThreadGroup 中的 suspend、resume 和 allowThreadSuspension 方法。 在 Java SE 16 中,不推荐使用 java.lang.ThreadGroup 中的 stop、destroy、isDestroyed、setDaemon 和 isDaemon 方法。 |
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.X509Certificate、java.security.cert.X509CRL、java.security.cert.X509CertSelector 和 java.security.cert.X509CRLSelector 中的 getIssuerDN、getSubjectDN、getIssuerDN、setIssuer、setSubject、getIssuerAsString、getSubjectAsString 和 addIssuerName 方法。 |
False |
| 避免使用 java.util.logging.LogRecord 中不推荐的方法 | 在 Java SE 16 中,不推荐使用 java.util.logging.LogRecord 中的 getThreadID 和 setThreadID 方法。 |
java-version-17.yml org.openrewrite.java.migrate.DeprecatedLogRecordThreadID |
| 避免使用不推荐的原语包装程序类构造函数 | 在 Java SE 16 中,不推荐使用原语包装程序类构造函数。 | False |
| javax.security.cert 包已不推荐使用并将移除 | 在 Java SE 13 中不推荐使用 |
java-version-17.yml org.openrewrite.java.migrate.DeprecatedJavaxSecurityCert |
| Thread.countStackFrames() 方法已更改为无条件抛出 UnsupportedOperationException | 在 Java SE 14 中,最终不推荐的方法 |
java-version-17.yml org.openrewrite.java.migrate.DeprecatedCountStackFramesMethod |
| 避免使用已除去的 RMI 激活包 | 在 Java SE 15 中不推荐使用 |
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 代理程序 premain 和 agentmain 方法必须在 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。
| 规则名称 | 规则描述 | 自动修复 | |
|---|---|---|---|
| 避免使用不推荐的 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.Packer 和 Pack200.Unpacker 接口上不再定义 addPropertyChangeListener 和 removePropertyChangeListener。 |
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.BASE64Encoder 和 sun.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.runFinalizersOnExit 和 java.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.DOM 和 sun.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.NimbusLookAndFeel 和 apple.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 中,addPropertyChangeListener 和 removePropertyChangeListener 方法在 java.util.logging.LogManager 类上不可用。 |
False | |
| 请勿使用已移除的 Runtime.getLocalizedInputStream 和 Runtime.getLocalizedOutputStream 方法 | 已从 Java SE 11 中移除 Runtime.getLocalizedInputStream 和 Runtime.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.FileInputStream 和 java.io.FileOutputStream 上的 close() 方法。 |
False | |
| 运行 Java 类依赖关系分析器工具 (JDeps) | JDK 附带了一个名为 jdeps 的命令行实用程序,用于分析类依赖关系。 可使用此工具来识别 JDK 11 中不再可用的 jdk 内部包。 | False | |
| java.awt.peer 和 java.awt.dnd.peer 包不可访问 | 已从 Java 11 中移除了引用 java.awt.peer 和 java.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.Selector 和 java.nio.channels.SelectableChannel 类以在 Java SE 11 中的并发线程中安全地使用。 |
False | |
| 在 JDK 11 中已移除了 java.transaction 模块 | 此规则将标记使用 javax.transaction 模块中的包的应用程序。 |
False | |
| 在 JDK 11 中已移除了 java.xml.bind 和 java.activation 模块(定制实现) | 此规则将标记使用 java.xml.bind 或 java.activation 模块中的包并打包其自己的 JAXB 实现的应用程序。 |
ibm-java.yml org.openrewrite.java.migrate.RemovedJaxBModuleProvided |
|
| 在 JDK 11 中已移除了 java.xml.bind 和 java.activation 模块(缺省实现) | 此规则将标记使用 java.xml.bind 或 java.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 |
| 规则名称 | 规则描述 | 自动修复 |
|---|---|---|
| 在 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。
| 规则名称 | 规则描述 | 自动修复 |
|---|---|---|
| 已检测到对 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 和更高版本上受支持。
| 规则名称 | 规则描述 | 自动修复 |
|---|---|---|
| 设置 AWT 焦点遍历关键字时出现的异常的行为更改 | 在 Java 8 中,如果任何已通过的击键对象不是 AWTKeyStroke,那么 java.awt.Component setFocusTraversalKeys 和 java.awt.KeyboardFocusManager setDefaultFocusTraversalKeys 方法将抛出 ClassCastException 而不是 IllegalArgumentException。 |
False |
| java.lang.String 和 java.util.regex.Pattern 拆分方法的行为更改 | 在 Java 8 中,split 方法的行为可能导致
移除所返回数组开始部分的空 String。 |
False |
| 某些语言的月名称格式的行为更改 | 在 Java 8 中,当使用 DateFormat 和 SimpleDateFormat 类格式化日期时间值时,对于具有不同月份名称日期格式和独立形式的语言支持区分大小写的月份名称。 您可能看到由 DateFormat 或 SimpleDateFormat 类格式化的字符串或由 DateFormatSymbols 类上的方法格式化的字符串中返回的月名称之间的差异。 |
False |
| 大多数 Collection.removeAll 和 Collection.retainAll 实现的行为更改 | 在 Java 8 之前,如果集合本身为空,那么 Collection.removeAll(Collection) 和 retainAll(Collection) 的大多数实施都返回 false 并忽略空参数。 在 Java 8 中,如果提供空值作为参数,那么集合将抛出 NullPointerException。 |
False |
| 非公共接口的新实例创建的行为更改 | 在 Java 8 中,需要代码更改来使用 Proxy.getProxyClass 和 Constructor.newInstance 方法为不同软件包中的非公共接口创建代理实例。 |
False |
| NumberFormat 和 DecimalFormat 格式化方法中的舍入行为更改 | 在 Java 8 中,NumberFormat 和 DecimalFormat 格式方法的四舍五入行为已更改以与数字二进制表示法的四舍五入匹配。 |
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 接口。 它还会标记 registerMBean 或 createMBean 调用,以突出界面可见性方面的潜在问题。 |
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 兼容性影响
| 规则名称 | 规则描述 | 自动修复 |
|---|---|---|
| 检查空 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 方法的行为更改 | 此规则会标记 URLConnection 或 HttpURLConnection 的 getInputStream() 方法。 此方法在 Java 7 中具有新行为。 |
False |
| 检查 DatagramChannel send、receive 和 connect 方法的行为更改 | 此规则会标记对 java.nio.channels.DatagramChannel send、receive 和 connect 方法的调用,这些方法在 Java 7 中具有新行为。 |
False |
| 检查 isLowerCase 和 isUpperCase 方法的行为更改 | 此规则将标记 isLowerCase 和 isUpperCase 方法。 这些方法的行为更改影响到应用程序的可能性非常小。 |
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.Connection、java.sql.Driver、java.sql.Statement 和 javax.sql.CommonDataSource。 |
java-version-7.yml org.openrewrite.java.migrate.JREJdbcInterfaceNewMethods |
| 请勿定义已在 java.lang.Throwable 中声明为 final 的方法 | 此规则会检测用于扩展 java.lang.Throwable(可实现 addSuppressed 和 getSuppressed 方法)的类,这两个方法在 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 兼容性影响
| 规则名称 | 规则描述 | 自动修复 |
|---|---|---|
| 检查对 EventHandler 的调用的异常逻辑 | 在 Java SE 6 中,EventHandler 构造函数和 create() 方法要求传递非空参数。 此规则会标记构造函数和 create() 方法调用,以便您可以验证您的逻辑是否可以正确处理 NullPointerException。 |
False |
| 检查持续时间和 XMLGregorianCalendar equals() 方法兼容性 | 检测是否使用了 Duration 和 XMLGregorianCalendar 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 服务器,请不要对这些规则运行快速修订。
| 规则名称 | 规则描述 | 自动修复 |
|---|---|---|
| 检测 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.protocol 的 com.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 运行时环境不含该类。 任何规则集都不自动选择此规则。
| 规则名称 | 规则描述 | 自动修复 |
|---|---|---|
| 请勿使用 sun.security.x509 包中的 API | 在某些操作系统上,sun.security.x509 包中的类和接口已替换为 com.ibm.security.x509 包中的类和接口。 |
False |