如何從 Java 8 遷移到 Java 17
來源:Medium 使用此出版物,您可以輕鬆地從 Java 8 升級到 Java 17。Java 的每個新版本,尤其是長期支援 (LTS) 版本,都為開發人員提供了許多新功能和功能,消除了以前發現的錯誤並提高效能。但到目前為止,儘管 Java 17 發布已近一年,但該語言最受歡迎的版本仍然是 Java 8。許多人對升級猶豫不決,認為新版本的 Java 與以前的版本不完全兼容,並且升級到它需要付出很多努力。個人認為有必要升級。我已經在使用 Java 17,儘管升級時確實遇到了一些問題。此外,值得考慮的是Java 8早已不再是免費服務。Java 17 效能好得多。例如,透過使用 ZGC,您不再需要擔心配置垃圾收集設定。如果您想從 Java 8 遷移到 Java 17,則必須做一些額外的工作。由於我已經走了這條路,所以我可以分享我遷移到新版本的經驗。更新Maven編譯器插件的版本
對於某些開發人員來說,Maven編譯器插件的版本可能太舊。如果您想使用 Java 17,Maven 編譯器外掛程式版本必須至少為 3.5.4。
<插件> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <版本>3.8.1</版本> <設定> <來源>17</來源> <目標>17</目標> </配置> </插件>
更新依賴項
從 Java 8 升級到 Java 17 的第一步是更新相依性。由於您最初使用的依賴項可能根本不支援 Java 17,因此如果您想最大程度地減少版本升級的影響,則必須更新它。否則,您可能會遇到許多問題。1.例如Lombok會導致編譯錯誤。錯誤訊息如下:
無法在專案encloud-common 上執行目標org.apache.maven.plugins:maven-compiler-plugin:3.2:compile (default-compile):致命錯誤編譯:java.lang.ExceptionInInitializerError:無法將欄位設為私有com. sun .tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs 可存取:模組 jdk.compiler 不會「開啟 com.sun.toolcess.javac.procestoolcess.
由於 Lombok 在編譯時注入生成的程式碼並使用com.sun.tools.javac.*套件 中的類,因此您需要將 Lombok 更新到最新版本。這將解決問題。2.zookeeper連線會拋出UnresolvedAddressException錯誤,錯誤訊息如下:
org.apache.zookeeper.ClientCnxn - 伺服器10.0.*.*/<unresolved>:2181 的會話0x0,意外錯誤,關閉套接字連接並嘗試重新連接java.nio.channels.UnresolvedAddressException:sun.nio.ch 處的 null. Net .checkAddress(Net.java:149) ~[?:?] 在sun.nio.ch.Net.checkAddress(Net.java:157) ~[?:?] 在sun.nio.ch.SocketChannelImpl .checkRemote( SocketChannelImpl .java:816) ~[?:?] 在sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:839) ~[?:?] 在org。 .java: 277 ) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03] 在org.apache.zookeeper.ClientCnxnwet. -3.4.13.jar:3 . 4. 13-2d71af4dbe22557fda74f9a9b4309b15a7487f03 ] 在org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1021) ~[231325.3251325.30021).413. fda74f9a9b4309b15a7487f03] 在org.apache.zookeeper.ClientCnxn$ SendThread.run(ClientCn xn .java:1064) [zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03]
錯誤的原因是在Java 15中重構了InetSocketAddressHolder的toString方法。如果您使用的是 Maven,則可以使用mvn versions:display-dependency-updates指令檢查依賴項更新。結果將如下所示:
新增依賴項
如果使用 JAXB 編譯,您將收到錯誤。這是因為 JAXB 已從 Java 11 中刪除。因此您需要新增一些 JAXB Maven 相依性。
<依賴項> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <版本>2.3.0</版本> </依賴項> <依賴項> <groupId>com. sun.xml .bind</groupId> <artifactId>jaxb-core</artifactId> <版本>2.3.0</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId> jaxb-impl</artifactId> <版本>2.3.0</版本> </依賴項>
除此之外,Java 11 還刪除了 Java EE 和 CORBA 模組,因此您必須手動新增 javax 套件。
<依賴項> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <版本>1.3.2</版本> </依賴項>
處理 InaccessibleObjectException
如果您在應用程式中使用反射,尤其是setAccessible(true),那麼您可能會在應用程式啟動時收到InaccessibleObjectException錯誤。此錯誤是由Java平台的模組化系統引起的,該系統僅允許在某些條件下存取:- 課程必須是公開的。
- 您必須匯出自己的包。
# --add-opens 具有以下語法: {modules}/{package}=ALL-UNNAMED java --add-opens java.base/java.lang=ALL-UNNAMED
或者你可以改變你的Java程式碼來最終解決這個問題。
module java.base {
exports java.lang;
}
總的來說,在解決了上述所有問題後,您的應用程式應該可以在 Java 17 上正常運作。我希望本文能幫助您遷移到 Java 17。
在 Java 中迭代列表的不同方法
來源:Rrtutors 在本文中,我們將學習幾種在 Java 中迭代列表的方法。 Collection 框架有一個 List 接口,允許我們維護有序的物件集合。List介面由ArrayList、LinkedList、Stack和Vector實作。大量 Java 應用程式使用 ArrayList 和 LinkedList。迭代列表的方法有很多種,每種方法都有自己的特點。如何在 Java 中迭代列表
您可以使用三種方法在 Java 中迭代列表:- 使用進階的 For 迴圈方法。
- 使用迭代器方法。
- 迭代 forEach 的元素。
1.使用先進的For循環方法。
這是基本for迴圈的一個版本,可用於迭代列表。這是一個例子:import java.util.ArrayList;
import java.util.List;
public class Enhanced_for_loop {
public static void main(String[] args) {
List<Integer> figurez = new ArrayList<>();
figurez.add(100);
figurez.add(200);
figurez.add(300);
figurez.add(400);
for(int i: figurez) {
System.out.print(i+ " ");
}
}
}
結論:
100 200 300 400
2.使用迭代器方法。
您也可以使用迭代器來迭代列表。當您需要修改可迭代列表時,迭代器特別有用。例子:import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Iterate_List_using_Iterators {
public static void main(String[] args) {
List<Integer> numbari = new ArrayList<>();
numbari.add(100);
numbari.add(200);
numbari.add(300);
Iterator<Integer> itr = numbari.iterator();
while(itr.hasNext()) {
int i = itr.next();
System.out.print(i+ " ");
if(i==3) {
itr.remove();
}
}
}
}
結論:
100 200 300
3. 迭代 forEach 的元素。
將 lambda 函數添加到 Java 後,語言語法引入了 forEach 函數,它允許您迭代任何集合。以下程式碼範例示範如何使用 forEach 方法迭代列表:import java.util.ArrayList;
import java.util.List;
public class Iterate_List_using_ForeEach_iterable {
public static void main(String[] args) {
List<Integer> numbari = new ArrayList<>();
numbari.add(1);
numbari.add(2);
numbari.add(3);
numbari.add(4);
numbari.forEach(System.out::println);
}
}
結論:
1 2 3 4
GO TO FULL VERSION