Como migrar do Java 8 para o Java 17
Fonte: Médio Usando esta publicação, você pode facilmente atualizar do Java 8 para o Java 17. Cada nova versão do Java, especialmente se estivermos falando sobre a versão de suporte de longo prazo (LTS), fornece aos desenvolvedores muitos novos recursos e funções, eliminando erros descobertos anteriormente e melhora o desempenho. Mas até agora, apesar do Java 17 ter sido lançado há quase um ano, a versão mais popular da linguagem ainda é o Java 8. Muitos hesitam em atualizar, acreditando que a nova versão do Java não é totalmente compatível com as versões anteriores, e atualizá-lo exigirá muito esforço. Pessoalmente, acho que é necessário atualizar. Já estou usando Java 17, embora tenha tido alguns problemas com a atualização. Além disso, vale a pena considerar que o Java 8 há muito deixou de ser um serviço gratuito. O desempenho do Java 17 é muito melhor. Por exemplo, ao usar o ZGC, você não precisa mais se preocupar em definir as configurações de coleta de lixo. Se quiser migrar do Java 8 para o Java 17, você terá que fazer algum trabalho extra. Como já fiz esse caminho, posso compartilhar minha experiência na migração para a nova versão.Atualize a versão do plugin do compilador Maven
Para alguns desenvolvedores, a versão do plugin do compilador Maven pode ser muito antiga. Se você quiser trabalhar com Java 17, a versão do plugin do compilador Maven deve ser pelo menos 3.5.4.
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <versão>3.8.1</versão> <configuração> <fonte>17</fonte> <target>17</target> </configuration> </plugin>
Atualizar dependências
A primeira etapa ao atualizar do Java 8 para o Java 17 é atualizar suas dependências. Como a dependência que você usou originalmente provavelmente não suporta Java 17, você terá que atualizá-la se quiser minimizar o impacto da atualização da versão. Caso contrário, você poderá enfrentar vários problemas. 1. Por exemplo, Lombok causará um erro de compilação. As informações do erro são as seguintes:
Falha ao executar a meta org.apache.maven.plugins:maven-compiler-plugin:3.2:compile (default-compile) no projeto encloud-common: Erro fatal ao compilar: java.lang.ExceptionInInitializerError: Não foi possível tornar o campo privado com.sun .tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs acessível: módulo jdk.compiler não "abre com.sun.tools.javac.processing" para módulo sem nome
Como o Lombok injeta o código gerado em tempo de compilação e usa as classes do pacote com.sun.tools.javac.* , você precisa atualizar o Lombok para a versão mais recente. Isto resolverá o problema. 2. A conexão do zookeeper gerará um erro UnresolvedAddressException , as informações do erro são as seguintes:
org.apache.zookeeper.ClientCnxn - Sessão 0x0 para servidor 10.0.*.*/<unresolved>:2181, erro inesperado, fechando conexão de soquete e tentando reconectar java.nio.channels.UnresolvedAddressException: null em sun.nio.ch. Net .checkAddress(Net.java:149) ~[?:?] em sun.nio.ch.Net.checkAddress(Net.java:157) ~[?:?] em sun.nio.ch.SocketChannelImpl.checkRemote( SocketChannelImpl .java:816) ~[?:?] em sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:839) ~[?:?] em org.apache.zookeeper.ClientCnxnSocketNIO.registerAndConnect(ClientCnxnSocketNIO.java: 277) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03] em org.apache.zookeeper.ClientCnxnSocketNIO.connect(ClientCnxnSocketNIO.java:287) ~[zookeeper-3.4.13.jar:3 .4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03 ] em org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1021) ~[zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03] em org.apache.zookeeper.ClientCnxn$ SendThread. execute(ClienteCnxn .java:1064) [zookeeper-3.4.13.jar:3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03]
O motivo do erro é que no Java 15 o método toString para InetSocketAddressHolder foi refatorado . Se estiver usando o maven, você pode usar o comando mvnversions:display-dependency-updates para verificar atualizações de dependência. O resultado ficará assim:
Adicionar uma dependência
Se você compilar com JAXB, receberá um erro. Isso ocorre porque o JAXB foi removido do Java 11. Portanto, você precisa adicionar algumas dependências do 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>
Além disso, o Java 11 também remove os módulos Java EE e CORBA, portanto você terá que adicionar pacotes javax manualmente.
<dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency>
Tratamento de InaccessibleObjectException
Se você usar reflexão em seu aplicativo, especialmente setAccessible(true) , provavelmente receberá um erro InaccessibleObjectException quando o aplicativo for iniciado. O erro é causado pelo sistema modular da plataforma Java, que permite o acesso apenas sob determinadas condições:- A aula deve ser pública.
- Você deve exportar seus próprios pacotes.
# --add-opens tem a seguinte sintaxe: {modules}/{package}=ALL-UNNAMED java --add-opens java.base/java.lang=ALL-UNNAMED
Ou você pode alterar seu código Java para finalmente resolver esse problema.
module java.base {
exports java.lang;
}
No geral, depois de resolver todos os problemas acima, seu aplicativo deverá funcionar bem no Java 17. Espero que este artigo ajude você a migrar para o Java 17.
Diferentes maneiras de iterar uma lista em Java
Fonte: Rrtutors Neste artigo, aprenderemos várias maneiras de iterar uma lista em Java. A estrutura Collection possui uma interface List que nos permite manter uma coleção ordenada de objetos. A interface List é implementada por ArrayList, LinkedList, Stack e Vector. Um número significativo de aplicativos Java usa ArrayList e LinkedList. Existem várias maneiras de iterar em uma lista, cada uma com suas próprias características.Como iterar uma lista em Java
Você pode usar três maneiras de iterar uma lista em Java:- Usando o método For Loop avançado.
- Usando o método iterador.
- Iterar sobre os elementos forEach.
1. Usando o método For Loop avançado.
Esta é uma versão do loop for básico que pode ser usada para iterar em uma lista. Aqui está um exemplo: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+ " ");
}
}
}
Conclusão:
100 200 300 400
2. Usando o método iterador.
Você também pode usar iteradores para iterar em uma lista. Os iteradores são especialmente úteis quando você precisa modificar uma lista iterável. Exemplo: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();
}
}
}
}
Conclusão:
100 200 300
3. Itere sobre os elementos forEach.
Depois que as funções lambda foram adicionadas ao Java, a sintaxe da linguagem introduziu a função forEach, que permite iterar em qualquer coleção. O exemplo de código a seguir mostra como você pode usar o método forEach para iterar em uma lista: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);
}
}
Conclusão:
1 2 3 4
GO TO FULL VERSION