Как перейти с 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.<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. Фреймворк Collection имеет интерфейс List (список), который позволяет нам поддерживать упорядоченную коллекцию объектов. Интерфейс List реализуется ArrayList, LinkedList, Stack и Vector. Значительное количество Java-приложений используют ArrayList и LinkedList. Для перебора списка существует несколько способов, каждый из которых имеет свои особенности.Как перебрать список в 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
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ