將Spring Boot應用程序遷移到最新的Java版本

Java的發佈週期

首先,我已經注意到爲什麼我們決定從Java 8遷移到Java 11.在我們瞭解到Java 8支持將在2019年初停止並且它將是公共更新的結束之後,最好轉向最新版本。 Java版本並隨着新功能和安全更新而發展 - 然後討論了要遷移到哪個版本的Java。

我們認爲,每三個月使用LTS每六個月發佈一個新版本的Oracle發佈週期,我們認爲最好轉向使用商業生產版長期支持三年的Java 11。

下圖爲我們提供了Oracle即將發佈的Java發佈週期計劃的概述。

圖片標題

商業對比 OpenJDK的

在遷移之前出現了一些問題:

OpenJDK的

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

什麼是新的支持?商業支持?

在Oracle決定採用新的破壞性發布節奏和許可後,功能發佈版本的使用壽命爲六個月。不會提供六個月後的發佈更新,我們應該使用LTS版本三年,只能由購買商業支持的人使用。

我們可以使用OpenJDK進行生產嗎?

您可以自費使用OpenJDK進行生產。與您經常獲得頻繁更新或補丁的商業版本相比,OpenJDK更新取決於實現者以及何時發佈它們。

訂閱如何與Oracle的傳統永久許可產品不同,例如Java SE Advanced?

永久許可軟件具有前期成本以及額外的年度支持和維護費用。訂閱以單一價格提供許可,更新,升級和支持。您只需支付所需的費用以及所需的時間範圍(個人,非商業用途仍然是免費的,不需要訂閱),

如果我使用容器平臺或雲,它會影響我嗎?

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

Oracle許可證定價

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

圖片標題

可在此處找到Oracle產品的完整定價清單。 

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

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

Spring支持JDK 11

在2018年9月的某個地方,在SpringOne平臺上,宣佈了Spring Framework 5.1與Java 11的支持。Spring Framework 4.3將支持Java 8,5.0將支持Java 9,而5.1將正式支持Java 11。

如果您使用的是Spring Boot,則從SpringBoot 2.1.X開始支持Java 11。計劃是從Spring Boot 2.2開始正式支持Java 12。我們已經將我們的應用程序從Spring Boot 1.5.X遷移到Spring Boot 2.1.1,並使用在Java 11中編譯的代碼。這很順利,在構建項目時進行了微小的更改。

此外,如果您使用Pivotal或Cloud Foundry進行PaaS解決方案,則需要採取額外措施來處理要部署的Spring Boot 2.XX版本。 

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

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

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

附加依賴項,項目更改

由於Java 11已經外化了許多庫和依賴項,因此我們必須向POM明確添加一些依賴項。使用J2EE模塊(如JAXB,JAX-WS,JTA,JAVAX註釋等)的項目應顯式添加依賴項並重建。所有獨立版本的J2EE都可以在Maven倉庫或第三方站點中使用,因此Java SE已將其排除在外。

從Spring Boot 1.5.X遷移到Java 11 Spring Boot 2.1項目我們必須做的顯着改變:

  • 如果您使用的是Eclipse IDE,請下載Eclipse photon或4.9

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

  • <java.version>  在POM中爲Maven 更新   到11,或者sourceCompatibility 在build.gradle中爲Gradle項目更新  到1.11。

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

  • 對於Coverage,由於不再支持Cobertura,因此從Cobertura遷至Jacoco。

  • 更新Maven Surefire插件和Failsafe插件。

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

  • 此外,您可以在命令行上設置System JVM選項,例如<argLine>  Maven項目中的“illegal-access-permit” 

  • 由於Java中的強大封裝使遷移變得困難,因此Java 9允許從類路徑上的代碼進行非法反射訪問,因爲Java 9還有更多選項可以啓用反射訪問,例如“permit”,“warn”,“debug” ,“和”否認,“你可以探索。

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

  • 類文件錯誤 - 在字節碼上運行的任何操作,如cglib(3.2.8),ASM(7.0),Byte Buddy(1.9.0)或Javassist(3.23.1-GA)。從Java 9開始,字節碼級別每六個月增加一次,因此您必須定期更新這些庫。您可能會收到如下警告,最好更新爲Byte Buddy for Java 11。  

警告:一個 非法 反射 進入 操作 已經 發生
警告:非法 反射 訪問 的 j9ms。內部。JPEG(文件:...)到 現場 com。太陽。imageio。插件。jpeg。JPEG。TEM
警告:請 考慮 報告 這 給 了 維護者 的 j9ms。內部。JPEG
警告:使用 - 非法- 訪問= 警告 ,以 使 警告 的 進一步 非法 反射 接入 業務
警告:所有的 非法 訪問 操作 將 被 拒絕 在 一個 未來的 版本
# 這裏的與靜態磁場com.sun.imageio.plugins.jpeg.JPEG.TEM反射訪問


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

<! - 爲JAVA 11支持START  - >添加
< 插件>
  < groupId > org.apache.maven.plugins </ groupId >
  < artifactId > maven-compiler-plugin </ artifactId >
  < version > 3.8.0 </ version >
  < 配置>
  < release > 11 </ release >
  </ configuration >
  < dependencies >
  < 依賴>
    <! - 更新編譯器插件依賴於ASM for Java 11兼容性 - >
    < groupId > org.ow2.asm </ groupId >
    < artifactId > asm </ artifactId >
    < version > 6.2 </ version >
  </ dependency >
  </ dependencies >
</ plugin >
< 插件>
  < groupId > org.apache.maven.plugins </ groupId >
  < artifactId > maven-surefire-plugin </ artifactId >
  < 配置>
    < argLine >
    --illegal存取=許可證
    </ argLine >
  </ configuration >
</ plugin >
< 插件>
  < groupId > org.apache.maven.plugins </ groupId >
  < artifactId > maven-failsafe-plugin </ artifactId >
    < 配置>
    < argLine >
    --illegal存取=許可證
    </ argLine >
  </ configuration >
</ plugin >
<! - 爲JAVA 11支持END添加 - >


Java 11引入了很多功能,我想限制本主題的範圍,但是爲了使用最新版本的Java,最好是探索,親自動手,而不是遷移。 

結論

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章