top of page
  • Foto do escritorR&D - Pesquisa e Desenvolvimento

OpenRewrite: Modernizando e Refatorando o Código com precisão

Atualizado: 17 de ago. de 2023




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:

Receitas do OpenRewrite

✨ Principais características:

  1. 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.

  2. Integração com ferramentas populares: O OpenRewrite pode ser integrado a diversas ferramentas e IDEs, facilitando a adoção em ambientes de desenvolvimento existentes.

  3. 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.

  4. 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.



VSCode com o projeto


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 :


Descoberta das Recipes disponíveis no plugin Maven do OpenRewrite


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>
Recipes ativas para o projeto

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:


Execução do Maven com o plugin do OpenRewrite

Veja o resultado dos arquivos alterados até o momento em nosso repositório local:

Arquivos alterados em nosso repositório local com o OpenRewrite

Quando visualizamos o diff de uma das classes, veja o resultado da execução da Recipe ativada:

Resultado do processamento da refatoração OpenRewrite

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:

Nossa Recipe agora está disponível para ser usada no pom.xml

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.

Execução de nossa Recipe configurada

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


42 visualizações0 comentário
bottom of page