Maven, de dependências ao build.
Quando começamos um projeto Java, é comum que não saibamos qual proporção ele tomará com o tempo. Ao precisar de uma biblioteca ou um framework apenas importamos no classpath, dentro de uma pasta lib e tudo funciona normalmente. Entretanto, conforme nosso projeto cresce, precisamos gerênciar cada pacote necessário, cada biblioteca e também as dependências! Dependendo do projeto, ainda precisamos nos preocupar com os testes de unidade e de integração, com o build e deploy! Fazer tudo isso começa a se tornar extremamente trabalhoso.
Para solucionar este problema a Apache desenvolveu o Maven, uma ferramenta de automação de compilação que, além de gerênciar dependencias, nos permite gerênciar todo o processo de build do projeto com relatórios e documentação!
Quando utilizamos o Maven, configuramos um arquivo xml chamado POM (Project Object Model), que fornece todas as configurações necessárias para o projeto em um único arquivo. Nesse arquivo POM.xml podemos definir quais são as dependencias (Dependencies). Portanto, se quisermos usar um framework para mapeamento de objeto-relacional, como o Hibernate, basta irmos no nosso POM.xml e adicionar uma dependencia (Dependency) dentro das nossas Dependecies especificando o groupId, artifactId e a version:
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.1.0.Final</version>
<dependecy>
</dependencies>
E o maven baixará e gerenciará tudo que é necessário para nosso Hibernate funcionar!
Mas, e para descobrir o groupId, artifactId e version de cada dependencia que quisermos adicionar? Para isso, podemos utilizar o site mvnrepository.com ! Lá podemos procurar pela dependencia que quisermos e encontraremos todas as versões disponiveis. No próprio repositório já é disponibilizado o código pronto com a dependency já configurada com o groupId, artifactId e a version!
Agora, temos todas nossas dependencias configuradas e gerenciadas pelo Maven! Perfeito, mas e para buildar? Usamos o Maven também!
O processo de build segue algumas fases (Phases) desde validar nosso projeto (validate), compilar (compile), rodar os testes de unidade (test), empacotar (package), rodas os testes de integração (integration-test), verificar (verify), instalar (install) e até deployar (deploy)! Portanto, ao rodar no nosso terminal, ou em alguma IDE, o processo de build do maven:
$ mvn deploy
Ele passará por cada uma das fases até deployar nosso projeto. Se quisermos apenas rodar os testes de unidade:
$ mvn test
Passaremos por validate e compile até rodar os testes. Ou seja, cada fase que chamamos rodará as fases que antecedem ela.
Além de conseguir executar uma fase específica do processo de build, podemos também configurar fases especificas no nosso POM.xml e adicionar plugins que realizam funcionalidades. Como por exemplo o PMD:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.6</version>
</plugin>
</plugins>
Que analisa nosso código e gera relatórios.
Com isso, podemos ter uma ideia do quão ampla podem ser as funcionalidades do Maven. Podemos gerenciar toda a estrutura de dependencias do projeto, gerar relatórios, rodar testes e buildar! A utilização de uma ferramenta de automação de compilação pode aumentar muito o rendimento de uma equipe inteira, por isso é importante que sempre procuremos conhecer e implementar essas ferramentas no nosso dia-a-dia como desenvolvedores.
Uma lista completa de plugins e tudo sobre Maven pode ser encontrado na pagina maven.apache.org (disponivel em ingles)