# Maven
## Definição

De acordo com o sítio do Apache Maven, ele é uma ferramenta de gerenciamento e compreensão de projetos de software. Com base no conceito de um modelo de objeto de projeto (POM), o Maven pode gerenciar a compilação, o relatório e a documentação de um projeto a partir de uma informação central.

## História

Maven, uma palavra iídiche que significa acumulador de conhecimento, foi originalmente iniciado como uma tentativa de simplificar os processos de construção no projeto Jakarta Turbine. Ele surgiu a partir da necessidade que os desenvolvedores tinham de uma melhor organização do projeto. Segundo relatos sobre a origem da ferramenta, havia vários projetos cada um com seus próprios arquivos de compilação Ant que eram todos ligeiramente diferentes e JARs foram verificados no CVS. Os desenvolvedores queriam uma maneira padrão de construir os projetos, uma definição clara do que o projeto consistia, uma maneira fácil de publicar informações do projeto e uma maneira de compartilhar JARs em vários projetos.
O resultado é uma ferramenta que agora pode ser usada para criar e gerenciar qualquer projeto baseado em Java. Esperamos ter criado algo que facilite o trabalho diário dos desenvolvedores Java e, geralmente, ajude na compreensão de qualquer projeto baseado em Java.

## Objetivos

O objetivo principal do Maven é permitir que um desenvolvedor compreenda o estado completo de um esforço de desenvolvimento no menor período de tempo. Para alcançar este objetivo, existem várias áreas de preocupação que Maven tenta lidar com:
* Tornar o processo de construção mais fácil
* Fornecer um sistema de construção uniforme
* Fornecer informações sobre projetos de qualidade
* Fornecer diretrizes para o desenvolvimento de melhores práticas
* Permitir migração transparente para novos recursos

## Motivos para usar Maven

10. Build: O Maven vai fazer o build de sua solução. Ele utiliza muito o conceito de convenção sobre configuração. Logo, se você colocar seus artefatos nas estruturas padrão do Maven, não será necessário configurar várias coisas que você configuraria com ant como o diretório de fontes, os recursos e para onde será gerado os binários.
9. Build Modular: No Maven os projetos são estruturados de forma modular. Quando eu faço o build no pai, ele faz o build para cada filho, isso é muito útil. Assim, não preciso recompilar todos os módulos, ou quando eu quero isso não preciso fazer um a um.
8. Cascateamento: Outra grande feature do Maven é o cascateamento de configurações. Graças a sua estrutura de hierarquias de POM. Desta forma eu não duplico configurações e todo o projeto filho de um POM herda todas as suas configurações. Com isso é possível fazer um balanceamento de configurações.
7. Plugins: No Maven tudo são plugins. O próprio core do Maven é feito de plugins, que vão desde o que faz o *clean* ao que gera o Javadoc ou o que gera estatísticas da qualidade do seu projeto. Além de existirem muitos plugins para o Maven, você ainda pode criar o seu próprio.
6. Gerência de Dependências: Quem já não ouviu falar do *jar hell*? Quando usamos muitos frameworks em Java através de vários projetos, gerenciar esses artefatos e
controlar as suas versões é um verdadeiro inferno. O Maven provê a gerência de jar, bem como de plugins. Esses artefatos não ficam em controle de versão. Isso mesmo, você não cria uma pasta *lib* e coloca os jars lá dentro, eles ficam no repositório local do Maven.
5. Consistência: No Maven tudo é igual, você faz todas as parametrizações através do arquivo pom.xml e tudo da mesma forma. E tem mais: o que você faz em um
projeto pode ser aproveitado em outro, aproveitando mesmo, que é diferente de copiar e colar.
4. Contexto e Informações: Com o Maven é possível ter de forma contextualizada as informações úteis do projeto. Ele pode gerar um site contendo:
* Lista de Desenvolvedores
* Links para o controle de versão
* Links para o sistema de build contínuo
* Links para o sistema de issue tracking
* Lista de discussão
* Dependências do projeto
* Resultado da execução dos testes
* Javadoc e documentação
E muito, muito mais. Pois tudo isso pode ser customizado e parametrizado. Tudo isso pode ser coletado e condensado no site de forma automática no Maven.
3. Ciclo de Vida: Diferente do ant, o Maven tem todo um ciclo de vida definido. Assim, à medida que algo vai acontecendo e ele vai mudando de estados no ciclo
de vida, determinados plugins (goals) serão executados. Você pode parametrizar o que você quer que aconteça em cada momento do ciclo de vida do Maven.
2. Foco na Qualidade: O Maven incentiva que se criem testes unitários. De forma que quando você faz o build ou gera um deploy em um servidor, ele roda todos os testes unitários. Caso algum teste unitário falhe, ele aborda o build/deploy. Essa é uma excelente política para forçar os testes e a qualidade de software.
1. Automatização: Foi complicado escolher qual seria a maior vantagem do Maven, então vou falar aqui de duas coisas. Primeiro, da automatização: com o Maven você atinge rapidamente um nível de automatização muito alto e com pouquíssima configuração. Essa automatização se reflete no processo de release de um versão do seu software que fica muito, mas muito mais simples com o Maven.
O outro ponto é a soma de tudo. O Todo do Maven é maior que a soma de suas partes, porque com tudo isso temos uma solução de gerência de configurações. De forma que o desenvolvedor novo senta na cadeira e, com um comando, o Maven baixa as dependências necessárias, roda os testes, configura o ambiente, baixa o servidor de aplicação, faz o deploy e abre o browser com a tela de login do sistema, tudo isso com um comando do Maven.

## Download

O Maven pode ser obtido através do aqui, diretamente no site da Apache.

## Instalação

Após o download, a instalação do Apache Maven é um processo simples de extrair o arquivo e adicionar a pasta bin com o comando mvn no PATH do Windows.
As etapas são:
* Confirmar se a variável de ambiente JAVA_HOME está definida e aponta para a instalação do JDK
* Extrair arquivo de distribuição em qualquer diretório
ou
De forma alternativa, você pode usar a ferramenta de extração de arquivos preferida.
3. Adicione o diretório bin do diretório criado apache-maven-3.3.9 para a variável de ambiente PATH.
4. Confirme com mvn -v em um novo shell. O resultado deve ser semelhante ao mostrado a seguir:

### No Windows

Verifique o valor da variável de ambiente:
Adicionando o caminho ao PATH: Adicione o diretório bin da distribuição descompactada à variável de ambiente PATH do usuário abrindo as propriedades do sistema (WinKey + Pause), selecionando a guia "Avançado" e o botão "Variáveis de Ambiente", adicionando ou selecionando a variável PATH nas variáveis do usuário com o valor C:\ Arquivos de programas\apache-maven-3.3.9\bin. A mesma caixa de diálogo pode ser usada para definir JAVA_HOME para o local de seu JDK, exemplo: C:\Arquivos de Programas\Java\jdk1.7.0_51
Abra um novo prompt de comando (Winkey + R digite cmd) e execute mvn -v para verificar a instalação.

### Em Sistemas Unix (Linux, Solaris e Mac OS X)

Verificar o valor das variáveis de ambiente:
Adicionando o caminho ao PATH:

## Exemplo

Projetos Maven são configurados usando um Project Object Model, que é armazenado em um arquivo pom.xml. A seguir está um exemplo mínimo:

### Plugins

A maioria das funcionalidades do Maven está em plugins. Um plugin fornece um conjunto de objetivos que podem ser executados usando a seguinte sintaxe:
Por exemplo, um projeto Java pode ser compilado com o objetivo de compilador do plugin de compilador, através da execução de mvn compiler:compile.

### Ciclos de vida de construção

Ciclo de vida de construção é uma lista de fases nomeadas que podem ser usadas para dar ordem ao objetivo de execução. Um dos ciclos de vida padrão do Maven é o default lifecycle, que inclui as seguintes fases, nesta ordem:

## Criando um projeto

Comando para criar um projeto Maven.
Estrutura de diretórios: