Comment migrer de Java 8 vers Java 17
Source : Medium Grâce à cette publication, vous pouvez facilement passer de Java 8 à Java 17. Chaque nouvelle version de Java, surtout si nous parlons de la version de support à long terme (LTS), offre aux développeurs de nombreuses nouvelles fonctionnalités et fonctions, éliminant erreurs découvertes précédemment et améliore les performances. Mais jusqu'à présent, malgré le fait que Java 17 soit sorti il y a presque un an, la version la plus populaire du langage reste Java 8. Beaucoup hésitent à mettre à niveau, estimant que la nouvelle version de Java n'est pas entièrement compatible avec les versions précédentes, et la mise à niveau vers celui-ci nécessitera beaucoup d'efforts. Personnellement, je pense qu'une mise à niveau est nécessaire. J'utilise déjà Java 17, même si j'ai rencontré quelques problèmes avec la mise à niveau. De plus, il convient de noter que Java 8 a depuis longtemps cessé d'être un service gratuit. Les performances de Java 17 sont bien meilleures. Par exemple, en utilisant ZGC, vous n'avez plus à vous soucier de la configuration des paramètres de garbage collection. Si vous souhaitez migrer de Java 8 vers Java 17, vous devrez effectuer un travail supplémentaire. Comme j'ai déjà emprunté cette voie, je peux partager mon expérience de migration vers la nouvelle version.Mettre à jour la version du plugin du compilateur Maven
Pour certains développeurs, la version du plugin du compilateur Maven est peut-être trop ancienne. Si vous souhaitez travailler avec Java 17, la version du plugin du compilateur Maven doit être au moins 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>
Mettre à jour les dépendances
La première étape lors de la mise à niveau de Java 8 vers Java 17 consiste à mettre à jour vos dépendances. Étant donné que la dépendance que vous avez utilisée à l'origine ne prend probablement pas du tout en charge Java 17, vous devrez la mettre à jour si vous souhaitez minimiser l'impact de la mise à niveau de version. Sinon, vous risquez de rencontrer un certain nombre de problèmes. 1. Par exemple, Lombok provoquera une erreur de compilation. Les informations d'erreur sont les suivantes :
Échec de l'exécution de l'objectif org.apache.maven.plugins:maven-compiler-plugin:3.2:compile (compile par défaut) sur le projet encloud-common : erreur fatale lors de la compilation : java.lang.ExceptionInInitializerError : impossible de rendre le champ privé com.sun .tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs accessible : le module jdk.compiler n'"ouvre pas com.sun.tools.javac.processing" à un module sans nom
Étant donné que Lombok injecte le code généré au moment de la compilation et utilise les classes du package com.sun.tools.javac.* , vous devez mettre à jour Lombok vers la dernière version. Cela résoudra le problème. 2. La connexion zookeeper générera une erreur UnresolvedAddressException , les informations sur l'erreur sont les suivantes :
org.apache.zookeeper.ClientCnxn - Session 0x0 pour le serveur 10.0.*.*/<unresolved>:2181, erreur inattendue, fermeture de la connexion socket et tentative de reconnexion java.nio.channels.UnresolvedAddressException : null sur sun.nio.ch. Net .checkAddress(Net.java:149) ~[?:?] à sun.nio.ch.Net.checkAddress(Net.java:157) ~[?:?] à sun.nio.ch.SocketChannelImpl.checkRemote( SocketChannelImpl .java:816) ~[?:?] sur sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:839) ~[?:?] sur org.apache.zookeeper.ClientCnxnSocketNIO.registerAndConnect(ClientCnxnSocketNIO.java: 277) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03] sur org.apache.zookeeper.ClientCnxnSocketNIO.connect(ClientCnxnSocketNIO.java:287) ~[zookeeper-3.4.13 .jar:3 .4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03 ] sur org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1021) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03] sur org.apache.zookeeper.ClientCnxn$ Envoyer Thread.run(ClientCnxn .java:1064) [zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03]
La raison de l'erreur est que dans Java 15, la méthode toString pour InetSocketAddressHolder a été refactorisée . Si vous utilisez maven, vous pouvez utiliser la commande mvn versions:display-dependency-updates pour vérifier les mises à jour des dépendances. Le résultat ressemblera à ceci :
Ajouter une dépendance
Si vous compilez avec JAXB, vous recevrez une erreur. En effet, JAXB a été supprimé de Java 11. Vous devez donc ajouter des dépendances 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>
En plus de cela, Java 11 supprime également les modules Java EE et CORBA, vous devrez donc ajouter manuellement les packages javax.
<dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency>
Gestion de l'exception InaccessibleObjectException
Si vous utilisez la réflexion dans votre application, en particulier setAccessible(true) , vous recevrez probablement une erreur InaccessibleObjectException au démarrage de l'application. L'erreur est causée par le système modulaire de la plateforme Java, qui autorise l'accès uniquement sous certaines conditions :- Le cours doit être public.
- Vous devez exporter vos propres packages.
# --add-opens a la syntaxe suivante : {modules}/{package}=ALL-UNNAMED java --add-opens java.base/java.lang=ALL-UNNAMED
Ou vous pouvez modifier votre code Java pour enfin résoudre ce problème.
module java.base {
exports java.lang;
}
Dans l'ensemble, après avoir résolu tous les problèmes ci-dessus, votre application devrait fonctionner correctement sur Java 17. J'espère que cet article vous aidera à migrer vers Java 17.
Différentes façons de parcourir une liste en Java
Source : Rrtutors Dans cet article, nous apprendrons plusieurs façons de parcourir une liste en Java. Le framework Collection dispose d'une interface List qui nous permet de maintenir une collection ordonnée d'objets. L'interface List est implémentée par ArrayList, LinkedList, Stack et Vector. Un nombre important d'applications Java utilisent ArrayList et LinkedList. Il existe plusieurs façons de parcourir une liste, chacune ayant ses propres caractéristiques.Comment parcourir une liste en Java
Vous pouvez utiliser trois manières de parcourir une liste en Java :- Utilisation de la méthode avancée For Loop.
- En utilisant la méthode itérateur.
- Parcourez les éléments forEach.
1. Utilisation de la méthode avancée For Loop.
Il s'agit d'une version de la boucle for de base qui peut être utilisée pour parcourir une liste. Voici un exemple :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+ " ");
}
}
}
Conclusion:
100 200 300 400
2. Utilisation de la méthode itérateur.
Vous pouvez également utiliser des itérateurs pour parcourir une liste. Les itérateurs sont particulièrement utiles lorsque vous devez modifier une liste itérable. Exemple: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();
}
}
}
}
Conclusion:
100 200 300
3. Parcourez les éléments forEach.
Après l'ajout des fonctions lambda à Java, la syntaxe du langage a introduit la fonction forEach, qui vous permet de parcourir n'importe quelle collection. L'exemple de code suivant montre comment utiliser la méthode forEach pour parcourir une liste :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);
}
}
Conclusion:
1 2 3 4
GO TO FULL VERSION