一、前言
很久沒有關注Java的更新,從學完Java7後,進入職場時Oracle釋出Java8,但工作上也沒有進行升級,也對Java升級的版本沒有過多的關注。
後來Oracle Java針對商業用途收費的消息鬧得沸沸揚揚,公司也暫緩對Java升級,轉向使用OpenJDK。2023 年 1 月 23 日 Oracle Java SE 調升訂閱制價格,其價格是按員工數來算,費用可不便宜。
“Your company has a total employee count of 28,000 as detailed in the Employee for Java SE Universal Subscription definition below. This includes 23,000 full-time, part-time and temporary employees plus 5,000 agents, contractors and consultants. Therefore, the price would be 28,000 X $USD 6.75/month X 12 months = $USD 2,268,000/year.”
為什麼會再繼續關注更新議題呢?
因為Spring框架
Spring boot
與資安議題,Spring修復弱點進行版本更新,Spring 6.x 和 Spring Boot 3.x 版本最低要求為Java17,不得已還是得要被迫更新(小腦袋瓜)。
目錄
二、Java 8 到 17 重要的項目
(2.1) Lambda (+8)
(2.2) Stream (+8)
(2.3) Optional (+8)
(2.4) Interfaces (+8)
(2.5) 日期和時間 (+8)
(2.6) Java 型別上的註解, Type Annotations (+8)
(2.7) 靜態連結 JNI 程式庫 (+8)
(2.8) 模塊化module (+9)
(2.9) Java Shell (+9)
(2.10) HTTP/2 (+9)
(2.11) Reactive Streams (+9)
(2.12) 局部變量var類型推斷 (+10)
(2.13) Http Client (+11)
(2.14) Nest-Based Access Control (+11)
(2.15) Socket (+13, +15)
(2.16) Switch 表達式 (+14)
(2.17) 文字塊 (+15)
(2.18) 愛德華曲線數位簽章演算法EdDSA (+15)
(2.19) Hidden class
Hidden class
(+15)
(2.20) 記錄類record (+16)
(2.21) 使用 instanceof 的模式匹配 (+16)
(2.22) 打包工具 (+16)
(2.23) 密封類Sealed Classes (+17)
(2.24) 加強的偽亂數生成器 (+17)
(2.25) 反序列化過濾器Deserialization Filters (+17)
(2.26) 優化String, Files, Collect, NumberFormat, Vector (+8~+17)
三、Java 8 到 17 更動的項目
(3.1) JavaFX 不包含在 JDK 中 (-11)
- 說明: JavaFX 從 Java 11 開始不再包含在 JDK 中,成為獨立的模組。
- 原因: 為了將 JavaFX 從 JDK 中分離出來,使其可以獨立發展和更新,讓 JDK 更加精簡。
- 影響: 如果需要在 Java 11 或更新的版本中使用 JavaFX,你需要單獨下載並引入 JavaFX SDK。
- 替代方案: 可以使用 Maven 或 Gradle 等建構工具來管理 JavaFX 的依賴。
(3.2)
對於 Nimbus,請使用:
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
(10)
-
說明:
在 Java 10 中,如果你想要使用 Nimbus 外觀,必須明確設定
LookAndFeel
。 - 原因: 可能是由於 Swing 的內部結構調整或其他變更。
- 影響: 如果你的程式碼依賴 Nimbus 外觀,在 Java 10 或更新的版本中,需要明確使用這段程式碼來設定。
(3.3)
對於 Aqua 使用:
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
(10)
-
說明:
在 Java 10 中,如果你想要使用系統預設的外觀,在 macOS 上 (Aqua),需要明確使用
UIManager.getSystemLookAndFeelClassName()
來設定。 - 原因: 可能是由於 Swing 在 macOS 上的預設外觀處理方式的變更。
- 影響: 如果你的程式碼依賴系統預設外觀 (在 macOS 上),在 Java 10 或更新的版本中,需要明確使用這段程式碼來設定。
(3.4)
jdk.incubator.httpclient
->
java.net.http
(+11)
-
說明:
Java 9 引入的
jdk.incubator.httpclient
Incubator 模組,在 Java 11 中正式成為java.net.http
標準模組。 - 原因: 將孵化階段的 HTTP Client API 轉為正式的 Java SE API,讓開發者可以使用標準的 HTTP Client。
-
影響:
如果你使用了
jdk.incubator.httpclient
模組,需要將程式碼切換到java.net.http
模組。
(3.5)
java.lang.management.MemoryUsage
數值單位由 bytes 改為 kilobytes (+14)
-
說明:
Java 14 之前的
java.lang.management.MemoryUsage
所回傳的數值單位為 bytes。 - 原因: Java 14 將其單位改為 kilobytes,讓開發者可以更容易使用此數值
-
影響:
如果你有針對
java.lang.management.MemoryUsage
所回傳的數值單位做轉換,則需移除。
(3.6)
java.lang.ThreadGroup.stop
、
java.lang.Thread.stop
、
java.lang.Thread.destroy
方法已被廢棄,應改用
interrupt
方法(+11)
-
說明:
stop
和destroy
方法可能會導致死結、釋放監視器等不確定問題 - 原因: 這些方法可能會導致程式碼發生無法預期的狀況,影響程式的穩定性。
-
影響:
需要使用
interrupt
來終止執行緒。
(3.7)
sun.misc.BASE64Encoder
和
sun.misc.BASE64Decoder
更換為
java.util.Base64
(+8)
-
說明:
Java 8 新增了
java.util.Base64
用於處理 Base64 編碼與解碼 -
原因:
sun.misc
的套件是內部 API,不保證相容性,使用公開 APIjava.util.Base64
可以更穩定 -
影響:
將
sun.misc
的 API 替換為java.util.Base64
,可以避免未來潛在的兼容性問題。
(3.8)
sun.misc.Unsafe
相關API,盡量避免使用 (各版本)
-
說明:
sun.misc.Unsafe
套件中的 API 並非標準 API,不保證未來版本都能使用。 -
原因:
sun.misc
是內部 API,可能會根據 JEP 403: Strongly Encapsulate JDK Internals 被廢棄或是功能受限。 -
影響:
如果有使用到
sun.misc.Unsafe
相關API,請盡量使用其他的標準 API 來替代。
(3.9)
java.rmi
相關API,盡量避免使用 (各版本)
- 說明: RMI相關API未來可能會移除,盡量使用其他API來替代。
- 原因: 根據 JEP 407: Remove RMI Activation,RMI啟動機制被移除。
- 影響: 請盡量使用其他的遠端連線機制,如 gRPC, HTTP API 等來替代。
(3.10) Applet 相關API 已被標記為過時 (各版本)
- 說明: Applet 已被許多新技術所取代,使用頻率不高
- 原因: Applet 有安全疑慮,已被瀏覽器棄用
- 影響: 請盡量使用其他技術來取代,如 Javascript,HTML5 等
四、Java 8 到 17 被腰斬與精簡的項目
(4.1) 移除 javax.swing.UIManager.setLookAndFeel (-10)
(4.2) 移除 core-libs/java.lang➜Removal of Runtime.getLocalizedInputStream and getLocalizedOutputStream Methods(-10)
(4.3) 移除 core-libs/java.rmi➜Removal of RMI Server-Side Multiplex Protocol Support(-10)
(4.4) 移除 deploy/plugin➜Removal of Common DOM APIs (-10)
(4.5) 移除 hotspot/runtime➜Removal of FlatProfiler (-10)
(4.6) 移除 hotspot/runtime➜Removal of Obsolete -X Options(-10)
(4.7) 移除 javafx/application-lifecycle➜Removal of HostServicesgetWebContext Method(-10)
(4.8) 移除 javafx/graphics➜Removal of T2K Rasterizer and ICU Layout Engine From JavaFX(-10)
(4.9) 移除 javafx/media➜Removal of Deprecated VP6/FXM/FLV Code From JavaFX(-10)
(4.10) 移除 security-libs/java.security➜Removal of Deprecated Pre-1.2 SecurityManager Methods and Fields(-10)
(4.11) 移除 security-libs/java.security➜Removal of policytool(-10)
(4.) 移除 security-libs/javax.security➜Removal of Deprecated Classes in com.sun.security.auth.**(-10)
(4.12) 移除 tools/javadoc(tool)➜Removal of Old (JDK 6, JDK 7, and JDK 8 Era) Standard Doclet(-10)
(4.13) 移除 tools/javah➜JEP 313 Remove the Native-Header Generation Tool (javah)(-10)
(4.14) 移除 tools/launcher➜Removal of Java Launcher's Data Model Options -d32 and -d64(-10)
(4.15) 移除 client-libs➜ Removal of com.sun.awt.AWTUtilities Class(-11)
(4.16) 移除 client-libs/2d➜ Removal of Lucida Fonts from Oracle JDK(-11)
(4.17) 移除 client-libs/java.awt➜ Removal of appletviewer Launcher(-11)
(4.18) 移除 client-libs/javax.imageio➜ Oracle JDK's javax.imageio JPEG Plugin No Longer Supports Images with alpha(-11)
(4.19) 移除 core-libs➜ Removal of sun.misc.Unsafe.defineClass(-11)
(4.20) 移除 core-libs/java.lang➜ Removal of Thread.destroy() and Thread.stop(Throwable) Methods(-11)
(4.21) 移除 core-libs/java.nio➜ Removal of sun.nio.ch.disableSystemWideOverlappingFileLockCheck Property(-11)
(4.22) 移除 core-libs/java.util:i18n➜ Removal of sun.locale.formatasdefault Property(-11)
(4.23) 移除 core-svc/javax.management➜ Removal of JVM-MANAGEMENT-MIB.mib(-11)
(4.24) 移除 core-svc/tools➜ Removal of SNMP Agent(-11)
(4.25) 移除 deploy➜ Removal of Java Deployment Technologies(-11)
(4.26) 移除 infrastructure➜ Removal of JMC from the Oracle JDK(-11)
(4.27) 移除 javafx/other➜ Removal of JavaFX from the Oracle JDK(-11)
(4.28) 移除 other-libs➜ JEP 320 Remove the Java EE and CORBA Modules(-11)
****The following modules have been removed from Java SE 11 and JDK 11:
java.xml.ws (JAX-WS, plus the related technologies SAAJ and Web Services Metadata) java.xml.bind (JAXB) java.activation (JAF) java.xml.ws.annotation (Common Annotations) java.corba (CORBA) java.transaction (JTA) java.se.ee (Aggregator module for the six modules above) jdk.xml.ws (Tools for JAX-WS) jdk.xml.bind (Tools for JAXB) The following JAX-WS tools, from the module, are removed:jdk.xml.ws
wsgen wsimport The following JAXB tools, from the module, are removed:jdk.xml.bind
schemagen xjc The following CORBA tools, from the module, are removed:java.corba
idlj orbd servertool tnamesrv The compiler was updated to remove the and options. Consequently, the RMI compiler will no longer be able to generate IDL or IIOP stubs and tie classes.rmic-idl-iiop
In addition, the following system properties are no longer applicable due to the the removal of the Java EE and CORBA modules:
com.sun.xml.internal.ws.client.ContentNegotiation com.sun.xml.internal.ws.legacyWebMethod javax.xml.bind.context.factory javax.xml.bind.JAXBContext javax.xml.soap.MetaFactory javax.xml.ws.spi.Provider jaxb.fragment jaxb.noNamespaceSchemaLocation jaxb.schemaLocation jaxb.formatted.output jaxb.encoding mail.mime.decodetext.strict mail.mime.encodeeol.strict mail.mime.foldencodedwords mail.mime.foldtext mail.mime.charset saaj.mime.optimization saaj.lazy.contentlength saaj.lazy.contentlength saaj.lazy.mime.optimization For more detailed information on the removal and possible replacement for the modules, refer to JEP 320.
(4.29) 移除 client-libs/java.awt➜Removal of com.sun.awt.SecurityWarning Class(-12)
(4.30) 移除 core-libs/java.io➜Removal of finalize Methods from FileInputStream and FileOutputStream(-12)
(4.31) 移除 core-libs/java.util.jar➜Removal of finalize Method in java.util.ZipFile/Inflator/Deflator(-12)
(4.32) 移除 infrastructure/build➜Dropped the YY.M Vendor Version String from Oracle-Produced Builds(-12)
(4.33) 移除 security-libs/java.security➜Removal of GTE CyberTrust Global Root(-12)
(4.34) 移除 tools/javac➜Removal of javac Support for 6/1.6 source, target, and release Values(-12)
(4.35) 移除 client-libs➜Removal of awt.toolkit System Property(-13)
(4.36) 移除 core-libs/java.lang➜Removal of Runtime Trace Methods(-13)
(4.37) 移除 core-libs/java.net➜Pre-JDK 1.4 SocketImpl Implementations No Longer Supported(-13)
(4.38) hotspot/runtime➜Removal of VM option -XX+AggressiveOpts移除 (-13)
(4.39) security-libs➜Duplicated RSA Services No Longer Supported by SunJSSE Provider移除 (-13)
(4.40) security-libs/java.security➜Removal of T-Systems Deutsche Telekom Root CA 2 Certificate移除 (-13)
(4.41) 移除 security-libs/java.security➜Removal of Two DocuSign Root CA Certificates(-13)
(4.42) 移除 security-libs/java.security➜Removal of Two Comodo Root CA Certificates(-13)
(4.43) 移除 security-libs/javax.net.ssl➜Removal of the Internal com.sun.net.ssl Package Only Used for Compatibility with Legacy JSSE 1.0 Applications(-13)
(4.44) 移除 security-libs/javax.net.ssl➜Removal of Experimental FIPS 140 Compliant Mode from SunJSSE Provider(-13)
(4.45) 移除 tools/javadoc(tool)➜Removal of Old Features from javadoc Tool(-13)
(4.46) 移除 core-libs/java.nio.charsets➜ Removal of sun.nio.cs.map System Property(-14)
(4.47) 移除 deploy➜ Removal of netscape.javascript.JSObjectgetWindow Method(-14)
(4.48) 移除 hotspot/gc➜ JEP 363 Remove the Concurrent Mark and Sweep (CMS) Garbage Collector(-14)
(4.49) 移除 security-libs/java.security➜ Removed Deprecated java.security.acl APIs(-14)
(4.50) 移除 security-libs/java.security➜ Removal of the Default keytool -keyalg Value(-14)
(4.51) 移除 tools/jar➜ JEP 367 Remove the Pack200 Tools and API(-14)
(4.52) 移除 core-libs/java.net➜ Removal of Terminally Deprecated Solaris-specific SO_FLOW_SLA Socket Option(-15)
(4.53) 移除 core-libs/java.rmi➜ Removal of RMI Static Stub Compiler (rmic)(-15)
(4.54) 移除 core-svc/javax.management➜ Removal of Deprecated Constant RMIConnectorServer.CREDENTIAL_TYPES(-15)
(4.55) 移除 core-libs/jdk.nashorn➜ Removal of Nashorn JavaScript Engine(-15)
(4.56) 移除 hotspot/gc➜ Obsolete -XXUseAdaptiveGCBoundary(-15)
(4.57) 移除 security-libs/java.security➜ Removal of Comodo Root CA Certificate(-15)
(4.58) 移除 security-libs/java.security➜ Removal of DocuSign Root CA Certificate(-15)
(4.59) 移除 security-libs/javax.net.ssl➜ Retired the Deprecated SSLSession.getPeerCertificateChain() Method Implementation(-15)
(4.60) 移除 security-libs/javax.net.ssl➜ Removal of com.sun.net.ssl.internal.ssl.Provider Name(-15)
(4.61) 移除 client-libs/java.awt➜ Removal of java.awt.PeerFixer(-16)
(4.62) 移除 hotspot/compiler➜ Removal of Experimental Features AOT and Graal JIT(-16)
(4.63) 移除 hotspot/runtime➜ Deprecated Tracing Flags Are Obsolete and Must Be Replaced With Unified Logging Equivalents(-16)
(4.64) 移除 security-libs/java.security➜ Removed Root Certificates with 1024-bit Keys(-16)
(4.65) 移除 security-libs/javax.crypto➜ Removal of Legacy Elliptic Curves(-16)
(4.66) 移除 core-libs➜ JEP 403: Strongly Encapsulate JDK Internals(-17)
(4.67) 移除 security-libs/java.security➜ Removed Telia Company's Sonera Class2 CA Certificate(-17)
(4.68) 移除 core-libs➜ Removal of sun.misc.Unsafe::defineAnonymousClass(-17)
(4.69) 移除 core-libs/java.rmi➜ JEP 407: Remove RMI Activation(-17)
(4.70) 移除 hotspot/compiler➜ JEP 410: Remove the Experimental AOT and JIT Compiler(-17)
五、總結
依照現行Oracle Java商業考量,從每一個版本釋出訊息可以觀察到,Oracle正在精簡Java與優化性能。建議測試、孵化、預覽、廢棄等功能不使用,說不定哪一天就腰斬與移除了...。
轉移戰場至OpenJDK,目前使用 Auzl Zulu jdk 使用良好,基本的功能都有。
使用開源授權的第三方套件,如Apache, MIT, BSD 等授權,須注意是否可商用與程式碼是否強制公開等限制。
沒有留言:
張貼留言