E se migrar aplicações e serviços Java7 e Java 8 automaticamente para versões mais recentes como Java 17 fosse algo possível? Acompanhe este post e veja como isto é possível.
Nos dias de hoje, o software está em constante evolução. A demanda para adaptar-se rapidamente às mudanças tecnológicas e otimizar a base de código para melhor performance, segurança e manutenibilidade nunca foi tão alta. Nesse cenário, a refatoração eficiente e precisa do código se torna vital. E é aqui que o OpenRewrite entra em cena.
OpenRewrite
O OpenRewrite é um projeto open source destinado a refatorar e modernizar bases de código de maneira programática. Em outras palavras, ele automatiza as mudanças no código, garantindo que sejam precisas, consistentes e repetíveis.
Como o OpenRewrite funciona?
O OpenRewrite define "recetas" (recipes) que são conjuntos de regras para modificar o código-fonte. Quando aplicadas, essas receitas identificam padrões específicos no código e realizam as alterações necessárias de acordo com as instruções definidas. Veja o exemplo abaixo da quantidade de receitas existentes no projeto:
✨ Principais características:
Linguagem agnóstica: Embora muitas de suas receitas atuais sejam focadas em Java, a arquitetura do OpenRewrite é projetada para suportar múltiplas linguagens de programação.
Integração com ferramentas populares: O OpenRewrite pode ser integrado a diversas ferramentas e IDEs, facilitando a adoção em ambientes de desenvolvimento existentes.
Automatização segura: Ao contrário das ferramentas de busca e substituição tradicionais, o OpenRewrite tem consciência da AST (Árvore Sintática Abstrata) do código, garantindo refatorações precisas e minimizando erros.
Customizável: As organizações podem criar suas próprias receitas para atender a padrões específicos ou exigências de modernização.
Por que considerar o OpenRewrite na sua organização?
No mundo do software, pequenas ineficiências ou inconsistências no código podem se acumular ao longo do tempo, tornando-se dívidas técnicas. OpenRewrite ajuda a resolver essas dívidas programaticamente, garantindo que as bases de código permaneçam limpas, modernas e em conformidade com as melhores práticas.
Em resumo, o OpenRewrite é uma ferramenta inestimável para equipes de desenvolvimento que buscam otimizar e modernizar suas bases de código de forma eficiente e confiável. Se você ainda não conferiu, vale a pena dar uma olhada neste projeto open source e considerar sua adoção no seu fluxo de trabalho de desenvolvimento. 💻🔄🌟
Tutorial OpenRewrite
Este tutorial pressupõe que você:
Tenha algum conhecimento em Java;
Neste exemplo usaremos o Maven, porém o Gradle também é suportado.
Saiba como executar comandos na linha de comando;
Consiga executar comandos básicos do Git.
Este tutorial foi executado usando Java versão 11, certifique-se que esta versão seja a configurada em seu sistema:
java -version
openjdk version "11.0.19" 2023-04-18 LTS
OpenJDK Runtime Environment Corretto-11.0.19.7.1 (build 11.0.19+7-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.19.7.1 (build 11.0.19+7-LTS, mixed mode)
Passo 1 : Clonando o repositório de exemplo
Primeiramente faça o clone do projeto com o seguinte comando:
git clone https://github.com/openrewrite/spring-petclinic-migration.git
Uma vez clonado, entre no diretório em questão, para este exemplo, eu estou usando o VSCode como ferramenta de desenvolvimento.
Passo 2: Adicionar rewrite-maven-plugin ou rewrite-gradle-plugin ao seu projeto
Depois de verificar seu projeto, a próxima etapa é adicionar o plug-in de reescrita ao Maven ou Gradle. Siga as instruções na guia Maven fazer isso.
Adicione um novo <plugin>na seção<plugins> do seu pom.xml que se parece com:
<plugin>
<plugin>
<groupId>org.openrewrite.maven</groupId>
<artifactId>rewrite-maven-plugin</artifactId>
<version>5.3.2</version>
</plugin>
Na linha de comando, tente executar ./mvnw rewrite:discover :
Passo 3: ativar uma Recipe
Antes de executar qualquer uma das recipes (receitas), você precisará atualizar a configuração do plug-in para marcar a(s) receita(s) desejada(s) como "ativa(s)". Vamos usar a receita como exemplo (o que garantirá que suas importações sigam uma ordem padrão. Para ativar esta receita, modifique seu arquivo pom.xml, para que as seções que você modificou anteriormente se pareçam com o exemplo abaixo:
<plugin>
<groupId>org.openrewrite.maven</groupId>
<artifactId>rewrite-maven-plugin</artifactId>
<version>5.3.2</version>
<configuration>
<activeRecipes>
<recipe>org.openrewrite.java.OrderImports</recipe>
</activeRecipes>
</configuration>
</plugin>
Passo 4: execute uma receita (recipe) de refatoração simples
Antes da execução veja os arquivos alterados no projeto:
Agora que você ativou a recipe OrderImports, você pode executá-la executando o comando:
./mvnw rewrite:run
Veja o resultado da execução do comando Maven:
Veja o resultado dos arquivos alterados até o momento em nosso repositório local:
Quando visualizamos o diff de uma das classes, veja o resultado da execução da Recipe ativada:
Passo 5: Executar uma recipe com configuração YAML
Algumas recipes são mais complexas que OrderImports e requerem configuração no arquivo rewrite.yaml, para executá-las. Por exemplo, a receita org.openrewrite.java.ChangePackage, tem três opções que precisam ser configuradas:
Para usar esta receita para renomear o pacote org.springframework.samples.petclinic.vet para org.springframework.samples.petclinic.veterinary, crie um arquivo rewrite.yml na raiz do seu projeto que com a seguinte configuração:
---
type: specs.openrewrite.org/v1beta/recipe
name: com.skalena.VetToVeterinary
recipeList:
- org.openrewrite.java.ChangePackage:
oldPackageName: org.springframework.samples.petclinic.vet
newPackageName: org.springframework.samples.petclinic.veterinary
Como pode perceber, nossa regra tem o nome de com.skalena.VetToVeterinary, e a lista de receitas ativas, no caso: ChangePackage recebe como parâmetros oldPackageName e newPackageName.
Vamos executar mais uma vez o comando : ./mvnw rewrite:discover , para ver se nossa recipe foi registrada de acordo:
Agora podemos adicionar a referência de de nossa Recipe e referenciá-la em nosso pom.xml do projeto, como no exemplo abaixo:
<plugin>
<groupId>org.openrewrite.maven</groupId>
<artifactId>rewrite-maven-plugin</artifactId>
<version>5.3.2</version>
<configuration>
<activeRecipes>
<recipe>org.openrewrite.java.format.AutoFormat</recipe>
<recipe>org.openrewrite.java.OrderImports</recipe>
<recipe>com.skalena.VetToVeterinary</recipe>
</activeRecipes>
</configuration>
</plugin>
Se você executar novamente o comando: ./mvnw rewrite:run, você verá a Recipe executando a refatoração.
Migrações Possíveis com OpenRewrite
Em termos de possíveis cenários, veja alguns exemplos que você pode refatorar/modernizar com o OpenRewrite:
Tecnologia | Destinos |
Java 7, Java 8 | Código e bibliotecas para Java 17, Java 20 etc |
Spring 2.x | Spring 3.x |
Hibernate | Hibernate 6.x |
A tabela acima mostra apenas exemplos do que pode ser feito, pois afinal, a abordagem do OpenRewrite é que qualquer empresa ou indivíduo possa escrever sua receita em Java, e esta por sua vez executar todo o processo de refatoração e modernização.
Para fins de exemplos, este mesmo código, nós mudamos a declaração do plugin para esta:
<plugin>
<groupId>org.openrewrite.maven</groupId>
<artifactId>rewrite-maven-plugin</artifactId>
<version>5.3.2</version>
<configuration>
<activeRecipes>
<recipe>org.openrewrite.java.migrate.UpgradeToJava17</recipe>
</activeRecipes>
</configuration>
<dependencies>
<dependency>
<groupId>org.openrewrite.recipe</groupId>
<artifactId>rewrite-migrate-java</artifactId>
<version>2.0.8</version>
</dependency>
</dependencies>
</plugin>
Ao executar o comando /mvnw rewrite:run, mesmo este projeto usando Java11, o plugin do OpenRewrite foi capaz de executar uma adaptação de código para ser compatível com o Java 17:
OpenRewrite + Esteroides : Moderne.io
Se você preferir, a empresa por trás do desenvolvimento do OpenRewrite, possui uma plataforma SaaS, onde todo este gerenciamento de atividades de manter seu código saudável, não só em termos de modernizações, mas também garantindo que seu código não tenha vulnerabilidades de segurança, onde além de apontá-las, a plataforma já pode remediá-las, ou seja, alterar o código, de forma que estes problemas sejam resolvidos até mesmo de forma automática.
Para saber mais sobre o Moderne.io , visite hoje mesmo o site deles em: https://www.moderne.io
Se interessou por esta tecnologia e quer conversar mais a respeito, envie uma mensagem para nós, vai ser um prazer conversar com você: https://www.skalena.com/contato
Comments