Как перейти с Java 8 на Java 17
Источник: Medium Используя эту публикацию, вы сможете без проблем выполнить апгрейд версии языка Java 8 на Java 17.
Обновите версию подключаемого модуля компилятора Maven
У некоторых разработчиков версия подключаемого модуля компилятора Maven может быть слишком старой. Если вы хотите работать с Java 17, версия подключаемого модуля компилятора Maven должна быть не ниже 3.5.4.<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
Обновите зависимости
Первым шагом при обновлении с Java 8 до Java 17 является обновление ваших зависимостей. Поскольку зависимость, которую вы использовали изначально, вероятно, вообще не поддерживает Java 17, вам придется обновить ее, если вы хотите свести к минимуму влияние обновления версии. В противном случае вы можете столкнуться с целым рядом проблем. 1. К примеру, Lombok вызовет ошибку компиляции. Информация об ошибке выглядит следующим образом:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.2:compile (default-compile) on project encloud-common: Fatal error compiling:
java.lang.ExceptionInInitializerError: Unable to make field private com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors
com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs accessible: module jdk.compiler does not "opens com.sun.tools.javac.processing" to unnamed module
Поскольку Lombok вставляет сгенерированный код во время компиляции и использует классы пакеты com.sun.tools.javac.*, вам нужно обновить Lombok до последней версии. Это решит проблему.
2. Соединение zookeeper выдаст ошибку UnresolvedAddressException, информация об ошибке выглядит следующим образом:
org.apache.zookeeper.ClientCnxn - Session 0x0 for server 10.0.*.*/<unresolved>:2181, unexpected error, closing socket connection and attempting reconnect
java.nio.channels.UnresolvedAddressException: null
at sun.nio.ch.Net.checkAddress(Net.java:149) ~[?:?]
at sun.nio.ch.Net.checkAddress(Net.java:157) ~[?:?]
at sun.nio.ch.SocketChannelImpl.checkRemote(SocketChannelImpl.java:816) ~[?:?]
at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:839) ~[?:?]
at org.apache.zookeeper.ClientCnxnSocketNIO.registerAndConnect(ClientCnxnSocketNIO.java:277) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03]
at org.apache.zookeeper.ClientCnxnSocketNIO.connect(ClientCnxnSocketNIO.java:287) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03]
at org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1021) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03]
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1064) [zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03]
Причина ошибки в том, что в Java 15 провели рефакторинг метода toString для InetSocketAddressHolder.
Если вы используете maven, то можете применить команду mvn versions:display-dependency-updates для проверки обновлений зависимостей. Результат будет выглядеть следующим образом:

Добавьте зависимость
Если вы компилируете с помощью JAXB, то получите сообщение об ошибке. А всё потому, что JAXB удален из Java 11. Поэтому вам необходимо добавить некоторые зависимости JAXB Maven.<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
В дополнение к этому, Java 11 также удаляет модули Java EE и CORBA, поэтому вам придется вручную добавлять пакеты javax.
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
Обработка исключения InaccessibleObjectException
Если вы используете в своем приложении reflection, в особенности setAccessible(true), то вы, вероятно, получите ошибку InaccessibleObjectException при запуске приложения. Ошибку вызывает модульная система платформы Java, которая разрешает доступ только при определенных условиях:- Класс должен быть общедоступным.
- Вы должны экспортировать свои собственные пакеты.
# --add-opens has the following syntax: {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.
Как перебрать список в Java
Вы можете использовать три способа для итерации списка в Java:- Использование расширенного метода For Loop.
- Использование метода итератора.
- Перебор элементов forEach.
1. Использование расширенного метода For Loop.
Это версия базового цикла 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.
После добавления в 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
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ