Apache Maven: Um Guia Básico
Tags: java, maven, braziliandevs
Published: 2023-05-14 00:33:05

_TL;DR_

> O Apache Maven é uma ferramenta poderosa de gerenciamento de projeto para software, amplamente usada para a construção de projetos, dependência e documentação. Este artigo explora a história do Maven, sua utilidade, e a razão de sua criação bem como seu ciclo é funcionamento. Também inclui um exemplo de codificação de um plugin simples que recebe uma string e retorna o hash na tela.

## O que é o Apache Maven?

O Apache Maven é uma ferramenta de gerenciamento de projetos de software, focada em automação e compreensão. Com base no conceito de um Modelo de Objeto de Projeto (POM), o Maven pode gerenciar a construção, os relatórios e a documentação de um projeto a partir de uma peça central de informação.

## Por que o Maven foi criado?

O Maven nasceu da necessidade de simplificar o processo de construção de projetos no Jakarta Turbine. A maioria dos projetos tinha scripts de compilação Ant que eram quase idênticos, o que levou ao desenvolvimento de um conjunto de scripts comuns. Ao longo do tempo, a necessidade de um sistema de construção e gerenciamento de projetos mais abrangente tornou-se evidente, e assim nasceu o Maven.

## A História do Maven

A primeira versão do Maven foi lançada em julho de 2004, como um projeto do Apache Software Foundation. Desde então, evoluiu significativamente, com a versão 2.0, lançada em outubro de 2005, introduzindo grandes mudanças na arquitetura para tratar de vários problemas estruturais com a versão 1.x. A versão 3.0, lançada em outubro de 2010, focou na usabilidade e na performance.

## O Ciclo de vida do Maven
O Apache Maven organiza o processo de compilação em torno do conceito de ciclo de vida de compilação, que é uma sequência ordenada de fases. Cada fase representa um estágio no ciclo de vida, como compilação, teste, empacotamento, instalação, etc.

Uma "phase", ou fase, no Maven, é uma etapa no ciclo de vida de construção. Por exemplo, a fase compile compila o código-fonte do projeto, a fase test testa o código-fonte compilado usando um framework de teste adequado, a fase package leva o código compilado e o empacota em um formato distribuível (como JAR, WAR, etc.).

Aqui estão algumas das fases padrão no ciclo de vida de construção padrão do Maven:

- `validate`: verifica se todas as informações necessárias estão disponíveis para o projeto.
compile: compila o código-fonte do projeto.
- `test`: testa o código-fonte compilado usando um framework de teste adequado.
- `package`: leva o código compilado e o empacota em um formato distribuível (como JAR, WAR, etc.).
- `verify`: executa verificações para garantir que o pacote é válido e atende a critérios de qualidade.
- `install`: instala o pacote no repositório local para uso como dependência em outros projetos locais.
- `deploy`: copia o pacote final para o repositório remoto para compartilhamento com outros desenvolvedores e projetos.

As "goals", ou metas, são as tarefas executadas por plugins. Cada plugin pode ter um ou mais objetivos, e cada objetivo é responsável por uma tarefa específica. Por exemplo, o plugin `compiler` tem objetivos `compile` e `testCompile` para compilar o código-fonte e o código de teste, respectivamente.

A relação entre fases e metas é que quando uma fase é chamada via linha de comando (por exemplo, `mvn install`), todas as metas vinculadas a essa fase são executadas na ordem.

## Por que o Maven é importante no desenvolvimento de software?

O Maven simplifica e padroniza o processo de construção de um projeto. Ele cuida de tarefas como compilação, distribuição, documentação, colaboração de equipe e outras tarefas de gerenciamento de projetos.

O Maven gerencia as dependências e verifica a compatibilidade entre diferentes versões de uma biblioteca, reduzindo o risco de conflitos de versão. Ele também suporta a integração com ferramentas de controle de versão como Git e SVN, facilitando o gerenciamento do código fonte.

## Codificando um Plugin Simples

Aqui está um exemplo de como codificar um plugin simples que recebe uma string e retorna o hash na tela. Este plugin usará o algoritmo SHA-256 para criar o hash.

```java
package com.example;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import java.security.MessageDigest;

/**
 * @goal displayhash
 */
@Mojo(name = "hash-plugin")
public class HashMojo extends AbstractMojo
{
    /**
     * @parameter property="msg"
     * @required
     */ 
    @Parameter(property = "hash-plugin.msg", defaultValue = "Olá Mundo!" )
    private String msg;
    
   @Parameter( 
      property = "parametro.encoding", 
      defaultValue = "UTF-8" )
   private String enconding;
 

    public void execute() throws MojoExecutionException
    {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] hash = digest.digest(msg.getBytes(enconding));
            getLog().info(bytesToHex(hash));
        } catch(Exception ex) {
            throw new MojoExecutionException("Error creating hash", ex);
        }
    }

    private static String bytesToHex(byte[] bytes) {
        StringBuffer result = new StringBuffer();
        for (byte b : bytes) {
            result.append(String.format("%02x", b));
        }
        return result.toString();
    }
}

```
Para usar este plugin, você precisa adicionar ao seu arquivo pom.xml:

```xml
<build>
  <plugins>
    <plugin>
      <groupId>com.example</groupId>
      <artifactId>hash-plugin</artifactId>
      <version>1.0-SNAPSHOT</version>
      <executions>
        <execution>
          <phase>install</phase>
          <goals>
            <goal>displayhash</goal>
          </goals>
          <configuration>
            <msg>MinhaMensagem</msg>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

```
Quando você executa `mvn install`, o Maven irá calcular o hash SHA-256 da string "MinhaMensagem" e exibi-lo no console.

Para atribuir o encoding passando usando `mvn package -Dparametro.encoding="ISO-8859-1"` e com isso o encoding para de `UTF-8` para `ISO-8859-1`. 

## Conclusão

O Apache Maven é uma ferramenta de gerenciamento de projetos poderosa e flexível. Ele simplifica muitos aspectos do desenvolvimento de software, desde a construção de projetos até a documentação. Com sua capacidade de criar plugins personalizados, o Maven pode ser adaptado para se adequar a uma grande variedade de necessidades de desenvolvimento de software.

## Referências

1. Apache Maven Project. (2021). Introduction to the Build Lifecycle. Disponível em: [https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html](https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html).

2. Apache Maven Project. (2021). Guide to Developing Java Plugins. Disponível em: [https://maven.apache.org/guides/plugin/guide-java-plugin-development.html](https://maven.apache.org/guides/plugin/guide-java-plugin-development.html).