Java SE 版本移轉

Java 程式碼複查規則集之下,Java SE 移轉種類包含從 J2SE 1.4、J2SE 5.0、Java SE 6、Java SE 7、Java SE 8 或 Java SE 11 進行移轉的規則。 Java 移轉目標是 Java SE 8、11 和 17。

Sun 至 IBM Java 相容性影響種類提供一組在 IBM Java 執行時期環境上所未提供之 Sun API 的移轉規則。 在可能的情況下,這些規則會移轉程式碼來使用 javax.netcom.ibm.net.ssl 類別。

選取的特定規則取決於先前所選供應用程式使用的來源 Java 執行時期環境及您要移轉的目標 WebSphere 版本。 對於 Liberty ,您可以選擇 Java SE 8、11 或 17 作為目標。 對於 WebSphere Traditional ,您必須移轉至 Java SE 8。

適用時,會提供快速修正程式。 沒有快速修正程式的規則會標示規則違反,以便您可以評估其使用情況,在必要之時,手動移轉程式碼。

J2SE 5.0 相容性影響

表 1. J2SE 5.0 相容性影響
規則名稱 快速修正程式 已採取的動作
檢查 JAXP API 的使用相容性

將 JRE 1.4.2 中使用的 JAXP API 用於 JRE 5 時,可能存在相容性問題。 此規則會偵測是否匯入了任何與 JAXP 相關的套件,以便您可以檢查使用情形。

檢查 JAXP EntityResolver.resolveEntity() 異常狀況相容性

現在,JAXP EntityResolver.resolveEntity(String, String) 除了會擲出 SAXException 之外,還會擲出 IOException 異常狀況。 此規則會偵測是否遺漏 IOException。

檢查新的 JAXP DOM API

已將新的 JAXP DOM API 新增至下列介面:

  • org.w3c.dom.Attr
  • org.w3c.dom.Document
  • org.w3c.dom.DOMImplementation
  • org.w3c.dom.Element
  • org.w3c.dom.Entity
  • org.w3c.dom.Node
  • org.w3c.dom.Text

此規則會偵測實作任何這些介面的類別,並且標示它們,以便可以新增介面。

檢查「Java 物件序列化」相容性

Java 1.4 與 Java 5.0 之間的序列化不一致。 此規則會偵測實作 java.io.Serializable 但不含 serialVersionUID 欄位的類別。

不要直接參照 IBMJSSEFIPS 提供者類別

IBMJSSEFIPS 提供者已併入 IBMJSSE2 支援中。 必須移除對先前提供者之類別 (com.ibm.fips.*) 的參照。

此規則會偵測是否使用了對 com.ibm.fips 套件的任何參照。

不要使用來自 com.ibm.net.ssl 套件的 API

com.ibm.net.ssl 套件中的類別和介面,已取代為 javax.net.ssl 套件中的類別和介面。 此規則會偵測是否使用了 com.ibm.net.ssl packages的任何參照。

快速修正程式會將套件名稱 com.ibm.net.ssl 變更為 javax.net.ssl

不要使用來自 sun.* 的 API。 套件

sun.* 套件中的一些 API 在 JRE 5 中已變更,並且存在與 JRE 1.4.2 的相容性問題。 這些 API 並不打算供開發者使用。 此規則會偵測是否使用了對 sun.* 套件的任何參照。

不要使用 JAXP 1.1 內部類別

內部 JAXP 類別已變更。 請勿使用下列套件中的內部類別:

  1. org.apache.crimson.*
  2. org.apache.xml.*
  3. org.apache.xalan.*
  4. org.apache.xpath.*
  5. org.apache.xalan.xsltc.*

這個規則會偵測是否使用了這些套件並予以標示。

請勿在字串文字中使用 JAXP 1.1 套件名稱

部分實作套件名稱在 JAXP 1.1 與 JAXP 1.3 之間不相同。 這個規則會偵測在字串文字中使用的 JAXP 1.1 套件名稱。

不要使用已移除的 IBMJSSE API

從 IBMJSSE 轉換到 IBMJSSE2 時,已移除兩個 JSSE 類別。 此規則會偵測是否使用 com.ibm.jsse. KeyManagerFactoryParametersSpeccom.ibm.jsse.SSLContext 的任何參照。 由於 com.ibm.net.ssl. KeyManagerFactoryParametersSpec 已移轉至 com.ibm.jsse. KeyManagerFactoryParametersSpec ,然後已從使用中移除,因此也會使用此規則來偵測 com.ibm.net.ssl. KeyManagerFactoryParametersSpec

不要使用 Java 保留字 enum

從 Java 5.0 開始,enum 是保留的 Java 類型,不能再用作變數名稱。 如果程式碼使用名為 enum 的變數,必須予以重新命名。 這個規則會偵測名為 enum 的變數和引數。

當衍生字串值時,明確使用 BigDecimal toPlainString() 方法

BigDecimal toString() 方法的行為與在較舊版本中的行為不同。 J2SE 5.0 已將 toPlainString() 新增至 BigDecimal,其行為類似於較舊版本中 toString() 方法的行為。 這個規則會偵測是否在類別中隱含使用了 toString() 方法。

使用 BigDecimal toPlainString() 方法,而不要使用 toString() 方法

BigDecimal toString() 方法的行為與在較舊版本中的行為不同。 J2SE 5.0 已將 toPlainString() 新增至 BigDecimal,其行為類似於較舊版本中 toString() 方法的行為。

快速修正程式會將 toString 變更為 toPlainString

使用 IBMJSSE2 提供者

從 IBMJSSE 轉換到 IBMJSSE2 時,使用 IBMJSSEProvider2 取代了提供者 IBMJSSEProvider 和 JSSEProvider。 此規則會偵測是否使用了對 com.ibm.jsse.IBMJSSEProvidercom.ibm.jsse.JSSEProvider 類別的任何參照。

快速修正程式會變更對 com.ibm.jsse2.IBMJSSEProvider2 的參照。

Java SE 6 相容性影響

表 2. Java SE 6 相容性影響
規則名稱 快速修正程式 已採取的動作
檢查呼叫 EventHandler 的異常狀況邏輯

在 Java SE 6 中,EventHandler 建構子和 create() 方法需要傳遞非空值參數。 這個規則會標示該建構子和 create() 方法呼叫,以便您可以驗證您的邏輯是否適當地處理 NullPointerException。

檢查 Duration 與 XMLGregorianCalendar equals() 相容性

偵測是否使用了 DurationXMLGregorianCalendar equals() 方法。 現在,如果傳遞的參數是空值,則 Java 6 會傳回 false。 以前會擲出異常狀況 NullPointerException。

檢查 Java SQL 介面的新方法

java.sql.Wrapper 介面新增至數個 Java SQL 介面中當作超介面。 當您移至 Java 6 時,對於新增 java.sql.Wrapper 的介面,必須在實作這些介面的類別中新增遺漏的方法。

檢查 FileChannel lock() 方法的 OverlappingFileLockException

在 Java SE 6 中,FileChannel.lock() 方法現在會擲出 OverlappingFileLockException。 此規則會標示方法上沒有 OverlappingFileLockException 的 catch 區塊或沒有 throws 宣告 OverlappingFileLockExceptionlock() 方法呼叫。

在 JMX ObjectName 元素中不再使用雙斜線

偵測是否在 JMX ObjectNames 中使用了雙斜線字串 ("//")。

Java SE 7 相容性影響

表 3. Java SE 7 相容性影響
規則名稱 快速修正程式 已採取的動作
檢查空白的 TreeSet add 和 TreeMap put 方法的行為變更 此規則會標示 java.util.TreeSet 或 java.util.TreeMap 的使用情形。 根據規則的配置,將會標示這些類別的建構子或 add()/put() 方法。 在 Java 7 中,新增了這些方法的新行為。
檢查 AWT 異常狀況處理程式的行為變更 此規則會標示字串文字 sun.awt.exception.handler。 在 Java 7 中,新增了一個新的異常狀況處理機制。
檢查 File setReadOnly、setWritable 和 canWrite 方法的行為變更 此規則會標示 java.io.File setReadOnly()setWritable(boolean arg)setWritable(boolean arg, boolean user)方法。 在 Java 7 中,新增了這些方法的新行為。
檢查 URLConnection getInputStream、HttpURLConnection getInputStream 方法的行為變更 此規則會標示 URLConnectionHttpURLConnectiongetInputStream() 方法。 在 Java 7 中,此方法有新的行為。
檢查 DatagramChannel send、receive 和 connect 方法的行為變更 此規則會標示在 Java 7 中有新行為的 java.nio.channels.DatagramChannel sendreceiveconnect 方法呼叫。
檢查 isLowerCase 和 isUpperCase 方法的行為變更 此規則會標示 isLowerCaseisUpperCase 方法。 這些方法的行為變更有可能影響您的應用程式,不過,機會很小。
檢查 Locale getDefault 方法的行為變更 這個規則會標示 java.util.Locale getDefault() 方法呼叫,因為它有新的行為。
檢查 MouseEvent getButton 方法的行為變更 這個規則會標示 java.awt.event.MouseEvent getButton() 方法的實例,因為它有新的行為。
檢查 ThreadGroup setMaxPriority 方法的行為變更 此規則會標示 ThreadGroup 物件的 setMaxPriority 方法。 在 JDK 7 中,方法行為有了改變。
檢查 Toolkit getPrintJob 方法的行為變更 這個規則會標示 java.awt.Toolkit getPrintJob(...) 方法的實例,因為它有新的行為。
檢查 Window setBackground 方法的行為變更 這個規則會標示 java.awt.Window setBackground() 方法呼叫,因為它的行為已變更,它會擲出新的異常狀況。
檢查實作 TypeVisitor 介面的類別 此規則會標示實作 javax.lang.model.type.TypeVisitor 介面的類別。 在 Java SE 7 中,此介面新增了一個新方法。
檢查 JDBC 介面的新方法 此規則會偵測所實作的 JDBC 介面新增了一些新方法的類別。 此介面包括 java.sql.Connectionjava.sql.Driverjava.sql.Statementjavax.sql.CommonDataSource
請勿定義在 java.lang.Throwable 中宣告為 final 的方法

此規則會偵測延伸 java.lang.Throwable 的類別,這些會實作在 Java 7 中新增為 final 方法的 addSuppressedgetSuppressed 方法。

請勿置換 Path2D getPathIterator 方法 此規則會標示 Path2D getPathIterator 方法。 在 Java 7 中,這些方法現在標示為 final
不要使用已移除的 XSLTProcessorApplet 類別 此規則會偵測使用了 org.apache.xalan.client.XSLTProcessorApplet 類別的情況。 從 JDK 第 7 版開始,已移除此類別。
不要使用 LinkedHashMap.Entry 類別 此規則會標示使用 java.util.LinkedHashMap.Entry 類別,因為它在 Java SE 7 中再也無法存取。

Java SE 8 相容性影響

Liberty 及 WebSphere Application Server Traditional 8.5.5.9 版以及更新版本支援 Java 8。

表 4. Java SE 8 相容性影響
規則名稱 快速修正程式 已採取的動作
當設定 AWT 焦點遍訪鍵時所擲出異常狀況中的行為變更 在 Java 8,java.awt.Component setFocusTraversalKeysjava.awt.KeyboardFocusManager setDefaultFocusTraversalKeys 方法,如果有任何傳遞的按鍵物件不是 AWTKeyStroke,會擲出 ClassCastException,而不是 IllegalArgumentException
java.lang.String 和 java.util.regex.Pattern 分割方法中的行為變更 在 Java 8 中,split 方法的行為可能會導致移除傳回陣列開頭存在的空白 String
部分語言的月份名稱格式化中的行為變更 在 Java 8,使用 DateFormatSimpleDateFormat 類別來格式化日期-時間值時,對於具有日期格式不同和獨立式月份名稱形式的語言,支援環境定義相關的月份名稱。 您可能會在 DateFormatSimpleDateFormat 類別,或是 DateFormatSymbols 類別的方法以字串格式傳回的月份名稱發現差異。
大部分 Collection.removeAll 和 Collection.retainAll 實作中的行為變更 在 Java 8 之前,大部分的 Collection.removeAll(Collection)retainAll(Collection) 實作方式,如果集合本身是空的,會傳回 false 並且會忽略空值參數。 在 Java 8,如果提供空值參數,集合會擲出 NullPointerException
建立非公用介面的新實例時的行為變更 在 Java 8,使用 Proxy.getProxyClassConstructor.newInstance 方法對位在不同套件中的非公開介面建立 Proxy 實例的程式碼必須變更。
NumberFormat 和 DecimalFormat 格式方法中四捨五入的行為變更 在 Java 8 中,NumberFormatDecimalFormat 格式方法的捨去進位行為,變更為符合數值二進位表示法的捨去進位。
BigDecimal stripTrailingZeros 方法中對於零值的行為變更 java.math.BigDecimal stripTrailingZeros 在具有非零小數位數的零值上運作時, Java 8 會引進行為變更。
建構動態 Proxy 類別時的行為變更 在 Java 8,使用 null 參數呼叫 java.lang.reflect.Proxy(InvocationHandler) 會擲出 NullPointerException。 在 Java 8 之前,建構子會傳回 Proxy,但是對該 Proxy 的任何方法呼叫都會擲出 NullPointerException
檢查實作 TypeVisitor 介面的類別 Java 8 在 javax.lang.model.type.TypeVisitor 介面新增了方法。 此規則會標示實作這個介面的類別。
具有 SocketAddress 的 DatagramPacket 建構子不再宣告 SocketException 在 Java 8,java.net.DatagramPacket 建構子已變更為移除 SocketException 宣告。 當接受 java.net.SocketAddress 引數的 java.net.DatagramPacket 建構子位在捕捉 java.net.SocketException 或其超類別 java.io.IOException 的 try 區塊內時,此規則會標示此建構子。
JAXP 服務提供者的類別載入差異 Java 8 包含 Java API for XML Processing (JAXP) 1.6,以不同於舊版的方式處理服務提供者的類別載入。
java.lang.Thread stop(java.lang.Throwable) 已停用 在 Java 8,java.lang.Thread.stop(java.lang.Throwable) 方法已停用。
MBean 和 MXBean 介面必須為公用 Java 8 強制規定 MBean 和 MXBean 管理介面必須為公用。 不容許非公用介面公開管理功能。 在 Java 7 和更舊的版本中未強制此規格需求。
java.util.concurrent.ConcurrentHashMap 中的新方法 在 Java 8,ConcurrentHashMap 類別引進了超過 30 個新方法。 如果您延伸 java.util.concurrent.ConcurrentHashMap 類別,您的類別可能需要變更。
語言環境服務提供者的選擇機制已變更 在 Java 8 中,語言環境服務提供者的選擇機制已變更。 LocaleServiceProvider 類別中的新方法容許實作判斷是否支援給定的語言環境。

Java SE 11 相容性影響

Java 11 受 Liberty 19.0.0.1 版以及更新版本支援。

表 5. Java SE 11 相容性影響
規則名稱 快速修正程式 已採取的動作
避免使用已淘汰的 RMIIIOPServerImpl 類別 此規則會標示是否使用 RMIIIOPServerImpl 類別。 此類別在 Java SE 11 中已淘汰。
預設語言環境資料中的行為變更 The Unicode Consortium 的「共用語言環境資料儲存庫 (CLDR)」在 Java 11 中已啟用為預設語言環境資料。 在舊版中,預設值為 JRE,也就是現在的 COMPAT。 使用日期、時間和數字格式等可區分語言環境之服務的程式碼,可使用 CLDR 語言環境資料產生不同結果。
呼叫 Class.getAnnotation() 方法時異常狀況中的行為變更 在 Java 11 中,如果註釋的陣列值所參照的類別遺漏,則 java.lang.Class.getAnnotation() 方法會擲出 java.lang.TypeNotPresentException,而不是 java.lang.ArrayStoreException
java.util.concurrent.ThreadPoolExecutor中的行為變更。 finalize () 方法 在 Java 11 中,java.util.concurrent.ThreadPoolExecutor.finalize() 方法不再關閉執行緒儲存區。
java.lang.invoke.MethodHandles中的行為變更。 filterArguments 方法 此規則會標示使用 java.lang.invoke.MethodHandles.filterArguments 方法的應用程式。
javax.management.MBeanOperationInfo 建構子中的行為變更 如果提供的影響不是 INFO、ACTION、ACTION_INFO 或 UNKNOWN 的其中一個,則此規則會標示使用 javax.management.MBeanOperationInfo 建構子的應用程式。
具有原始類型的 java.xml API 方法的行為變更 在 Java 11 中,包含具有原始類型的方法宣告的 java.xml API 已更新以添加類型參數。
檢查 Selector select 和 selectNow 方法的行為變更 此規則會標示 java.nio.channels.Selector.select()java.nio.channels.Selector.selectNow() 方法。 在 JDK 11 中,方法行為已變更。
檢查與 I/O 通道的區塊傳輸及非區塊傳輸程式碼路徑的分隔相關的行為變更 在 Java 11 中,已為 I/O 通道建立個別區塊傳輸和非區塊傳輸程式碼路徑,以提升效能及可靠性。 此規則會標示行為變更可能影響的 API 呼叫。
檢查與以下類別相關的配置變更:com.ibm.security.auth.module. Krb5LoginModule 類別 此規則會標示對與移轉至 Java 11 時可能需要配置變更的類別相關的 com.ibm.security.auth.module.Krb5LoginModule 的任何參照。
檢查 Pack200.Packer 和 Pack200.Unpacker 介面上已移除的方法 Java 11 上的 Pack200.PackerPack200.Unpacker 介面不再定義 addPropertyChangeListenerremovePropertyChangeListener
不要使用來自 com.sun.image.codec.jpeg 套件的 API com.sun.image.codec.jpeg API 在 Java SE 11 中不可用。
不要使用來自 com.sun.xml.internal.bind.* 的 API 套件 com.sun.xml.internal.bind.* 套件中的 API 在 Java SE 11 中不再使用。
不要使用來自 sun.* 的 API 套件 sun.* API 是不受支援的 JDK 內部 API,隨時都可能消失。
不要使用 javax.security.auth.Policy 類別 javax.security.auth.Policy 類別在 Java SE 11 中不可用。 此規則會標示對 javax.security.auth.Policy 類別的任何參照。
不要使用已移除的 com.sun 類別 此規則會標示 Java SE 11 中不可用的 com.sun 類別。
不要使用已移除的 runFinalizersOnExit 方法 java.lang.Runtime.runFinalizersOnExitjava.lang.System.runFinalizersOnExit 方法已從 Java SE 11 中移除。
不要使用 com.ibm.security.auth.module. Krb5LoginModule 類別 com.ibm.security.auth.module.Krb5LoginModule 類別在 Java SE 11 中不可用。
不要使用 com.sun.xml.internal.bind.v2. ContextFactory 類別 com.sun.xml.internal.bind.v2.ContextFactory 在 Java SE 11 中不再可用。
不要使用 getPeer 方法 Java SE API 中從 java.awt.peer 套件傳回類別的所有方法已從 Java 11 中移除。 若要查看是否已設定同層級,請使用 Component.isDisplayable() 方法。 若要測試元件是否為輕量型元件,請使用 Component.isLightWeight() 方法。
不要使用 java.lang.ref.Reference 複製方法 java.lang.ref.Reference 複製方法在 Java 11 中不再使用。
不要使用 netdoc URL 通訊協定 Java 11 中已移除 netdoc 通訊協定處理程式。
不要使用已移除的 com.sun.java.browser.plugin2.DOM 和 sun.plugin.dom.DOMObject API com.sun.java.browser.plugin2.DOMsun.plugin.dom.DOMObject API 在 Java SE 11 中不可用。
不要使用已移除的 com.sun.java.swing.plf.nimbus. NimbusLookAndFeel 或 apple.laf.AquaLookAndFeel Swing LookAndFeel com.sun.java.swing.plaf.nimbus.NimbusLookAndFeelapple.laf.AquaLookAndFeel Swing LookAndFeels 不再受 Java SE 11 中的 javax.swing.UIManager.setLookAndFeel 方法支援。
不要使用已移除的 java.lang.Thread.destroy() 或 java.lang.Thread.stop(java.lang.Throwable) 方法 java.lang.Thread.destroy()java.lang.Thread.stop(java.lang.Throwable) 方法已在 Java SE 11 中移除。
請勿使用已移除的 javax.crypto.ExemptionMechanism。 finalize () 方法 javax.crypto.ExemptionMechanism.finalize() 方法已從 Java SE 11 中移除。
不要使用已移除的 jdk.Exported 註釋 jdk.Exported 註釋在 Java SE 11 中不可用。
不要使用 LogManager 中已移除的 addPropertyChangeListener 或 removePropertyChangeListener 方法 addPropertyChangeListenerremovePropertyChangeListener 方法在 Java 11 中的 java.util.logging.LogManager 類別上不可用。
不要使用已移除的 Runtime.getLocalizedInputStream 和 Runtime.getLocalizedOutputStream 方法 Runtime.getLocalizedInputStreamRuntime.getLocalizedOutputStream 方法已從 Java SE 11 中移除。
不要使用 SecurityManager 已移除的方法 此規則會標示已從 Java SE 11 的 java.lang.SecurityManager 類別中移除的方法。
Java 11 版本號碼格式變更 Java 11 標示新版本號碼命名慣例的開頭。 版本號碼格式已從 1.8 (Java 8) 變更為 11 (Java 11)。
檢閱 FileInputStream 和 FileOutputStream 置換的關閉方法的資源清理 此規則會標示 java.io.FileInputStreamjava.io.FileOutputStream 子類別上的 close() 方法。
執行 Java 類別相依關係分析器工具 (JDeps) JDK 隨附稱為 jdeps 的指令行公用程式,它用於分析類別相依關係。 此工具可用於識別 JDK 11 中不再可用的 jdk 內部套件。
java.awt.peer 和 java.awt.dnd.peer 套件無法存取 Java SE API 中對 java.awt.peerjava.awt.dnd.peer 套件中所定義類型進行參照的所有方法都已從 Java 11 中移除。 如果程式碼呼叫先前接受或傳回這些套件中所定義之類型的方法,就不再在 Java 11 中編譯或執行。
java.nio.channels.DatagramChannel.send() 方法會擲出 AlreadyConnectedException,而不是 IllegalArgumentException 當位址傳遞至 java.nio.channels.DatagramChannel時。 send (ByteBuffer,SocketAddress) 方法與連接位址不同,此方法會在 Java SE 11 中擲出 AlreadyConnectedException 而非 IllegalArgumentException
java.nio.channels.Selector 和 java.nio.channels.SeletableChannel 類別可以安全地用在並行執行緒中 java.nio.channels.Selectorjava.nio.channels.SelectableChannel 類別已更新,可以在 Java SE 11 的並行執行緒中安全使用。
java.transaction 模組已從 JDK 11 中移除 此規則會標示使用 javax.transaction 模組中套件的應用程式。
java.xml.bind 和 java.activation 模組已從 JDK 11 中移除(自訂實作) 此規則會標示使用 java.xml.bindjava.activation 模組中套件並包裝專屬 JAXB 實作的應用程式。
java.xml.bind 和 java.activation 模組已從 JDK 11 中移除(預設實作) 此規則會標示使用 java.xml.bindjava.activation 模組中套件並使用 WebSphere 預設 JAXB 實作的應用程式。
JavaFX 模組已從 JDK 11 中移除 JavaFX 模組在 Java SE 11 中不可用。
陣列包含空值元素時,URLClassLoader 建構子及 newInstance() 呼叫會擲出 NullPointerException 在 Java SE 11 中,如果 URL 陣列包含空值元素,則 URLClassLoader 建構子和 newInstance() 呼叫會擲出 NullPointerException
Java Web Start 技術已從 JDK 11 中移除 Java Web Start 技術在 JDK 11 中不可用。 此規則會在應用程式中標示 jnlp 檔案。
ForkJoinPool 一般儲存區類別載入器的行為變更 此規則會標示其行為可能取決於應用程式的執行緒環境定義類別載入器傳播的方法。

表 6. Java SE 11 相容性影響(非 Liberty Core)
規則名稱 快速修正程式 已採取的動作
java.corba 模組已從 JDK 11 中移除 此規則會標示使用 java.corba 模組中套件的應用程式。
java.xml.ws 模組已從 JDK 11 中移除(自訂實作) 此規則會標示使用 java.xml.ws 模組中套件並包裝專屬 JAX-WS 實作的應用程式。
java.xml.ws 模組已從 JDK 11 中移除(預設實作) 此規則會標示使用 java.xml.ws 模組中套件並使用 WebSphere 預設 JAX-WS 實作的應用程式。

Java 11 中已移除 IBM XML 實作。 如需相關資訊,請參閱 判斷應用程式相容性 :XML

表 7. Java SE 11 IBM XML 實作相容性影響
規則名稱 快速修正程式 已採取的動作
偵測到 IBM XML 實作的內部套件的相依關係 此規則會標示對 IBM XML 內部套件的參照。
偵測到對 IBM XML 實作特定配置參數的字串文字參照 此規則會標示對 IBM XML 實作特定配置參數的字串文字參照。
偵測到對 IBM XML 實作內部的字串文字參照 此規則會標示對 IBM XML 實作的字串文字參照。

Java SE 17 相容性影響

在 Liberty 21.0.0.10 以及更新版本上,支援 Java 17。 Java SE 17 相容性影響包括 Java SE 12 至 17 版的所有相容性影響。

表 8. Java SE 17 相容性影響
規則名稱 快速修正程式 已採取的動作
非相容 XML 文件的 Properties.loadFromXML 方法的行為變更 此規則會標示 java.util.Properties.loadFromXML​(java.io.InputStream) 方法呼叫。 在 Java SE 12 中,該方法會針對不相符的 XML 文件擲出異常狀況。
user.timezone 系統內容的行為變更 此規則會標示具有 user.timezone 內容值的 System.getProperty 方法呼叫。 在 Java SE 12 中,該方法可能會傳回空值。
不要使用已移除的 FileInputStream.finalize() 和 FileOutputStream.finalize() 方法 java.io.FileInputStream.finalize()java.io.FileOutputStream.finalize() 方法已從 Java SE 12 中移除。
不要使用 com.sun.awt.SecurityWarning 類別 com.sun.awt.SecurityWarning 類別已從 Java SE 12 中移除。
不要使用已移除的 ZipFile.finalize()、Inflater.finalize() 和 Deflater.finalize() 方法 java.util.zip.ZipFile.finalize()java.util.zip.Inflater.finalize()java.util.zip.Deflater.finalize() 方法已從 Java SE 12 中移除。
不要使用已移除的 Runtime.traceInstructions(boolean) 和 Runtime.traceMethodCalls(boolean) 方法 已從 Java SE 13 中移除了 java.lang.Runtime.traceInstructions(boolean)java.lang.Runtime.traceMethodCalls(boolean) 方法。
java.util.jar.Pack200 API 已移除 java.util.jar.Pack200 類別及其 java.util.jar.Pack200.Packerjava.util.jar.Pack200.Unpacker 介面已移除。
sun.nio.cs.map 系統內容已移除 sun.nio.cs.map 系統內容已在 Java SE 14 中移除。 此規則會標示對 "sun.nio.cs.map" 的字串文字參照。
java.security.acl 套件已移除 java.security.acl 套件已在 Java SE 14 中移除,而且應該改用 java.security.Policy 類別。
已移除弱具名曲線 在 Java SE 16 中,已從 SunEC 提供者移除弱具名曲線。 此規則會標示對任何弱命名曲線的參照。
檢查新的 java.lang.Record 類別是否存在名稱空間衝突問題 在 Java SE 14 中新增了 java.lang.Record 類別。 若要避免名稱空間衝突,請確保任何名為 "Record" 的其他類別都使用單一類型匯入(例如:"com.foo.Record")進行匯入,而不是使用萬用字元匯入(例如:"com.foo.*")進行匯入。
netscape.javascript.JSObject.getWindow(Applet) 方法已移除 netscape.javascript.JSObject.getWindow(Applet) 方法已在 Java SE 14 中移除。 由於方法僅適用於 Java 外掛程式(亦已移除),因此這個方法沒有取代方法。
檢查 DatagramPacket.getPort() 方法的行為變更 在 Java SE 15 中,DatagramPacket.getPort() 方法的預設回覆值已從 -1 變更為 0。
RMIConnectorServer.CREDENTIAL_TYPES 常數已移除 在 Java SE 15 中已移除 RMIConnectorServer.CREDENTIAL_TYPES 常數。
SSLSession.getPeerCertificateChain() 方法實作已移除 在 Java SE 15 中已移除預設 SSLSession.getPeerCertificateChain() 方法實作。
Modifier() 及 ConstantBootstraps() 建構子已移除 在 Java SE 15 中已移除 Modifier()ConstantBootstraps() 建構子。
SO_FLOW_SLA Solaris Socket 選項已移除 在 Java SE 15 中已移除 SO_FLOW_SLA Solaris Socket 選項及相關的 SocketFlowSocketFlow.Status 類別。
com.sun.net.ssl.internal.ssl.Provider 提供者名稱已移除 在 Java SE 15 中已移除 com.sun.net.ssl.internal.ssl.Provider 舊式 SunJSSE 提供者名稱。 它應取代為 SunJSSE 提供者名稱。
檢查 java.lang.CharSequence 介面上的 isEmpty() 預設方法 在 Java SE 15 中, java.lang.CharSequence 介面已新增預設 isEmpty() 方法。 可能需要更新實作 java.lang.CharSequence 的類別以及用於定義預設 isEmpty() 方法的另一個介面。
Java SE 17 一般資訊及潛在問題 此工具未偵測到的 Java SE 17 變更及潛在移轉問題的一般資訊。
已移除 ToolProvider() 建構子 在 Java SE 16 中,已移除 ToolProvider 建構子。
避免在 java.lang.Thread 和 java.lang.ThreadGroup 中使用已淘汰的方法 在 Java SE 14 中,已淘汰 java.lang.Thread 內的 suspendresume 方法,以及 java.lang.ThreadGroup 內的 suspendresumeallowThreadSuspension 方法。 在 Java SE 16 中,已淘汰 java.lang.ThreadGroup 內的 stopdestroyisDestroyedsetDaemonisDaemon 方法。
檢查 java.util.stream.Stream 介面上的 toList() 預設方法 在 Java SE 16 中,已將預設 toList() 方法新增至 java.util.stream.Stream 介面。 可能需要更新實作 java.util.stream.Stream 的類別以及用於定義預設 toList() 方法的另一個介面。
檢查 HttpPrincipal.getName()方法上的行為變更 在 Java SE 16 中,HttpPrincipal.getName() 方法傳回的值已變更。
檢查 java.io.LineNumberReader 類別中的行為變更 在 Java SE 16 中,java.io.LineNumberReader 類別中的行終止符號定義已變更。
避免使用已淘汰的 java.security.cert API 在 Java SE 16 中,已淘汰 java.security.cert.X509Certificatejava.security.cert.X509CRLjava.security.cert.X509CertSelectorjava.security.cert.X509CRLSelector 內的 getIssuerDNgetSubjectDNgetIssuerDNsetIssuersetSubjectgetIssuerAsStringgetSubjectAsStringaddIssuerName 方法。
檢查 HttpClient.newHttpClient 和 HttpClient.Builder.build 中的行為變更 如果沒有足夠的基礎資源,則實例化 java.net.http.HttpClient 可能會擲出 UncheckedIOException
避免在 java.util.logging.LogRecord 中使用已淘汰的方法 在 Java SE 16 中,已淘汰 java.util.logging.LogRecord 內的 getThreadIDsetThreadID 方法。
避免使用已淘汰的基本封套類別建構子 基本封套類別建構子在 Java SE 16 中已淘汰。
避免在任何值型類別上使用同步化 不建議在 Java SE 16 中的所有值型類別的實例上進行同步化。
javax.security.cert 套件已淘汰,並標示為移除

javax.security.cert 在 Java SE 13 中已淘汰,並標示為移除。 此套件中的類別不應再使用。 java.security.cert 套件包含適用的取代項目。

Thread.countStackFrames() 方法已變更為無條件擲出 UnsupportedOperationException

在 Java SE 14 中最終淘汰的方法 Thread.countStackFrames() 已變更為無條件地擲出 UnsupportedOperationException

避免使用已移除的 RMI 啟動套件

java.rmi.activation 套件已在 Java SE 15 中淘汰并已在 Java SE 17 中刪除。

Socket 實作 Factory 機制已淘汰 在 Java SE 17 中,用來設定全系統 Socket 實作 Factory 的下列方法已淘汰: static void ServerSocket.setSocketFactory(SocketImplFactory fac)static void Socket.setSocketImplFactory(SocketImplFactory fac)static void DatagramSocket.setDatagramSocketImplFactory(DatagramSocketImplFactory fac)
檢查正規表示式型樣比對中的行為變更 在 Java SE 17 中,使用交互的部分正規表示式的型樣比對行為已變更。
已從 sun.misc.Unsafe 中移除 defineAnonymousClass 方法 sun.misc.Unsafe 中的 defineAnonymousClass 方法已在 Java SE 17 中移除。
檢查 Java 代理程式中的行為變更 Java 代理程式 premainagentmain 方法必須在 Java SE 17 中公開。
Applet API 已淘汰,並標示為移除 在 Java SE 17 中,Appleet API 已淘汰并標示為移除。
使用 SHA-1 演算法簽署的 JAR 現在受到限制 在 Java SE 17 中,依預設,現在會限制使用 SHA-1 演算法簽署的 JAR,如同它們未簽署一樣。
在 Java SE 17 中,遠端 EJB 呼叫可能會失敗 在 Java SE 17 中,由於更嚴格的模組存取強制執行,遠端 EJB 呼叫可能會失敗。

Oracle 至 IBM 相容性影響

請在應用程式從 Oracle Java 執行時期環境移轉至 IBM Java 執行時期環境時,執行下列規則。 如果您正在利用 Oracle Java 執行時期來執行 Liberty 伺服器,請勿執行這些規則的快速修正程式。

表 9. Oracle 至 IBM 相容性影響
規則名稱 快速修正程式 已採取的動作
偵測 com.sun.net.ssl.internal 套件 此規則會標示 Java 檔中所未提供且不應使用的特定 com.sun.net.ssl.internal 套件的 import 陳述式。
不要使用來自 com.sun.net.ssl 套件的 API 此規則會偵測 javax.net.ssl 套件中,已被 >com.sun.net.ssl 套件中的類別和介面取代的類別和介面。
不要使用 com.sun.org.apache JAXP 內部類別 此規則會標示 IBM Java 執行時期環境中所未提供的內部 Sun JAXP 類別。
請勿在字串文字中使用 com.sun.org.apache JAXP 套件名稱 此規則會偵測字串文字中所用的 com.sun.org.apache JAXP 1.3 套件名稱。
不要使用 com.sun.net.ssl.internal.ssl.Provider 類別 此規則會標示 com.ibm.jsse.IBMJSSEProvider 所應取代的 com.sun.net.ssl.internal.ssl.Provider 類別。
不要使用 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 類別。
不要使用 com.sun.net.ssl.internal.www.protocol 套件 此規則會標示應該由 com.ibm.net.ssl.www2.protocol 取代的 com.sun.net.ssl.internal.www.protocol 套裝參照。

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 套件中的類別和介面取代。