Como atualizar a versão do Spring Boot em suas aplicações usando o OpenRewrite
Como atualizar o Spring Boot para nova versões de forma fácil usando OpenRewrite
Se você está lendo essa matéria, já sabe que o Spring Boot é uma ferramenta amplamente utilizada no mercado que tem como objetivo claro ajudar os desenvolvedores no trabalho de configuração de um projeto Spring, para que a sua aplicação esteja pronta o mais rápido possível.
Devido a sua imensa popularidade, é usado em diversos sistemas, desde os mais simples, como a criação de APIs, até sistemas mais complexos, como os que envolvem integrações, operações financeiras e afins.
Entretanto, como todo o software existente no mercado, o Spring Boot tem um ciclo de vida bem definido. A equipe responsável pela gerência do framework atualiza as suas versões periodicamente, acompanhando também as versões do Spring Framework em busca de melhorias de funcionalidades, correções de erros e atualizações de segurança.
Normalmente as atualizações lançadas visam, além de todo o espectro de melhoria, uma transição fácil para as novas releases. Contudo, nem sempre isso é possível.
Quando há uma atualização muito grande, como por exemplo a atualização do Spring Boot 2.x para o 3.x, o trabalho de migração não se baseia simplesmente na alteração do número de versão no pom.xml (ou build.gradle) do projeto. Ele se estende para o todo, com a remoção e adequação de bibliotecas e importações que se tornaram obsoletas, a mudança de padrões de configurações e extensivos testes para verificar se o código se comporta como esperado. À medida que o tamanho do projeto aumenta, o esforço para migrá-lo aumenta de forma exponencial.
Dessa forma, visando a facilitação dos processos de atualização de software, foram criadas ferramentas que auxiliam o desenvolvedor nesse trabalho de atualização dos projetos.
O OpenRewrite Project
Em um dos trabalhos aqui na iTexto me vi diante de uma tarefa para atualizar um de nossos sistemas que utilizava uma versão muito antiga do Spring Boot 2.x. O objetivo era, se possível, migrá-lo para o Spring Boot 3.0 ou para o 2.7.7 com o Java 17.
O grande problema dessa tarefa era a imensidão do projeto. Simplesmente, havia mais de 900 testes que deveriam ser atualizados e outras centenas de classes que tinham que ser modificadas devido às mudanças presentes nas novas versões do framework.
Esse esforço, mesmo com o uso de algumas ferramentas da IDE seria imenso e levaria muito tempo para ser completado com sucesso.
Diante disso, após um pouco de pesquisa no artigo de migração do Spring Boot 3.0, eu encontrei a recomendação do Openwrite, que, segundo o seu site, é um “ecossistema de pesquisa e transformação semântica de código-fonte”. Em suma, ele consegue ler o seu código e, por meio de algumas técnicas, o atualizar segundo as especificações da “receita” escolhida.
As receitas são o passo a passo de alteração do código fonte. Por exemplo, se caso eu desejo que o OpenRewrite migre todo o meu código de uma versão do Spring para a outra, ele irá seguir todos os passos pré-estabelecidos para verificar o código, escolher quais bibliotecas, classes e métodos serão modificados e como realizar tal alteração.
Existem centenas de receitas já prontas e um tutorial que te guia para você criar as suas próprias. Você pode ler mais sobre como funciona melhor esse projeto no link:
https://docs.openrewrite.org/#what-does-openrewrite-do
Além do OpenRewrite, há outros projetos que realizam um trabalho parecido, como:
- O Spring Boot Migrator (que se baseia no OpenRewrite para realizar a migração de códigos para o Spring)
- O suporte para migração do IntelliJ IDEA
Nesse tutorial, eu irei demonstrar o passo a passo que eu utilizei, de forma resumida, para aplicar as alterações que o OpenRewrite fez.
Como que eu o utilizo?
Como disse antes, o OpenRewrite utiliza um passo a passo descrito dentro de uma receita para realizar as alterações no seu código. Então o primeiro passo é escolher a receita que você deseja utilizar.
Para isso, você deve acessar o site deles e escolher o que você deseja fazer:
https://docs.openrewrite.org/running-recipes/popular-recipe-guides
Irei deixar alguns exemplos para vocês:
Caso você queira migrar o seu Spring Boot, da versão 2.7 para a 3.0, utilize essa receita:
https://docs.openrewrite.org/reference/recipes/java/spring/boot3/upgradespringboot_3_0
Caso você queira migrar o seu Spring Boot, de uma versão entre a 2.0 até a 2.6 para a versão 2.7, utilize essa receita aqui:
https://docs.openrewrite.org/reference/recipes/java/spring/boot2/upgradespringboot_2_7
Nesse exemplo vou usar a primeira alternativa. Também já realizei testes com a segunda e tudo funcionou normal. No próprio site da receita terá um passo a passo do que fazer que será praticamente o mesmo. Eu mostrarei os passos para a adição do OpenRewrite em um projeto Maven.
Você deverá selecionar o xml presente na seção “Usage/Uso” da página da receita e acrescentar no pom.xml da sua aplicação. Ele irá adicionar um plugin ao maven que permitirá você executar o OpenWrite no seu projeto.
Assim, após o Maven carregar as mudanças no Pom.xml (em algumas IDEAs você deverá dizer para isso acontecer) os comandos com o OpenRewirte já estarão disponíveis.
Você pode dar início ao procedimento, por meio da interface gráfica (no meu caso é o IntelliJ) ou por meio do comando: mvn rewrite:run
E pronto. Ele começará a mostrar os logs e dentro de alguns segundos (ou minutos dependendo do seu projeto) o OpenRewirte irá terminar de verificar o código e realizar as alterações necessárias.
Assim que terminar, a maior parte do seu código já estará alterada para os padrões da versão escolhida. A partir desse momento, você deverá analisar as alterações feitas e validá-las de modo a manter o comportamento esperado do projeto.
Aqui no meu exemplo, ele alterou o pom.xml
E também modificou cada uma das minhas classes, alterando os imports obsoletos e outros aspectos do código:
ATENÇÃO!
Em todos os meus testes realizados, a ferramenta conseguiu atuar e agilizar o procedimento de atualização em 99%. Entretanto alguns pontos que encontrei são importantes para se discutir:
- O OpenRewrite realizou a alteração do código em todas as classes, mas, em todos os testes que realizei, a classe de configuração do SpringSecurity não foi modificada inteiramente. Tive que realizar a adequação das configurações ali presentes para a nova versão do Spring Boot.
- Muitas dependências do pom.xml não serão atualizadas também, ao menos que tenha outra receita específica para isso que faça essa adequação automaticamente. Dessa forma, você deverá atualizar as dependências da sua aplicação buscando a maior compatibilidade com a versão do Spring escolhida.
Você sempre deverá conferir o trabalho de atualização realizado pelo OpenRewrite, uma vez que ele pode alterar alguma coisa que você não desejaria que fosse alterado. Ele é uma ferramenta que auxilia e reduz grandemente o esforço de atualização e migração de um software e o seu trabalho deve sempre ser revisado.
Agradecimentos
E então é isso. Gostaram? Espero que essa ferramenta auxilie vocês nos eventuais trabalhos de migração e atualização presentes no ciclo de vida de um software.
Caso tenham dúvidas, sugestões ou formas de contribuir com o que foi aqui discutido, sinta-se livre para utilizar a seção de comentários para tal.
Até breve!
Referências
Projeto OpenReWrite: https://docs.openrewrite.org/
Guia de migração para o Spring Boot 3.0: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide
Spring Boot Migrator: https://github.com/spring-projects-experimental/spring-boot-migrator