本文介紹了將Java 8項目遷移到Java 11的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我們有一個使用Java 8構建的存儲庫。存儲庫中有多個REST服務。我們想要遷移到Java 11,并試圖找出實現這一目標的最佳方式。我們正在考慮一個模塊一個模塊地做。例如,將一個服務更改為Java 11,而其余服務仍為Java 8。我們不確定Maven是否支持這一點?
推薦答案
免責聲明:這不是答案,只是我最近經驗的一部分。如果您覺得此答案不符合SO標準,請隨時標記此答案。
Maven是否支持此功能?
是,使用編譯器插件3.8.0/3.8.1
但是,此遷移需要額外注意。
最近我們通過從Oracle JDK 8遷移到OpenJDK 11做了類似的事情。由于我們有大量具有不同任務的存儲庫,我們面臨著各種各樣的問題。僅引用我在我的電子郵箱中標記為[jdk11_Migration]的一些內容:
這很明顯,但我想強調的是,為了從Java 8遷移到11,我們還必須滿足Java 9和10的要求
一些maven插件,如Cobertura,不支持Java 11,我猜他們永遠不會支持它。在某些情況下,這些插件已經到了廢棄的生命周期階段。解決辦法是以案件對案件的方式尋找替代方案。例如,我們用Jacoco替換了Cobertura。
rt.jar和tools.jar已被刪除!你從他們那里得到的任何明確的東西都可能會被打破。
一些我們現在不應該在Java 9或更低版本中使用的類在Java 11中不再存在。我說的是訪問Sun.*、sun.misc等包中的類。解決方案是尋找一對一的替代方案或重構代碼以避免使用。
反射通常是最后使用的項目符號,對于這些情況,在Java 9和更高版本中,我們會收到如下警告消息:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by ...
WARNING: Please consider reporting this to the maintainers of ...
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
雖然這不是一個確切的解決方案,但是有一個標志可以消除這個警告–非法訪問=許可。在使用Surefire Maven插件時,這一點尤其重要。
Java 9引入了模塊系統,然后”現在”我們就有了包沖突的現象。例如,”可以從多個模塊訪問org.w3c.dom包:,java.xml”之類的消息。解決方案是找到冗余包含項的來源(特別是重復的maven依賴項或依賴項的依賴項)并將其刪除。
雖然這對我們來說不是問題,但我只是注意到您的存儲庫主要由REST組件組成。您可能會遇到與一些包有關的ClassNotFound問題,比如基本從Java標準版中刪除的javax.xml.ind。您可以通過在pom.xml中顯式地包含它們來修復它。
幸運的是,對于你在SO或互聯網上的遷移過程中發現的每一個問題,你都可以找到好的問題和答案。野外有一些遷徙指南,它們是很好的起點。像混淆和IDE集成這樣的特定問題可能需要一些時間,但至少在我的經驗中,這次遷移比我想象的要輕松。
這篇關于將Java 8項目遷移到Java 11的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,