Maven
Definição
[editar | editar código-fonte]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.[1]
História
[editar | editar código-fonte]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.[2]
Objetivos[2]
[editar | editar código-fonte]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[3]
[editar | editar código-fonte]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
[editar | editar código-fonte]O Maven pode ser obtido através do aqui, diretamente no site da Apache.
Instalação[4]
[editar | editar código-fonte]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
unzip apache-maven-3.3.9-bin.zip
ou
tar xzvf apache-maven-3.3.9-bin.tar.gz
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:
Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T04:57:37-07:00)
Maven home: /opt/apache-maven-3.3.3
Java version: 1.8.0_45, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.8.5", arch: "x86_64", family: "mac"
No Windows
[editar | editar código-fonte]Verifique o valor da variável de ambiente:
echo %JAVA_HOME%
C:\Program Files\Java\jdk1.7.0_51
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)
[editar | editar código-fonte]Verificar o valor das variáveis de ambiente:
echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home
Adicionando o caminho ao PATH
:
export PATH=/opt/apache-maven-3.3.9/bin:$PATH
Exemplo[5]
[editar | editar código-fonte]
Projetos Maven são configurados usando um Project Object Model, que é armazenado em um arquivo pom.xml
. A seguir está um exemplo mínimo:
<project>
<!-- model version is always 4.0.0 for Maven 2.x POMs -->
<modelVersion>4.0.0</modelVersion>
<!-- project coordinates, i.e. a group of values which
uniquely identify this project -->
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0</version>
<!-- library dependencies -->
<dependencies>
<dependency>
<!-- coordinates of the required library -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<!-- this dependency is only used for running and compiling tests -->
<scope>test</scope>
</dependency>
</dependencies>
</project>
Plugins
[editar | editar código-fonte]A maioria das funcionalidades do Maven está em plugins. Um plugin fornece um conjunto de objetivos que podem ser executados usando a seguinte sintaxe:
mvn [plugin-name]:[goal-name]
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
[editar | editar código-fonte]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:
1. process-resources (processar recursos) 2. compile (compilar) 3. process-test-resources (processar recursos de teste) 4. test-compile (testar compilação) 5. test (testar) 6. package (empacotar) 7. install (instalar) 8. deploy (implantar)
Criando um projeto
[editar | editar código-fonte]Comando para criar um projeto Maven.
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Estrutura de diretórios:
my-app
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- com
| `-- mycompany
| `-- app
| `-- App.java
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java