作者:stphenZkang
來源:SpringForAll社區

你的Spring Boot App需要遷移到Java 11 嗎?

最近,我們開始將應用程序從Java 8遷移到Java 11;在此之前,Oracle宣佈將從2019年初開始停止爲Java 8提供商業支持。

我想限制這個主題的範圍 ,因爲我不會詳細討論Java 11及其特性,但是,我將嘗試在遷移到Java的最新版本的過程中,對遷移步驟提供一個深入的說明。

Java發佈週期

首先,我已經注意到爲什麼我們決定從Java 8遷移到Java 11。之後我們瞭解到Java 8支持將停止在2019年初結束,並將公共更新,最好是搬到最新版本的Java和演變的新特性和安全更新,然後是哪個版本的Java遷移的討論。

回顧Oracle的發佈週期,每六個月發佈一個新版本,每三年發佈一次LTS,我們認爲最好是遷移到Java 11,並對商業生產版本提供三年的長期支持


Spring Boot 應用遷移到 Java 11


商業 vs OpenJDK

在遷移之前有幾個問題:

OpenJDK

第三方公司有許多開源JDK實現,如IBM、RedHat和Azul,它們都正式支持JDK發行版。而且,Oracle支持OpenJDK,它可以在GNU通用公共許可證下免費使用。OpenJDK還有許多組件,如JVM Hotspot、JCL(Java類庫)、javac等。

有什麼新的支持嗎?商業支持嗎?

在Oracle決定遷移到一個新的破壞性版本cadence和許可之後,一個特性版本的生命週期將是6個月。六個月後的版本更新將不會提供,我們應該提供一個LTS版本三年,只能用於購買商業支持的人。

我們可以將OpenJDK用於生產環境嗎?

您可以免費在生產環境中使用OpenJDK,費用由您自己承擔。與您經常獲得更新或補丁的商業版本相比,OpenJDK的更新取決於實現者以及他們何時發佈它。

訂閱與傳統的Oracle永久授權產品(如Java SE Advanced)有何不同?

永久許可的軟件有一個預先的成本加上額外的年度支持和維護費用。訂閱以單一價格提供許可證、更新、升級和支持。您只需要爲您需要的內容和所需的時間框架付費(個人、非商業用途仍然是免費的,不需要訂閱),

使用容器平臺或雲是否會影響我?

每個用戶(桌面)或處理器(服務器和/或雲)都可以訂閱Java SE。您可以查看定價模型來準確地理解和評估影響。

甲骨文許可定價

以下是Oracle發佈的價格表。如果組織不準備按照Oracle六個月的發佈計劃頻繁更新,則應該根據這些定價模型調整預算。使用這種許可模型,在多核處理器上運行JDK可能會變得更加昂貴


Spring Boot 應用遷移到 Java 11


甲骨文產品價格的完整列表可以在這裏找到。

此外,您還可以使用使用Usage Tracker跟蹤Java使用情況。這將有助於評估您的組織對Java的使用情況,並在此基礎上決定使用許可的或免費的Java版本。

或者,您可以免費使用第三方jdk,甚至Oracle的OpenJDK版本。

Spring 對JDK11的支持

在2018年9月的某個時候,在SpringOne平臺上,宣佈了Spring Framework 5.1對Java 11的支持。Spring Framework 4.3將支持最多Java 8, 5.0將支持Java 9, 5.1將正式支持Java 11。

如果您正在使用SpringBoot,那麼從Spring Boot 2.1.X開始就支持Java 11。計劃從Spring Boot 2.2開始正式支持Java 12。我們已經從Spring Boot 1.5.x遷移應用程序到Spring Boot 2.1.1,使用Java 11編譯的代碼。這是順利的,在建設項目的一些小變化。

此外,如果您正在爲PaaS解決方案使用Pivotal或Cloud Foundry,那麼在Spring Boot 2.X.X部署的版本中還必須注意一些額外的措施。

Spring Boot 2.1使用Spring Framework 5.1,將Spring更新爲所有依賴項的穩定版本。因此,您可以在Spring Boot 2.1.1中正式使用Spring Starter並使用Java 11編譯。

此外,如果使用Maven構建源代碼,則需要將Maven編譯器插件升級到> 3.5版本。

如果您使用Gradle構建源代碼,您需要將Gradle發行版升級到5.X版本。

附加依賴項,項目變更

由於Java 11已經外部化了許多庫和依賴項,所以我們必須顯式地向POM添加一些依賴項。使用JAXB、JAX-WS、JTA、JAVAX註釋等J2EE模塊的項目應該顯式地添加依賴項和重新構建。J2EE的所有獨立版本都可以在Maven repo或第三方站點中輕鬆獲得,因此,Java SE將它們排除在外。

爲了從Spring Boot 1.5遷移,我們必須做的一些顯著更改。X to Java 11 Spring Boot 2.1項目:

如果您正在使用Eclipse IDE,請下載Eclipse photon或4.9

從市場上爲Eclipse IDE安裝Java 11插件。

將Maven的POM< java.version>更新到11,或gradle構建的項目的sourceCompatibility 更新到1.11。

使用ASM (Java字節碼庫)將Maven編譯器插件升級到3.8.0,或者下載Gradle項目的grade -5.0發行版。

對於Coverage ,從Cobertura遷移到Jacoco,因爲Cobertura不再受支持。

更新Maven Surefire插件和故障安全插件。

如果在項目中構建了單元測試(SureFire)和集成測試(FailSafe),則更新這些插件。由於Maven有不同的生命週期階段,Failsafe插件有助於在集成測試階段構建崩潰

此外,對於Maven項目,您可以在命令行上設置系統JVM選項,如“非法訪問-許可證”

由於Java中的強封裝(這使得遷移非常困難),因此自Java 9以來,默認情況下允許從類路徑上的代碼進行非法反射訪問。您可以使用更多選項來啓用反射訪問,如“permit”、“warn”、“debug”和“deny”。

Java 11支持TLS 1.3,它提供了顯著的安全性和性能改進。

類文件錯誤——任何操作字節碼的錯誤,如cglib(3.2.8)、ASM(7.0)、Byte Buddy(1.9.0)或Javassist (3.23.1-GA)。自從Java 9以來,字節碼級別每六個月增加一次,所以您必須定期更新這些庫。您可能會收到如下警告,最好將Java 11更新爲Byte Buddy。

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by j9ms.internal.JPEG (file:...) to field com.sun.imageio.plugins.jpeg.JPEG.TEM
WARNING: Please consider reporting this to the maintainers of j9ms.internal.JPEG
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
# here's the reflective access to the static field com.sun.imageio.plugins.jpeg.JPEG.TEM

模塊化:您還可以爲您的應用程序創建JRE映像。我們對應用程序進行了模塊化,從而減少了內存佔用,並在更大程度上優化了應用程序。



org.apache.maven.plugins
maven-compiler-plugin
3.8.0

11




org.ow2.asm
asm
6.2




org.apache.maven.plugins
maven-surefire-plugin


--illegal-access=permit




org.apache.maven.plugins
maven-failsafe-plugin


--illegal-access=permit




Java 11已經引入了許多特性,我希望限制這個主題的範圍,但是最好是探索、掌握這些特性,而不是爲了使用最新版本的Java而遷移。

結論

Oracle希望加快Java的開發,而應用程序開發人員也期待着頻繁的更新。爲了滿足這些需求,Oracle建議將Java轉換爲嚴格的、基於時間的發佈模式。這意味着Java仍然可以在OpenJDK的生產環境中自由使用,但是如果您使用的框架或產品不支持Java 9+,那麼它可能不是使用OpenJDK 9或更高版本的合適的、可用於生產的解決方案。

正如標題所說,我只關注於將Spring引導Maven項目遷移到Java 11。遷移中可能還有許多其他方面,比如安全性、JVM性能、證書、雲就緒程度等等。請隨意對您的發現發表評論!

附加資源

https://www.oracle.com/technetwork/java/java-se-support-roadmap.html
https://www.oracle.com/technetwork/java/javaseproducts/overview/javasesubscriptionfaq-4891443.html
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-with-Java-9-and-above
https://www.oracle.com/technetwork/java/javase/javaclientroadmapupdate2018mar-4414431.pdf
相關文章