Maven 2 - Clicks de Fernando Anselmo

Transcrição

Maven 2 - Clicks de Fernando Anselmo
Maven 2
Maven é uma popular ferramenta de construção Open Source para
projetos corporativos Java, projetado para realizar a maior parte do
trabalho repetitivo de um processo de construção. Maven utiliza uma
abordagem declarativa, onde a estrutura do projeto e conteúdo são
descritos, em seguida, a abordagem é baseada em tarefas utilizando o
Ant ou outros montadores tradicionais. Isso ajuda a garantir os padrões
da empresa a nível de desenvolvimento e reduz o tempo necessário para
escrever e manter os roteiros de construção. A declarativa é uma
abordagem do ciclo de vida usada pelo Maven 1 é, para muitos, foi uma
ruptura radical com as técnicas mais tradicionais de construção, o Maven
2 foi ainda mais longe nesse sentido.
Versão 1.0
Apostila destinada ao curso com carga horária de 16 (dezesseis) horas
Curso Maven 2
Sumário
1. Project Object Model (POM)..................................................................................................4
Objetivos do Maven...............................................................................................................4
O que é POM?.......................................................................................................................5
Mínimo POM..........................................................................................................................5
Uma rápida visão geral estrutural..........................................................................................6
Relacionamentos POM......................................................................................................7
Informações sobre o Projeto..............................................................................................7
Configurações da Construção...........................................................................................7
Construção do Ambiente...................................................................................................7
2. Estrutura de Diretório.............................................................................................................9
3. Ciclo de Vida Maven............................................................................................................10
Um Ciclo de Vida é feito de Fases.......................................................................................10
Fases são Compostas de Metas..........................................................................................11
Configurar o Projeto para usar o Ciclo de Vida...................................................................12
Empacotando...................................................................................................................12
Ciclo de Vida de Referência................................................................................................13
Ciclo de Vida: Default......................................................................................................13
Ciclo de Vida: clean.............................................................................................................14
Ciclo de Vida: site................................................................................................................14
4. Dependências Transitivas....................................................................................................15
Mediação de Dependência..................................................................................................15
Gerenciamento de Dependência.........................................................................................15
Dependências Excluídas.................................................................................................16
Dependências Opcionais.................................................................................................16
Obter uma Lista de Dependência Transitiva no Maven.......................................................16
Âmbito de dependência.......................................................................................................16
5. Escopo das Dependências..................................................................................................18
6. Configurações......................................................................................................................20
Configuração do Repositório Local......................................................................................20
Configuração do Proxy ........................................................................................................20
Configuração da Resolução Paralela do Artefato ...............................................................21
Configuração de Segurança e Implantação .......................................................................21
7. Archetypes............................................................................................................................22
Usando um Archetype .........................................................................................................22
8. Plugins..................................................................................................................................24
Meta help..............................................................................................................................25
Parâmetros de Configuração ..............................................................................................26
Mapeamento de Objetos Simples ..................................................................................26
Mapeamento de Objetos Complexos .............................................................................26
Mapeamento de Coleções...................................................................................................27
Listas de mapeamento ...................................................................................................27
Mapas de mapeamento ..................................................................................................28
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
2 de 41
Curso Maven 2
Configurando os Plugins de Construção.............................................................................28
Usando a tag <executions>.............................................................................................28
Usando a tag <dependencies>........................................................................................31
Usando a tag <inherited>................................................................................................32
Configurando os Plugins de Relatório.................................................................................32
Usando a tag <reportSets>..............................................................................................33
Usando a tag <inherited>................................................................................................33
9. Profiles..................................................................................................................................35
Diferentes tipos de profile....................................................................................................35
Acionando profiles................................................................................................................35
Detalhes sobre a ativação de profiles.............................................................................36
10. Erros comuns.....................................................................................................................38
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
3 de 41
Curso Maven 2
1. Project Object Model (POM)
Maven, uma palavra “iídiche” que significa Acumulador de Conhecimentos, foi
originalmente concebido como uma tentativa de simplificar os processos de construção do
projeto Jakarta Turbine. Existiam diversos projetos, e cada projeto possui seu próprio script
do Ant (que tem a função de construir os arquivos) independentes e diferentes.
Deveria existir uma forma padrão de construir os projetos, possuir uma definição clara do
que consiste os projetos, uma maneira simples para publicar as informações sobre o projeto,
sendo esta uma maneira de compartilhar os arquivos JARs em vários projetos. Como
resultado surgiu uma nova ferramenta que foi utilizada para a construção e o gerenciamento
de qualquer projeto baseado em Java.
Objetivos do Maven
O principal objetivo do Maven é permitir que um desenvolvedor compreenda o completo
estado de um esforço de desenvolvimento no mais curto espaço de tempo. Para atingir este
objetivo, há várias áreas de preocupação que o Maven procura resolver, tais como:
•
Tornar o processo de construção mais fácil e intuitivo;
•
Fornecer um sistema de construção uniforme;
•
Fornecer informações sobre a qualidade de projeto;
•
Fornecer orientações para o desenvolvimento das melhores práticas; e
•
Permitir uma migração transparente para novas funcionalidades.
Maven fornece muita informação útil do projeto, que, em parte, é retirado do POM (Project
Object Model) e em parte gerada pelos fontes do seu projeto. Por exemplo, o Maven
permite:
•
Alterar os documentos (logs) criados diretamente a partir de controle de origem;
•
Percorrer as fontes referenciadas;
•
Permitir listas de discussão entre os desenvolvedores;
•
Gerar listas entre os plugins de dependência; e
•
Relatórios unitários de testes.
Como o Maven melhora o conjunto de informações fornecidas todo o restante será mais
transparente para os usuários. Outros produtos também podem fornecer plugins para
permitir um novo conjunto de informações sobre o projeto juntamente com as informações
padrões fornecidas pelo Maven, todos ainda com base no POM.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
4 de 41
Curso Maven 2
O que é POM?
O coração de um projeto no Maven 2 é o Modelo de Objeto de Projeto (ou POM). O POM
contém uma descrição detalhada do projeto, incluindo informações sobre o versionamento,
gestão de configuração, dependências, recursos de aplicações e testes, os membros da
equipe, estrutura, e muito mais. O POM é um arquivo no padrão XML (pom.xml), inserido no
diretório home do projeto. Um simples exemplo desse arquivo pode ser visto abaixo:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.javaworld.hotels</groupId>
<artifactId>X25Database</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>Início Rápido ao Maven</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
O POM é a unidade fundamental de trabalho do Maven. É um arquivo XML que contém
informações sobre o projeto e detalhes de configuração usados pelo Maven para construir o
projeto. Contém valores padrões para a maioria dos projetos. Exemplos para isso é o
diretório de compilação, o alvo ou o diretório de origem, que é src/main/java, o diretório de
origem de teste é src/main/teste, e assim por diante.
O POM foi renomeado na Versão 1 de project.xml para pom.xml na Versão 2. Em vez de
existir um arquivo maven.xml que contém as metas que podem ser executadas, essas
metas ou plugins são agora configuradas no arquivo pom.xml. Ao executar uma tarefa ou
meta, devemos observar o arquivo POM no diretório atual. O POM é lido e recebe as
informações da configuração necessária, em seguida, executa a meta.
As configurações que podem ser especificadas no POM são as dependências do projeto, os
plugins ou objetivos que podem ser executados, os perfis de construção, e assim por
diante. Outras informações como a versão do projeto, descrição, desenvolvedores, listas de
discussão também podem ser especificadas.
Mínimo POM
O requisito mínimo para um POM são os seguintes:
•
modelVersion - deve ser definido para 4.0.0
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
5 de 41
Curso Maven 2
•
groupId - o id do grupo do projeto.
•
artifactId - a identificação do artefato (projeto)
•
version - a versão do artefato sob a determinado grupo
Aqui está um exemplo:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>x25.com.tutorial</groupId>
<artifactId>meu-exemplo</artifactId>
<version>1</version>
</project>
POM exige que seu groupId, artifactId, version serem configurados. Estes três valores
formam o nome do projeto totalmente qualificado. Isto é realizado, na forma de
<groupId>:<artifactId>:<versão>. Quanto ao exemplo acima, seu nome artefato totalmente
qualificado é "x25.com.tutorial:meu-exemplo:1".
Se os detalhes de configuração não são especificadas, Maven utilizará seus padrões. Um
desses valores padrão é o tipo de embalagens. Cada projeto Maven tem um tipo de
embalagem. Se não estiver especificado no POM, então o valor padrão "jar" será usado.
Além disso, podemos ver que no POM mínimo, os repositórios não foram especificados. Ao
construir seu projeto usando o POM mínimo, este herda toda configuração dos repositórios.
Portanto, quando o Maven vê as dependências no POM mínimo, essas dependências serão
resolvidas a partir de http://repo.maven.apache.org/maven2.
Uma rápida visão geral estrutural
O POM é grande e complexo, portanto, quebrando-o em pedaços é mais fácil de entendê-lo.
As peças são agrupadas em quatro unidades lógicas, como mostrado na seguinte figura:
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
6 de 41
Curso Maven 2
Relacionamentos POM
Os projetos devem se relacionar de alguma forma. Desde a criação dos primeiros
montadores, projetos de software tiveram dependências; Maven introduziu formas de
relações até então não utilizadas para os projetos Java. Essas relações são coordenadas
pelo Maven, baseados em dependências, herança do projeto e agregação.
Informações sobre o Projeto
Informações do POM são extremamente úteis. A ideia é que são usada para relatórios, no
entanto, não automaticamente qualificá-los como configurações de compilação. Os
elementos de informação do projeto são utilizadas apenas como parte de um processo de
construção e sem se envolver ativamente configurá-lo.
Configurações da Construção
Na parte da Configurações da Construção é onde o POM se torna interessante, pois temos à
carne real dele. Metade do poder do Maven se situa dentro dos dois elementos construir e
relatórios. Dividido em quatro partes:
•
Packaging – Este elemento descreve ao Maven que objetivos vincular sob o ciclo de
vida e oferece uma dica do tipo do projeto. Se não for especificado, então tipo padrão
será jar.
•
Properties – Este elemento é utilizado em todo POM e encaixes do Maven como um
substituto para os valores. Quando uma propriedade é definida, pode-se usar o nome
da propriedade como um valor em forma de ${nome}, que será substituído pelo valor
definido em tempo de execução.
•
Build – Este elemento contém informações que descrevem como construir um projeto
é para prosseguir quando executado. Contém todos os tipos de informações úteis,
tais como onde as vidas de código fonte ou como plugins são configurados. Muita
dessas informações são herdadas. Como quase tudo no POM, pode-se substituir
esses padrões (embora geralmente não recomendado).
•
Reporting – O Maven define mais do que o padrão de construção do ciclo de vida.
Uma das ideias mais impressionantes vem do ciclo de vida de geração site.
Determinados plug-ins podem gerar relatórios definidos e configurado sob os
relatórios elementos, por exemplo, gerar relatórios no padrão Javadoc. Muito
parecido com a capacidade do elemento de construção para configurar plug-ins,
relatando comandos com a mesma capacidade.
Construção do Ambiente.
A maioria dos elementos aqui são descritivos do tipo de estilo de vida no qual um projeto
torna-se confortável. Elementos por nomes como ciManagement (Continuum,
CruiseControl), issueManagement (Bugzilla), scm (CVS, Subversion), e mailingLists (emails e arquivos) com todo o esboço dos programas e as configurações para a construção
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
7 de 41
Curso Maven 2
do sistema.
Como vimos, o Maven 2 POM é grande. Isso é, sem dúvida. No entanto, seu tamanho é
também prova de sua versatilidade. A capacidade de abstrair todos os aspectos de um
projeto em um único artefato poderoso. Longe estão os dias de dezenas de roteiros
diferentes de construção e documentação dispersa sobre cada projeto individual.
Junto com tudo que compõem o Maven 2 existe um bem definido ciclo de vida de
construção, escrita simplificada e manutenção dos plugins, repositórios centralizados, todo o
sistema com base em configurações, e um número crescente de ferramentas para tornar o
trabalho do desenvolvedor mais fácil de modo a manter projetos complexos.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
8 de 41
Curso Maven 2
2. Estrutura de Diretório
O Maven, possui uma estrutura de diretório comum, que permite quando os usuários
estiverem familiarizados com um projeto do Maven, imediatamente se sentirão confortáveis
com qualquer outro projeto Maven. As vantagens são análogas a adoção de um site – wide
– look and feel. A próxima seção documenta o layout de diretório esperada pelo Maven e o
diretório layout criado pelo Maven:
y
src/
main
/jav
a
Arquivos
fontes da
Aplicação /
Biblioteca
src/
main
/res
ourc
es
Recursos
Aplicação /
Biblioteca
src/
main
/fil
ters
Arquivos
de recursos
de filtro
src/
main
/ass
embl
Descritores
de
montagem
src/main/config
Arquivos de configuração
src/main/scripts
Aplicação / Biblioteca de scripts
src/main/webapp
Fontes da Aplicação Web
src/test/java
Programas fontes de teste
src/test/resources
Recursos de teste
src/test/filters
Arquivos de teste para recurso de filtro
src/site
Site do projeto
LICENSE.txt
Licença do Projeto
NOTICE.txt
Avisos e bibliotecas que o projeto depende
README.txt
Leia-me do Projeto
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
9 de 41
Curso Maven 2
Para os arquivos de alto nível descritivo do projeto, um arquivo pom.xml (e quaisquer
propriedades, maven.xml ou se estiver usando Ant build.xml). Além disso, existem
documentos textuais voltados para o que usuário seja capaz de compreender o projeto
imediatamente ao abrí-lo: README.txt, NOTICE.txt ou LICENSE.txt
Há apenas dois subdiretórios desta estrutura: src e target. Os outros diretórios que seriam
esperados aqui são metadados como CVS ou .svn, e quaisquer subprojetos em uma
compilação multi projeto (cada um dos quais seriam definidos como acima). O diretório
target é usado para abrigar toda a produção da construção.
O diretório src contém todo o material fonte para a construção do projeto, site e assim por
diante. Contém um subdiretório para cada tipo: main para o artefato principal de construção,
test para as unidades de teste e de recursos e site. Dentro de diretórios artefato produtoras
de origem (ou seja, principal e teste), há um diretório para a linguagem Java (em que a
hierarquia existe pacote normal), e outro para os recursos (a estrutura que é copiado para o
destino classpath dada a definição de recurso padrão). Se existem outras fontes que
contribuem para construir o projeto, que seriam em outros subdiretórios, como por exemplo
“src/main/antlr” conteria os arquivos de definição ANTLR.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
10 de 41
Curso Maven 2
3. Ciclo de Vida Maven
O Maven 2.0 é baseado no conceito central de um ciclo de vida de construção. O que isto
significa é que o processo para construir e distribuir um artefato particular (projeto) é
claramente definida. Para o desenvolvedor que constrói um projeto, isso significa que só é
necessário conhecer um pequeno conjunto de comandos para construir qualquer projeto
Maven, e o POM assegura que se obtenha os resultados desejados.
Há três built-in para construir os ciclos de vida:
•
default – lida com a implantação do projeto
•
clean – lida com a limpeza do projeto
•
site – lida com a criação da documentação do projeto.
No Maven 2, esta noção é padronizada em um conjunto conhecido e definido, entre as fases
do ciclo de vida. Em vez de invocar plug-ins, o desenvolvedor invoca uma fase do ciclo de
vida, por exemplo, $mvn compile.
Um Ciclo de Vida é feito de Fases
Cada um dos ciclos de vida é definido por uma lista diferentes de fases, no qual uma fase de
construção representa uma fase no ciclo de vida. Por exemplo, o ciclo de vida default possui
as seguintes fases:
•
validate – validar o projeto e disponibiliza todas as informações necessárias.
•
compile – compilar o código fonte do projeto.
•
test – testar o código-fonte compilado usando um framework de testes unitário
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
11 de 41
Curso Maven 2
adequado. Estes testes não devem exigir que o código seja compilado ou implantado.
•
package – empacotar o código compilado em seu formato distribuível, como um JAR.
•
integration-test – processar e implantar o pacote se necessário em um ambiente
onde os testes de integração podem ser executados.
•
verify – executar todos os controles para verificar se o pacote é válido e atenda aos
critérios de qualidade.
•
install – instalar o pacote no repositório local, para uso como uma dependência em
outros projetos localmente.
•
deploy – copiar o pacote final para o repositório remoto para compartilhar com outros
desenvolvedores e projetos, realizado em um ambiente de integração ou de release.
Estas fases de construção são executados sequencialmente para completar o ciclo de vida
default. Significa que quando o ciclo de vida default for usado, o Maven primeiro valida o
projeto, compila os fontes, executa os testes, processa o pacote binário (por exemplo, jar),
executa os testes de integração, verifica o pacote, instala o pacote verificado para o
repositório local, e, em seguida, implanta o pacote instalado em um ambiente específico.
Para realizar tudo, só é necessário chamar a última fase de construção e executá-la, neste
caso, deploy:
mvn deploy
Isso porque ao chamar uma fase de construção, será executado todas as fases que esta
depende. Desta forma, ao ser executado o comando:
mvn integration-test
Todas as fases de construção antes de executar a integração de teste (validar, compilar
pacotes, etc) serão realizadas.
Há mais comandos que fazem parte do ciclo de vida, o que será discutido nas secções
seguintes. Também deve ser observado que o mesmo comando pode ser usado em um
cenário multi-módulo (isto é, um projecto com um ou mais subprojetos). Por exemplo:
mvn clean install
Este comando percorre todos os subprojetos e executa uma limpeza, em seguida, instala
incluindo todas as etapas anteriores.
Fases são Compostas de Metas
No entanto, apesar de uma fase de construção ser responsável por um passo específico no
ciclo de vida de construção, a maneira pela qual são realizas as responsabilidades pode
variar. E isso é feito, declarando as metas vinculadas a essas fases de construção.
Uma meta representa uma tarefa específica (mais específica do que uma fase de
construção), que contribui para a construção e gestão de um projeto. Pode ser ligado a zero
ou mais fases de construção. Uma meta não está vinculada a qualquer fase de construção e
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
12 de 41
Curso Maven 2
pode ser executada fora do ciclo de vida de construção por uma invocação direta. A ordem
de execução depende da ordem no qual a(s) meta(s) da(s) fase(s) de construção e(são)
chamada(s). Por exemplo, considere o seguinte comando:
mvn clean dependency:copy-dependencies package
clean e package são fases enquanto que dependency:copy-dependencies é uma meta.
Quando executado, a fase clean será realizada em primeiro lugar (o que significa que vai
executar todas as fases precedentes do ciclo de vida), e, em seguida, a meta
dependency:copy-dependencies, e finalmente a fase package (e todo o ciclo de vida
precedente).
Se uma meta está ligada a uma ou mais fases de construção, será chamado as metas em
todas as fases. Além disso, uma fase pode também ter zero ou mais metas ligadas a ele. Se
uma fase de construção não tem metas vinculadas, a fase não será executada. Mas se tiver
uma ou mais metas vinculados a fase, irá executar todas essas metas.
Configurar o Projeto para usar o Ciclo de Vida
O ciclo de vida é muito simples de usar, ao construir um projeto no Maven, devemos
proceder a atribuição das metas a cada uma das seguintes fases.
Empacotando
A primeira forma, e mais comum, é definir um pacote para o seu projeto através do elemento
de POM denominado <packaging>. Alguns dos valores válidos são pacotes jar, war, ear e
pom. Se nenhum valor do pacote for especificado, o padrão será jar.
Cada pacote contém uma lista de objetivos para se ligar a uma fase particular. Por exemplo,
o pacote irá vincular as seguintes metas para a construção das fases do ciclo de vida
default.
process-resources
resources:resources
compile
compiler:compile
process-test-resources
resources:testResources
test-compile
compiler:testCompile
test
surefire:test
package
jar:jar
install
install:install
deploy
deploy:deploy
Este é um conjunto padrão de ligações, no entanto, alguns pacotes podem lidar de forma
diferente. Por exemplo, um projeto que é puramente metadados (valor do pacote é pom) só
liga as metas para as fases install e deploy.
Observe que, para alguns tipos de pacote estajam disponíveis, precisamos incluir um plugin
na seção <build> do seu POM e especificar <extensions>true</extensions> para esse
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
13 de 41
Curso Maven 2
plugin. Um exemplo de um plugin é o Plexus, que fornece um pacote plexus-application e
plexus-service.
Ciclo de Vida de Referência
Vejamos uma lista para todas as fases do ciclo de vida: default, clean e site, que são
executados na ordem dada até o ponto que foi especificado.
Ciclo de Vida: Default
validate
Verificar se o projeto está correto e todas as informações
necessárias disponíveis
initialize
Inicializar o estado de construção do projeto, por exemplo,
define as propriedades ou cria os diretórios necessários
generate-sources
Gerar qualquer código-fonte para a inclusão na compilação
process-sources
Processar o código fonte, por exemplo, para filtrar quaisquer
valores
generate-resources
Gerar recursos para a inclusão no pacote
process-resources
Copiar e processar, os recursos para o diretório destino,
prontos para o empacotamento
compile
Compilar o código fonte do projeto
process-class
Pós-processar os arquivos gerados a partir da compilação,
por exemplo, criar os bytecodes para as classes Java
generate-test-sources
Gerar qualquer código fonte de teste para inclusão na
compilação
process-test-sources
Processar o código-fonte de teste, por exemplo, para filtrar
quaisquer valores
generate-test-resources Criar recursos para o teste
process-test-resources
Copiar e processar, os recursos para o diretório de destino de
teste
test-compile
Compilar o código fonte de teste no diretório de teste do
destino
process-test-compile
Pós-processar os arquivos gerados a partir da compilação de
teste, por exemplo, os bytecode em classes Java. Para
Maven 2.0.5 ou superior
test
Executar os testes usando um framework de teste unitário
adequado. Estes testes não devem exigir o código ser
empacotado ou implantado
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
14 de 41
Curso Maven 2
prepare-package
Realizar todas as operações necessárias para preparar um
pacote antes da embalagem real. Isso geralmente resulta em
uma versão descompactada, processados do pacote (Maven
2.1 ou superior)
package
Obter o código compilado e empacotá-lo em seu formato
distribuível, como um jar
pre-integration-test
Executar as ações necessárias antes dos testes de
integração serem executados. Isto pode envolver coisas
como a criação do ambiente necessário
integration-test
Implantar o processo necessário em um ambiente onde os
testes de integração podem ser executados
post-integration-test
Executar as ações necessárias após os testes de integração
serem executados. Isso pode inclusive realizar uma limpeza
no ambiente
verify
Executar todos os controles para verificar se pacote é válido
e atende aos critérios de qualidade
install
Instalar o pacote no repositório local, para uso como uma
dependência em outros projetos localmente
deploy
Copiar o pacote final para o repositório remoto, realizado no
ambiente de integração ou de release, para compartilhar com
os outros desenvolvedores e projetos
Ciclo de Vida: clean
pre-clean
Executar os processos necessários antes do processo de limpeza
clean
Remover todos os arquivos gerados pela compilação anterior
post-clean
Executar os processos necessários para finalizar o processo de limpeza
Ciclo de Vida: site
pre-site
Executar os processos necessários antes da geração do projeto
site
Gerar a documentação do projeto
post-site
Executar os processos necessários para finalizar a geração, e se preparar
para a implantação
site-deploy
Implantar a documentação do site gerado para o servidor Web
especificado
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
15 de 41
Curso Maven 2
4. Dependências Transitivas
A gestão de dependência é uma das características da Maven que é mais conhecida sendo
uma das áreas onde este se destaca. Não há muita dificuldade em gerir as dependências de
um único projeto, mas ao lidar com projetos e aplicações multi módulos que consistem de
dezenas ou centenas de módulos, o Maven será uma ferramenta imprescindível na
manutenção de um elevado grau de controle e estabilidade.
Dependências transitivas são um novo recurso no Maven 2.0. Permite evitar a necessidade
de descobrir e especificar as bibliotecas que suas próprias dependências exigem, e incluí-los
automaticamente. Este recurso é facilitado através da leitura dos arquivos de projeto de suas
dependências dos repositórios remotos especificados.
Em geral, todas as dependências desses projetos são usados no projeto, assim como
qualquer outra que o projeto herda de seus pais, ou de suas dependências, e assim por
diante. Não existe um limite para o número de níveis que as dependências podem ser
colhidos, e só vai causar um problema se uma dependência cíclica é descoberto. Com
dependências transitivas, o gráfico de bibliotecas incluídas pode rapidamente crescer
bastante. Por esta razão, há alguns recursos adicionais que limitam quais dependências
estão incluídos.
Mediação de Dependência
É o que determina qual a versão de uma dependência que será usada quando várias
versões de um artefato forem encontrados. Atualmente, Maven 2.0 suporta o uso de "a
definição mais próxima", que significa que usará a versão mais próxima da dependência ao
projeto na árvore de dependências. Sempre podemos garantir uma versão, declarando-o
explicitamente no POM do projeto. Observe que, se duas versões de dependência estão na
mesma profundidade na árvore de dependência, até Maven 2.0.8 não foi definido qual seria,
mas desde o Maven 2.0.9 é a ordem na declaração que conta.
"A Definição Mais Próxima" significa que a versão utilizada será a mais próxima do projeto
na árvore de dependências, por exemplo. se as dependências de A, B e C são definidas
como por exemplo: A → B → C → D 2.0 e A → E → D 1.0, então D 1.0 será utilizado na
construção porque o caminho de A para D através de E é mais curto. Podemos adicionar
explicitamente uma dependência para D 2.0 em A para forçar seu uso.
Gerenciamento de Dependência
Permite que os autores do projeto especifiquem diretamente as versões dos artefatos a
serem usados quando são encontrados em dependências transitivas ou em dependências
onde nenhuma versão for especificada. No exemplo da secção anterior de uma dependência
que foi diretamente adicionada a uma, mesmo que não seja diretamente utilizado por A. Em
vez disso, A pode incluir D como uma dependência na sua seção dependencyManagement e
controlar diretamente qual a versão de D será utilizada quando, ou se, for referenciada.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
16 de 41
Curso Maven 2
No âmbito de dependência lhe permite incluir apenas as dependências adequadas para a
fase atual da construção.
Dependências Excluídas
Se o projeto X depende do projeto Y, e o projeto Y depende do projeto Z, o dono do projeto X
pode excluir explicitamente o projeto Z como uma dependência, usando o elemento
"exclusion".
Dependências Opcionais
Se o projeto Y depende do projeto Z, o proprietário do projeto Y pode marcar o projeto
como uma dependência opcional, usando o elemento "optional". Quando o projeto
depende do projeto Y, X dependerá apenas Y, e não da dependência opcional do projeto
em Z. O dono do projeto X pode então adicionar explicitamente uma dependência para
projeto Z.
Z
X
Y
o
Obter uma Lista de Dependência Transitiva no Maven
Ao necessitar encontrar a lista de dependências transitivas, de modo a excluir dependências
desnecessárias. Adicione o seguinte plugin ao Maven:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
</plugin>
</plugins>
</build>
Use a meta dependency:tree:
mvn clean install dependency:tree
Âmbito de dependência
Utilizado para limitar a transitividade de uma dependência, e também afeta o classpath
utilizado para as diversas tarefas de construção. Existem seis escopos disponíveis:
•
compile – é o escopo padrão, usado se nenhum outro for especificado.
Dependências de compilação estão disponíveis em todos os caminhos da classe de
um projeto. Além disso, as dependências são propagadas para projetos dependentes.
•
provided – similar ao escopo “compile”, porém indica que esperamos que o JDK ou
um contêiner forneça a dependência em tempo de execução. Por exemplo, ao
construir um aplicativo Web para a plataforma Java EE, devemos definir a
dependência da API Servlet e API Java EE relacionadas ao âmbito previsto porque o
contêiner Web fornece essas classes. Esta aplicação está disponível apenas para a
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
17 de 41
Curso Maven 2
compilação e teste do classpath, e não é transitiva.
•
runtime – indica que a dependência não é necessária para a compilação, mas para a
execução. Classpaths são usados em tempo de execução e teste, mas não em tempo
de compilação.
•
test – indica que a dependência não é necessária para a utilização normal da
aplicação, e está disponível apenas para a compilação de teste e fases de execução.
•
system – semelhante ao “provided”, exceto que devemos fornecer o JAR que o
contém explicitamente. O artefato está sempre disponível.
•
import (disponível apenas em Maven 2.0.9 ou posterior) – usado apenas em uma
dependência do tipo POM na seção <dependencyManagement>. Indica que o POM
especificado deve substituir as dependências do POM. Uma vez que as
dependências são substituídas, o escopo “import” não participa na limitação da
transitividade de uma dependência.
Cada um dos escopos (exceto para “import”) afeta as dependências transitivas de diferentes
maneiras.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
18 de 41
Curso Maven 2
5. Escopo das Dependências
Dependências estão definidas na POM, e pode ser resolvido transitivamente. No entanto,
não é necessário todas as dependências em todas as situações. É por isso que
dependências podem ter um escopo definido. Além disso, existe a tag que se pode usar para
uma dependência.
<opcional>true</optional>
Observamos o comportamento de cada escopo em diferentes metas. Falamos que o projeto
atual pode possuir uma dependência e um projeto do usuário. O projeto atual é o projeto
cujo o POM estamos editando. A dependência é um projeto que depende diretamente do
usuário. Um projeto do usuário é um projeto que o projeto atual possui uma dependência
direta. Consequentemente, um usuário tem um projeto com dependência indireta sobre a
dependência. Também podemos presumir um mecanismo maven2-based (meta) para
executar os projetos finais. As seguintes fases do ciclo de vida são importantes:
•
compile: Compilar a principal fonte.
•
test: compilar o código fonte de teste e executar os testes. Isto requer a principal
fonte para ser compilado (o objetivo de teste depende do objectivo de compilação).
•
run: (não existente) objetivo que executa um artefato final. Obviamente, isto requer as
principais fontes para ser compilado (o objetivo executar depende do objectivo de
compilação).
•
assembly: Criar um montador com todos os tipos de detalhes necessários para o
artefato. Entre outros, este pode conter uma lib que contém bibliotecas externas do
projeto atual depende.
Além disso, é importante ver que algumas dependências que são necessárias para a
compilação (e testes), são opcionais para o uso do artefato em um projeto de usuário ou
para executá-lo se ele é um projeto final em si. Exemplos disso são a dependência da
exploração sobre o log4j-commons, hibernate, ehcache e c3po. Estes projetos ou
codificados de tal maneira que eles detectar se ou não uma biblioteca está disponível no
classpath, e usá-lo, se for, mas não é necessário.
Além disso, dependências indiretas não são necessariamente necessários para compilar um
projeto do usuário: o projeto atual pode depender da dependência internamente, mas não
mencionar a dependência em sua API que é usado pelo projeto do usuário. Assim, a
dependência não é necessário para compilar o projeto do usuário, mas pode ser pela
execução do projeto final. Os seguintes escopos de dependência são suportados:
•
compile: Esta dependência é necessária para a compilação do fonte principal
•
test: Esta dependência é necessária para compilar e executar os testes. Não é
necessário para compilar o fonte principal ou executar o artefato final
•
runtime: Esta dependência é necessária para o funcionamento do artefato final. Não
é necessária para a elaboração do fonte principal, compilar ou executar os testes
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
19 de 41
Curso Maven 2
•
provided: Esta dependência é necessária para compilar ou executar o artefato, mas
não é necessária para incluir no pacote, porque é fornecida pelo ambiente de
execução – por exemplo, jsp-api.jar é fornecido pelo contêiner Web, de modo que
não é necessário incluí-lo na pasta WEB-INF/lib
•
system: Esta dependência é necessária em alguma fase do ciclo de vida do seu
projeto, mas é um sistema específico. O uso deste escopo é desencorajado: É
considerado como uma espécie de recurso "avançado" que só deve ser usado
quando realmente compreender todas as implicações de seu uso, que pode ser
extremamente difícil se não impossível de quantificar.
O escopo “system”, por definição, torna a construção não portátil. Pode ser necessário em
certos casos. Este escopo inclui o elemento <systemPath> que aponta para a localização
física desta dependência de máquina local. É, portanto, utilizado para se referir a algum
artefato que deve estar presente na máquina local e não em um repositório; cujo caminho
pode variar de máquina para máquina. O elemento <systemPath> pode se referir a
variáveis de ambiente em seu caminho, tal como ${JAVA_HOME} por exemplo.
tag <optional />
Para o projeto atual:
Fase
Escopo
compile
test
run
assembly
compile
U
U
U
U
test
!
U
!
!
runtime
!
U
U
U
provided
U
!
!
!
Para um projeto de usuário que tem o projeto atual como uma dependência de compilação
com escopo:
Fase
compile
test
run
assembly
U!O
U!O
U!O
U!O
test
!
U
!
!
runtime
!
U!O
U!O
U!O
provided
U!O
!
!
!
Escopo
compile
Legenda:
U
Faça o download, use a dependência no classpath e inclua a dependência na montagem.
O!U
Faça o download, use dependência no classpath, a menos que a dependência seja <optional />. E inclua a dependência na
montagem, a menos que a dependência seja <optional />.
!
Dependência não é usada
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
20 de 41
Curso Maven 2
6. Configurações
A configuração do Maven ocorre em 3 níveis:
•
Project – configuração mais estática ocorre no arquivo pom.xml
•
Installation – esta é a configuração é adicionada para uma instalação Maven
•
User – esta é a configuração específica para um determinado usuário
A separação é bastante clara – Project define as informações que se aplica ao projeto, não
importa quem o está construindo, enquanto os outros perfis definem as configurações para o
ambiente atual.
Nota: a configuração Installation e User não podem ser utilizadas para adicionar
informações sobre o projeto compartilhado, por exemplo, definir <organization> ou
<distributionManagement> para toda a empresa. Para isso, devemos ter os projetos
herdados de um pom.xml pai de toda a empresa. Podemos especificar a configuração do
usuário em ${user.home}/.m2/settings.xml. Devemos observar que o arquivo de
configuração não é obrigatório, a configuração default será utilizada caso o arquivo não seja
encontrado.
Configuração do Repositório Local
A localização do repositório local pode ser modificada na configuração do usuário. O valor
padrão é ${user.home}/.m2/repository/.
<settings>
...
<localRepository>/path/to/local/repo/</localRepository>
...
</settings>
Configuração do Proxy
A configuração de um proxy também pode ser especificado no arquivo de configurações.
Podemos configurar um proxy para usar alguns ou todos os requests HTTP. O nome de
usuário e senha são necessários apenas se o proxy requer autenticação básica. Note que
versões posteriores pode apoiar e armazenar senhas em um armazenamento seguro de
chaves – no médio prazo. Certifique-se que o arquivo settings.xml (inserido em $
{user.home}/.m2/settings.xml) esta amarrado com as permissões adequadas para o
sistema operacional. A configuração nonProxyHosts aceita “wild cards” (curingas), e cada
host é separado pelo caractere |. Combina com o equivalente de configuração do JDK.
<settings>
...
<proxies>
<proxy>
<active>true</active>
<protocol>http</protocol>
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
21 de 41
Curso Maven 2
<host>proxy.somewhere.com</host>
<port>8080</port>
<username>proxyuser</username>
<password>somepassword</password>
<nonProxyHosts>www.google.com|*.somewhere.com</nonProxyHosts>
</proxy>
</proxies>
...
</settings>
Configuração da Resolução Paralela do Artefato
Por padrão, o Maven 2.1.0 ou superior, consegue baixar até 5 artefatos de grupos diferentes
simultaneamente. Para alterar o tamanho deste pool de thread, inicie o Maven configurando
o valor para o atributo -Dmaven.artifact.threads. Por exemplo, para baixar apenas três
artefatos de cada vez:
mvn -Dmaven.artifact.threads=1 clean install
Podemos configurar esta opção de forma permanente, para isso utilizamos a variável de
ambiente MAVEN_OPTS. Por exemplo:
export MAVEN_OPTS=-Dmaven.artifact.threads=3
Configuração de Segurança e Implantação
Os repositórios que são utilizados para implantar um projeto são definidos na seção
<distributionManagement>. No entanto, não é aconselhável colocar o nome de usuário,
senha ou outras configurações de segurança nesse projeto. Por essa razão, devemos
adicionar uma definição de servidor para as suas próprias definições com um id que
corresponde à implantação do repositório do projeto. Além disso, alguns depósitos podem
exigir a autorização para baixar a partir de. Por isso as configurações correspondentes
podem ser especificadas em um elemento de servidor da mesma maneira. Quais
configurações são necessárias dependerá do tipo de repositório que estamos implantando. A
partir do primeiro lançamento, apenas implantações SCP e implantações de arquivos são
suportados por padrão, portanto, apenas a configuração SCP são necessárias:
<settings>
...
<servers>
<server>
<id>repo1</id>
<username>repouser</username>
<password>senha</password>
<privateKey>/path/to/identity</privateKey> (default is ~/.ssh/id_dsa)
<passphrase>frase lembrança</passphrase>
</server>
...
</servers>
...
</settings>
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
22 de 41
Curso Maven 2
7. Archetypes
Um Archetype (Arquétipo) é um projeto Maven Templating Toolkit. Archetype é definido
como um padrão original ou modelo a partir do qual todas as outras coisas do mesmo tipo
são feitos. Os nomes se encaixam como estamos tentando fornecer um sistema que fornece
um meio consistente de geração para os projetos Maven.
Isso ajuda os desenvolvedores a criar modelos de projeto do Maven para os usuários, e
oferece aos usuários os meios para gerar versões parametrizadas desses modelos de
projeto.
O uso de Archetypes proporciona uma boa maneira de permitir rapidamente que os
desenvolvedores de uma forma consistente empregar as melhores práticas por seu projeto
ou organização. Dentro do projeto Maven usamos Archetypes para tentar conseguir nossos
usuários em funcionamento o mais rapidamente possível, proporcionando um projeto de
exemplo que demonstra muitas das características do Maven, introduzir novos usuários para
as melhores práticas empregadas pelo Maven.
Em questão de segundos um novo usuário pode ter um projeto Maven pronto para usar
como trampolim de modo a investigar novos recursos. Também podemos criar um
mecanismo adicional ao Archetype e por isso entendemos que permite partes de um projeto
a ser capturado em um outro Archetype de modo que as partes ou aspectos de um projeto
podem ser adicionados a outros projetos existentes.
Um bom exemplo disso é o Archetype do site do Maven. Se já usou o Archetype “quick
start” para gerar um projeto de trabalho no qual se pode rapidamente criar um site para que
o projeto usando o Archetype do site dentro desse projeto existente. Também não
precisamos fazer nada parecido com os Archetypes.
Ao padronizar o desenvolvimento Java EE dentro de sua organização de modo que
podemos fornecer Archetypes para os EJB, ou WAR, ou para os seus Web Services. Uma
vez que esses Archetypes são criados e implantados no repositório da sua organização
estão disponíveis para utilização por todos os desenvolvedores em sua organização.
Usando um Archetype
Para criar um novo projeto baseado em um Archetype, é necessário chamar a meta mvn
archetype:generate, como o seguinte codificação:
mvn archetype:generate
Maven fornece vários artefatos:
Archetype ArtifactIds
Descrição
maven-archetype-archetype
Contém uma amostra de um simples arquétipo
maven-archetype-j2ee-simple
Contém uma amostra Simplificado aplicação Java EE
maven-archetype-mojo
Contém uma amostra de uma amostra plugin Maven
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
23 de 41
Curso Maven 2
maven-archetype-plugin
Contém uma amostra plugin Maven
maven-archetype-plugin-site
Contém um exemplo do site do plugin Maven
maven-archetype-portlet
Contém uma amostra JSR-268 Portlet
maven-archetype-quickstart
Contém uma amostra projeto Maven
maven-archetype-simple
Contém um projeto Maven simples
maven-archetype-site
Contém um site Maven amostra que demonstra alguns
dos tipos de documentos suportados como APT, xdoc,
e FML e demonstra como a i18n seu site
maven-archetype-site-simple
Contém uma amostra de um site Maven
maven-archetype-webapp
Contém uma amostra de um projeto webapp Maven
Arquétipos são empacotados em um JAR e consistem nos Archetypes metadados que
descreve o conteúdo do arquétipo e um conjunto de modelos do Velocity que compõem o
projeto de protótipo.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
24 de 41
Curso Maven 2
8. Plugins
No Maven, existe os plugins de construção e de relatórios:
•
Plugins de Construção: são executados durante a compilação e, em seguida,
devem ser configurados no elemento <build/>.
•
Plugins de Relatório: são executados durante a geração local e devem ser
configurados no elemento <reporting/>.
Todos plugins devem ter o mínimo de informações necessárias: groupId, artifactId e
version. Recomenda-se sempre definir cada versão dos plugins utilizados pela construção
de modo a garantir a reprodutibilidade da construção.
Uma boa prática é inseri-los nos elementos <build><pluginManagement/></build> para
cada plugin de construção (em geral, definimos um elemento <pluginManagement/> em um
POM). Para os plugins de relatório, devemos especificar cada versão no elemento
<reporting><plugins/></reporting>.
A configuração genérica dos plugins (compilação e comunicação) são especificados em um
elemento <configuration> onde os elementos filhos do elemento <configuration> são
mapeados para os campos, ou métodos SET padrão, dentro do Mojo (lembre-se que um
plug-in consiste em um ou mais Mojos onde alguns mapas Mojo servem para um objetivo).
Digamos, por exemplo, tivemos um Mojo que realiza uma consulta em uma URL específica,
com um tempo limite especificado e lista de opções. Um Mojo pode se parecer com o
seguinte:
public class MyQueryMojo extends AbstractMojo {
private String url; // expression="${query.url}"
private int timeout; // default-value="60"
private String[] options;
public void execute() throws MojoExecutionException {
...
}
}
Para configurar o Mojo de seu POM com a URL desejada e tempo de espera, e as opções
que podemos utilizar se parecem com:
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-myquery-plugin</artifactId>
<version>1.0</version>
<configuration>
<url>http://www.foobar.com/query</url>
<timeout>10</timeout>
<options>
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
25 de 41
Curso Maven 2
<option>one</option>
<option>two</option>
<option>three</option>
</options>
</configuration>
</plugin>
</plugins>
</build>
...
</project>
Como podemos observar os elementos na configuração coincidem com os nomes dos
campos no Mojo. O mecanismo de configuração que o Maven emprega é muito semelhante
à maneira como XStream trabalha onde os elementos em XML são mapeados para os
objetos. Assim, a partir do exemplo acima, podemos ver que o mapeamento é muito para a
frente os mapas do elemento URL para o campo url, os mapas de elementos de tempo limite
para o campo de tempo limite e os mapas opções de elementos para o campo de opções.
O mecanismo de mapeamento pode lidar com matrizes, inspecionando o tipo de campo e
determinar se um mapeamento adequado é possível. Para os Mojos que se destinam a ser
executados diretamente a partir da CLI, seus parâmetros geralmente fornecem um meio
para ser configurado através de propriedades do sistema em vez de uma seção
<configuration> no POM.
A documentação de plugin para esses parâmetros lista uma expressão que denota as
propriedades do sistema para a configuração. O parâmetro URL está associado com a
expressão ${query.url}, o que significa que seu valor pode ser especificado pela
propriedade query.url do sistema:
mvn myquery:query -Dquery.url=http://maven.apache.org
O nome da propriedade do sistema não corresponde necessariamente ao nome do
parâmetro Mojo. Embora esta seja uma prática bastante comum, muitas vezes devemos
notar que os plugins que utilizam algum prefixo para as propriedades do sistema evitam
conflitos de nome com outras propriedades do sistema. Embora raramente, também existem
parâmetros de plugin que (por exemplo, por razões históricas) empregar as propriedades do
sistema que são completamente alheios ao nome do parâmetro. Então não devemos
esquecer de ter um olhar mais atento sobre a documentação do plugin.
Meta help
Os mais recentes plugins do Maven possuem geralmente uma meta help para auxiliar uma
linha de comando na descrição do plugin, seus parâmetros e tipos. Por exemplo, para
entender o objetivo javadoc, chamamos:
mvn javadoc:help -Ddetail -Dgoal=javadoc
E como resposta veremos todos os parâmetros para a meta javadoc:javadoc,.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
26 de 41
Curso Maven 2
Parâmetros de Configuração
Mapeamento de Objetos Simples
Mapeamento de tipos simples, como um lógico ou um inteiro, é muito simples. O elemento
<configuration> pode ser semelhante a seguinte linha de código:
<configuration>
<myString>a string</myString>
<myBoolean>true</myBoolean>
<myInteger>10</myInteger>
<myDouble>1.0</myDouble>
<myFile>c:\temp</myFile>
<myURL>http://maven.apache.org</myURL>
</configuration>
Mapeamento de Objetos Complexos
Mapeamento de tipos complexos também podem ser utilizados pelo Maven, então vamos
verificar um simples exemplo, onde mapeamos uma configuração para o objeto Person. O
elemento <configuration/> pode ser semelhante a seguinte linha de código:
<configuration>
<person>
<firstName>Fernando</firstName>
<lastName>Anselmo</lastName>
</person>
</configuration>
As regras para o mapeamento de objetos complexos são os seguintes:
•
Deve haver um campo particular que corresponde ao nome do elemento que está
sendo mapeado. Assim, no nosso caso o elemento pessoa deve ser mapeado para
um campo de pessoa no mojo.
•
O objeto instanciado deve estar no mesmo pacote do Mojo. Portanto, se o mojo está
na com.mycompany.mojo.query então o mecanismo de mapeamento analisa o
pacote e procura um objeto chamado Person. Como podemos observar o mecanismo
capitaliza a primeira letra do nome do elemento e ao utilizar isso para buscar o objeto
para instanciar.
•
Se deseja que o objeto seja novamente instanciado em um pacote diferente ou ter um
nome mais complexo, então devemos especificar usando um atributo de execução
como o seguinte:
<configuration>
<person implementation="x25.com.mojo.query.SuperPerson">
<firstName>Fernando</firstName>
<lastName>Anselmo</lastName>
</person>
</configuration>
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
27 de 41
Curso Maven 2
Mapeamento de Coleções
O mecanismo de mapeamento de configuração pode facilmente lidar com a maioria das
coleções, então vejamos alguns exemplos como isso pode ser realizado.
Listas de mapeamento
Funciona quase da mesma maneira como o mapeamento de matrizes onde uma lista de
elementos serão mapeados para a lista. Então, podemos ter o seguinte mojo:
public class MeuAnimalMojo extends AbstractMojo {
private List animais;
public void execute() throws MojoExecutionException {
...
}
}
Onde temos uma coleção chamada animais, em seguida, essa seria a configuração para o
plug-in:
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-meuanimal-plugin</artifactId>
<version>1.0</version>
<configuration>
<animais>
<animal>gato</animal>
<animal>cachorro</animal>
<animal>cobra</animal>
</animais>
</configuration>
</plugin>
</plugins>
</build>
...
</project>
Onde cada um dos animais referidos seriam entradas na coleção animais. Diferentemente
de um array, uma coleção não possui nenhum tipo de componente específico. A fim de obter
o tipo de um item da lista, a estratégia a seguir é:
•
Se o elemento XML contém uma implementação do atributo hint, que é usado
•
Se a tag XML contém um “.”, tentamos isso como um nome de classe totalmente
qualificado
•
Tentar a tag XML (com a primeira letra maiúscula) como uma classe no mesmo
pacote que o mojo/objeto que está sendo configurado
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
28 de 41
Curso Maven 2
•
Se o elemento não tem filhos, assume seu tipo String. Caso contrário, a configuração
falha.
Mapas de mapeamento
De maneira semelhante, é possível definir mapas (java.util.Map) como o seguinte:
private Map meuMapa;
E então:
<configuration>
<meuMapa>
<key1>valor1</key1>
<key2>valor2</key2>
</meuMapa>
</configuration>
As propriedades podem ser definidas da seguinte maneira:
private Properties minhasPropriedades;
E então:
<configuration>
<minhasPropriedades>
<property>
<name>propriedadeNome1</name>
<value>propriedadeValor1</value>
<property>
<property>
<name>propriedadeNome2</name>
<value>propriedadeValor2</value>
<property>
</minhasPropriedades>
</configuration>
Configurando os Plugins de Construção
A seguir, veremos como configurar os Plugins de Construção no elemento <build>.
Usando a tag <executions>
Também podemos configurar um mojo usando a tag <executions>. Esta é maneira mais
comumente utilizada para os mojos que se destinam a participar em algumas fases do ciclo
de vida. Usando MyQueryMojo como um exemplo, podemos ter algo parecido com:
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-myquery-plugin</artifactId>
<version>1.0</version>
<executions>
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
29 de 41
Curso Maven 2
<execution>
<id>execucao1</id>
<phase>test</phase>
<configuration>
<url>http://www.foo.com/query</url>
<timeout>10</timeout>
<options>
<option>um</option>
<option>dois</option>
<option>tres</option>
</options>
</configuration>
<goals>
<goal>query</goal>
</goals>
</execution>
<execution>
<id>execucao2</id>
<configuration>
<url>http://www.bar.com/query</url>
<timeout>15</timeout>
<options>
<option>quatro</option>
<option>cinco</option>
<option>seis</option>
</options>
</configuration>
<goals>
<goal>query</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>
A primeira execução com id "execucao1" liga esta configuração com a fase “test”. A
segunda execução não possui uma tag <phase>, desta forma, as metas podem ter uma
fase de ligação padrão. Se o objetivo tem uma ligação de fase “default”, então executa essa
fase. Mas se o objetivo não está vinculado a qualquer fase do ciclo de vida, então
simplesmente não será executado durante o ciclo de vida “compile”.
Observe que, embora a execução do id tem que ser único entre todas as execuções de um
plugin dentro de um POM, não necessitam ser único em toda uma hierarquia de herança de
POMs. Execuções com o mesmo id em POMs diferentes são mesclados. O mesmo se
aplica às execuções que são definidas por perfis.
E se possuímos múltiplas execuções com diferentes fases ligadas a elas? Vamos usar o
exemplo anterior do POM, só que desta vez vamos ligar “execucao2” a uma fase.
<project>
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
30 de 41
Curso Maven 2
...
<build>
<plugins>
<plugin>
...
<executions>
<execution>
<id>execucao1</id>
<phase>test</phase>
...
</execution>
<execution>
<id>execucao2</id>
<phase>install</phase>
<configuration>
<url>http://www.bar.com/query</url>
<timeout>15</timeout>
<options>
<option>quatro</option>
<option>cinco</option>
<option>seis</option>
</options>
</configuration>
<goals>
<goal>query</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>
Se há várias execuções ligadas a diferentes fases, em seguida, o mojo é executado uma vez
para cada fase indicada. Significado, execucao1 será executado aplicando a definição da
configuração, quando a fase da construção for a de “test”, e execucao2 será executado
aplicando a configuração quando a fase “build” já está em instalação.
Agora, vamos ter um outro exemplo de mojo que mostra um padrão de ligação da fase do
ciclo de vida.
public class MyBindedQueryMojo extends AbstractMojo {
private String url; // expression="${query.url}"
private int timeout; // default-value="60"
private String[] options;
public void execute() throws MojoExecutionException {
...
}
}
A partir deste exemplo, MyBindedQueryMojo é, por padrão ligado à fase “package”. Mas, se
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
31 de 41
Curso Maven 2
desejamos executar esse mojo durante a fase “install” e não “package” podemos religar
esse mojo em uma nova fase do ciclo de vida usando a tag <phase> e <execution>.
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-myquery-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<id>execucao1</id>
<phase>install</phase>
<configuration>
<url>http://www.bar.com/query</url>
<timeout>15</timeout>
<options>
<option>quatro</option>
<option>cinco</option>
<option>seis</option>
</options>
</configuration>
<goals>
<goal>query</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>
Agora, MyBindedQueryMojo é a fase padrão que é pacote sobrescreveu a fase de
instalação. As configurações internas a tag <executions> diferem das configurações
externas no qual não podem ser utilizadas em uma chamada direta na linha de comando.
Em vez disso, só são aplicadas quando são obrigadas na fase do ciclo de vida.
Alternativamente, ao modificar uma seção da configuração fora da seção de execuções,
será aplicado globalmente para todas as invocações do plugin.
Usando a tag <dependencies>
Podemos configurar as dependências dos plugins de compilação, comumente usando uma
versão mais recente dependência. Por exemplo, o Plugin Antrun versão 1.2 usa o Ant
versão 1.6.5, se desejamos usar uma versão mais recente do Ant na execução deste plugin,
precisamos adicionar o elemento <dependencies>, conforme a seguinte codificação:
<project>
...
<build>
<plugins>
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
32 de 41
Curso Maven 2
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.2</version>
...
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-launcher</artifactId>
<version>1.7.1</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
...
</project>
Usando a tag <inherited>
Por padrão, a configuração do plug-in deve ser propagada para os POMs filhos, para
interromper a herança, podemos usar a tag <inherited>, conforme a seguinte codificação:
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.2</version>
<inherited>false</inherited>
...
</plugin>
</plugins>
</build>
...
</project>
Configurando os Plugins de Relatório
Para configurarmos os plugins de relatório usamos o elemento <reporting>. Configurar um
plugin de relatório no elemento <reporting> ou <build>, pois o POM NÃO realiza o mesmo
comportamento.
mvn site
São usados apenas os parâmetros definidos no elemento <configuration> de cada Plugin
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
33 de 41
Curso Maven 2
de Relatório especificado no elemento <reporting>, ou seja, sempre ignora os parâmetros
definidos no elemento <configuration> de cada plugin especificado no <build>.
mvn aplugin:areportgoal
Usamos os parâmetros definidos no elemento <configuration> de cada Plugin Relatório
especificado no elemento <reporting>; se um parâmetro não for encontrado, procura por um
parâmetro definido no elemento <configuration> de cada plugin especificado no <build>.
Usando a tag <reportSets>
É possível configurar um Plugin de Relatório utilizando a tag <reportSets>. Esta é mais
comumente usada para gerar relatórios seletivamente ao executar o comando mvn site.
Para gerar apenas o relatório da equipe do projeto, usamos a seguinte codificação:
<project>
...
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>2.1.2</version>
<reportSets>
<reportSet>
<reports>
<report>project-team</report>
</reports>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
...
</project>
Para eliminar todos os relatórios, precisamos usar:
<reportSets>
<reportSet>
<reports/>
</reportSet>
</reportSets>
Usando a tag <inherited>
Similar aos Plugins de Construção, para interromper a herança, podemos utilizar a tag
<inherited>:
<project>
...
<reporting>
<plugins>
<plugin>
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
34 de 41
Curso Maven 2
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>2.1.2</version>
<inherited>false</inherited>
</plugin>
</plugins>
</reporting>
...
</project>
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
35 de 41
Curso Maven 2
9. Profiles
Maven 2.0 é utilizado para grandes projetos e visa garantir que as compilações sejam
portáveis Entre outros detalhes, isso significa permitir uma configuração de compilação
dentro do POM, evitando que todas as referências do sistema de arquivos (herança,
dependências e outros locais), e voltado fortemente para o repositório local de modo a
armazenar os metadados necessários para tornar isso possível.
No entanto, às vezes a portabilidade não é inteiramente possível. Sob certas condições, os
plugins precisam ser configurados com os caminhos do sistema de arquivos locais. Por outro
lado, um conjunto de dependência ligeiramente diferente será necessária, e o nome do
projeto pode ter de ser ajustado manualmente. Em outras ocasiões, pode ser necessário
incluir um plugin para todo o ciclo de vida, dependendo do ambiente de construção
detectado.
Para responder a estas necessidades, o Maven 2.0 introduz o conceito de um profile (perfil)
de construção. Os profiles são especificados em um subconjunto de elementos disponíveis
no POM, e são disparados em uma variedade de maneiras. Modificar o POM em tempo de
compilação, são utilizados conjuntos complementares de parâmetros “equivalentes mas
diferentes” para um conjunto de ambientes destino (fornecendo, por exemplo, o caminho da
raiz aplicativo servidor no desenvolvimento de testes, e ambientes de produção). Como tal,
os profiles podem facilmente levar a resultados diferentes se construído por diferentes
membros de sua equipe. No entanto, se usados corretamente, os perfis podem ser usados
ao mesmo tempo preservando a portabilidade do projeto. Isto também minimiza o uso da
opção -f do Maven que permite ao utilizador para criar uma outra POM com diferentes
parâmetros de configuração ou para construir o que torna mais fácil de manter uma vez que
é executado em um único POM.
Diferentes tipos de profile
Existe diferentes formas para definir um profile que varia:
•
Por Projeto: no próprio POM (pom.xml)
•
Por Usuário: nas configurações do Maven (%USER_HOME%/.m2/settings.xml)
•
Global: nas configurações globais do Maven (%M2_HOME%/conf/settings.xml)
•
Profile descriptor: um descritor localizado no projeto basedir (profiles.xml)
Acionando profiles
Um profile pode ser acionado/ativado de várias maneiras:
•
Explicitamente
•
Através das configurações do Maven
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
36 de 41
Curso Maven 2
•
Com base em variáveis de ambiente
•
Configurações do Sistema Operacional
•
Arquivos presentes ou ausentes
Detalhes sobre a ativação de profiles
Os profiles podem ser explicitamente especificados usando a opção -P CLI. Esta opção tem
um argumento que é uma lista de profiles delimitada por vírgulas. Quando esta opção for
especificada, os profiles diferentes dos especificados no argumento será ativado.
mvn groupId:artifactId:goal -P perfil-1,perfil-2
Os profiles podem ser ativados nas configurações do Maven, através da seção
<activeProfiles>. Vejamos uma lista de elementos <activeProfile>, cada um contendo um
profile-ID.
<settings>
...
<activeProfiles>
<activeProfile>perfil-1</activeProfile>
</activeProfiles>
...
</settings>
Os profiles listados na tag <activeProfiles> seriam ativados por padrão cada vez que um
projeto for usá-lo. Os profiles podem ser acionados automaticamente com base no estado
detectado do ambiente de compilação. Estas ativações são especificadas através na seção
<activation> no próprio elemento <profile>. Atualmente, esta detecção é limitada a prefixo
de correspondência da versão do JDK, a presença de uma propriedade do sistema ou o
valor de uma propriedade do sistema. Vejamos o seguinte exemplo:
<profiles>
<profile>
<activation>
<jdk>1.4</jdk>
</activation>
...
</profile>
</profiles>
Intervalos também podem ser usados como no Maven 2.1. Para as seguintes versões 1.3,
1.4 e 1.5.
<profiles>
<profile>
<activation>
<jdk>[1.3,1.6)</jdk>
</activation>
...
</profile>
</profiles>
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
37 de 41
Curso Maven 2
Usar um limite superior, tal como, 1.5] não incluirá as modificações realizadas na versão 1.5,
pois possuem "patch" de liberação adicional, como por exemplo _05, que não é levado em
consideração na faixa. Este próximo exemplo ativa o profile com base nas configurações do
sistema operacional.
<profiles>
<profile>
<activation>
<os>
<name>Windows XP</name>
<family>Windows</family>
<arch>x86</arch>
<version>5.1.2600</version>
</os>
</activation>
...
</profile>
</profiles>
O seguinte profile é ativado quando o sistema de propriedade "debug" for especificado com
qualquer valor:
<profiles>
<profile>
<activation>
<property>
<name>debug</name>
</property>
</activation>
...
</profile>
</profiles>
O próximo exemplo irá acionar o profile quando o sistema de propriedade "environment"
(ambiente) for especificado com o valor "test" (teste):
<profiles>
<profile>
<activation>
<property>
<name>environment</name>
<value>test</value>
</property>
</activation>
...
</profile>
</profiles>
Para ativar este profile devemos digitar a seguinte linha de comando:
mvn groupId:artifactId:goal -Denvironment=test
Os profiles do Maven permitem uma parametrização do processo de construção com a
finalidade de permitir que a aplicação destino seja portátil para os diversos ambientes de
implantação.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
38 de 41
Curso Maven 2
10. Erros comuns
A "Síndrome Frustração Maven" é algo que muitos desenvolvedores já sofreram. Felizmente,
existem maneiras de colocar o Maven no caminho correto. Esta é uma lista de erros
ocorridos em muitos projetos e o que fazer com eles. A melhor parte de tudo isso é que
existem soluções rápidas para a maioria dos problemas.
Atualizar constantemente e usar o "install mvn"
Este é um problema muito comum. E sua correção trará benefícios para muitos dos pontos
abaixo. Aqui está uma declaração que pode ser encontrada em qualquer lugar na
documentação do Maven, devemos observar a seguinte máxima: "Todo artefato Maven tem
que ter uma pasta em um repositório do Maven". Isso significa que, na empresa, devemos
ter um repositório gerente, como “Arquivo” ou “Artefato”. Cada módulo desenvolvido deve
ser implantado para este repositório. Quando devemos implementar nossos artefatos? Após
cada execução bem-sucedida do servidor de compilação. Quando cada módulo for
implantado, a instalação do Maven buscará as dependências neste repositório, ou seja,
evitamos "para atualizar devemos instalar tudo". Ao trabalhar em um módulo, só devemos
construir o módulo. E os outros módulos serão transferidos automaticamente.
Resolver o erro "dependência não encontrado" copiando inteiramente a pasta m2
através do Memory Stick
Tão louco como essa solução se parece de maneira semelhante, a solução é ter um
repositório gerente. Uma vez que este está ligado corretamente, não teremos que repetir a
pergunta "Quem tem um cartão de memória?". Não devemos ter medo de limpar o
repositório local completamente, já que a velocidade de download do gerenciador de
repositório local é muito rápida.
Resolver problemas de dependências, como a falta das versões antigas dos artefatos,
obtendo um arquivo mais recente, mudando a versão no POM e depois instalar esse
módulo
Considere um cenário no qual foi modificado a versão de um módulo de 1.3 para 1.4. Só que
nunca mais foi utilizado este projeto que continua na versão 1.3. Só que agora existe um
outro módulo que depende da 1.3. É possível procurar no histórico a última modificação do
módulo, onde a versão ainda era a 1.3 e reatualizar para essa versão e reinstalá-la. Ou
podemos fazer uma modificação no último check-out 1.4 – 1.3, instalar e depois cruzar os
dedos e esperar que tudo funcione. Concordem que isso não é uma boa solução. Mais uma
vez, se a empresa possui um repositório gerente, e se houvesse ao menos uma construção
bem sucedida, então a versão 1.3 estaria nesse repositório.
Possuir arquivos do tipo Shell Scripts que percorrem as pastas de destino de seus
módulos para criar um arquivo zip
O Maven possui uma maneira de realizar essa tarefa, chamado de "conjuntos". Não é o
método mais fácil de configurar, mas após configurá-lo, irá se integrar com o Maven em uma
maneira muito mais suave do que a maioria das soluções “caseiras” de scripts. Existem
várias coisas que podem dar errado com esses scripts, uma vez que as versões começam a
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
39 de 41
Curso Maven 2
mudar, os módulos são movidos e assim por diante. Isso é uma questão de utilizar a
ferramenta correta para fazer o trabalho. Isto também significa que é possível criar um
montador e implantá-lo no repositório do Maven.
Possuir muitos arquivos XML em seus POMs cuja única finalidade é copiar os
arquivos em suas pastas
Maven não foi construído para simplesmente copiar arquivos. Se tudo que deseja fazer é
copiar um artefato (um arquivo WAR, EAR ou ZIP), pode ser muito mais fácil criar um script
no ANT para realizar esse trabalho.
A compilação é constantemente interrompida e mostrada a mensagem "verificação de
atualizações de xxx-repo" e não existe motivo
Este é um problema que poucos desenvolvedores conseguem encontrar a causa raiz. Talvez
a demora é uma boa desculpa para ir buscar um café. De qualquer forma, uma causa
comum deste problema é a existência de muitas dependências e um considerável número
de repositórios listados em seus arquivos POM. Maven não tem noção de que o artefato
deve verificar em qual repositório, por isso felizmente olha para atualizações de todos os
artefatos e em todos os repositórios. Mais uma vez o truque é usar um repositório
gerenciador. Ao configurar a instalação do Maven para procurar os artefatos neste
repositório (através da criação de um espelho na sua settings.xml), Maven verificaria
unicamente neste local. Então, uma vez que este servidor é local, tudo será realizado
rapidamente. É importante aqui que o repositório gerente seja configurado corretamente.
Ao trabalhar em um ramo, a construção de outro ramo pode falhar (ou seja, as
bibliotecas devem ser boas suficiente para todos)
Existem algumas coisas que devemos lembrar de fazer ao criar um “ramo” do seu projeto.
Informar ao servidor de compilação para construir este ramo e mudar a versão em seus
arquivos POM. Ao negligenciar este último, os problemas surgirão ao alterar uma assinatura
de um método em seu ramo, e tentar desenvolver novamente. Existe uma meta no plugin
release chamada "branch", então através do comando "mvn release:branch", o Maven
renomeará automaticamente as versões nos POMs.
Toda empresa possui uma dependências interna com o final -SNAPSHOT
A ideia de um snapshot pode parecer reconfortante para os desenvolvedores. Está quase
pronto, porém cedo ou tarde, teremos que liberar o módulo. Existem alguns problemas como
ficar com um snapshot eternamente. Primeiro, a diminuição de sua construção, pois o
Maven deve verificar o último snapshot dos repositórios remotos. Segundo, ao depender de
um snapshot, fica difícil reconhecer qual versão se está dependendo. Ao depender de um
módulo interno da empresa que funciona do jeito que está agora, pode ser uma boa ideia
soltar um novo release desse módulo e alterar a dependência da versão sem snapshot.
Ao o comando "mvn dependency:analyze" a lista de dependências não utilizadas e
não declaradas pode ser longa demais para ser realizada
Isto pode parecer banal, mas existe um perigo real de não conhecermos exatamente do que
dependemos. O maior problema é causado pela maneira de lidar com as dependências
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
40 de 41
Curso Maven 2
transitivas. Devido a isso, podemos usar o código em seu dependency as dependências e o
Maven compilará muito bem. Os problemas surgem ao decidir uma alteração do escopo do
qual existe uma dependência do "provided", ou os módulos que dependem e decidem mudar
suas dependências.
Ao liberar a release de uma nova versão de um plugin, as construções tendem a falhar
O Maven por alguma razão decidiu que não é necessário especificar a versão do seu plugin
dependencies. O Maven localiza a mais recente versão quando uma nova versão de um
plugin for liberada. Às vezes, "mais recente" não é tão boa assim, pois novas versões podem
conter novos bugs. Portanto, é uma boa prática declarar a versão que desejamos usar ao
especifica um plugin no seu POM. Se realmente quiser ter certeza, também podemos
especificar as versões dos plugins internos do Maven.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l – A s a S u l , B ra s í l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 – Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 – 3 2 4 2 - 4 3 3 9
41 de 41