Escolar Documentos
Profissional Documentos
Cultura Documentos
Apache Maven
Apache Maven
Copyright 2008 by Eteg Tecnologia da Informao Ltda Autor: Walter dos Santos Filho Editor: Walter dos Santos Filho
Este trabalho est licenciado sob uma Licena Creative Commons Atribuio-Uso No-ComercialVedada a Criao de Obras Derivadas 2.5 Brasil. Para ver uma cpia desta licena, visite http://creativecommons.org/licenses/by-nc-nd/2.5/br/ ou envie uma carta para Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA. Mesmo tendo sido tomadas todas as precaues na confeco deste material, a Eteg Internet no se responsabiliza por perdas ou danos decorrentes das informaes contidas neste documento, seja por omisso ou erros. Sugestes e comentrios podem ser enviados para: treinamento@eteg.com.br Eteg, eBabel, Capri, Integrato, Sinon, Safira e Calipso e o logo Eteg so marcas da Eteg Tecnologia da Informao Ltda. Sun, Java, JDK so marcas registradas da Sun Microsystems, Inc. Microsoft, Microsoft Windows, .Net, C# e Visual Basic so marcas registradas da Microsoft Corporation. Websphere, Rational Unified Process e Rational Rose so marcas registradas da IBM. Oracle 9i, Oracle9iAs so marcas da Oracle Corporation. JBoss marca registrada da JBoss Inc. Todos os demais produtos descritos neste material so marcas registradas de seus respectivos proprietrios. Caso voc no tenha obtido este documento diretamente da Eteg, verifique em nosso site se voc est com a verso mais recente.
www.eteg.com.br
ii
iii
ndice Geral
Introduo ao Apache Maven..................................................................................................................1 Captulo 1 Introduo............................................................................................................................5 Processo de Construo de um Software............................................................................................6 Viso Conceitual.................................................................................................................................7 Viso Fsica.........................................................................................................................................9 Objetivos e Funcionalidades do Maven............................................................................................11 Ant versus Maven..............................................................................................................................13 Modelo de Objetos de Projetos (POM).............................................................................................14 Repositrio Maven............................................................................................................................17 Repositrios e Coordenadas..............................................................................................................19 Introduo aos Plug-ins.....................................................................................................................22 Reviso e Laboratrio.......................................................................................................................24 Captulo 2: Instalao, Utilizao e Principais Recursos.......................................................................25 Instalando o Maven 2........................................................................................................................26 Criando o Primeiro Projeto com Archetype......................................................................................27 O Plug-in Archetype..........................................................................................................................30 Alterando o POM..............................................................................................................................31 Compilando e Testando o Projeto.....................................................................................................33 Empacotando e Disponibilizando Localmente..................................................................................37 Gerando Documentao Javadoc......................................................................................................39 Configurando o Maven para uso com o Eclipse...............................................................................41 Definindo Dependncias para o Projeto............................................................................................43 Reviso e Laboratrio.......................................................................................................................46 Captulo 3: Trabalhando com vrios Projetos........................................................................................47 Motivao..........................................................................................................................................48 Definindo o Projeto Principal (Master).............................................................................................49 Criando uma Nova Biblioteca...........................................................................................................52 Criando o Projeto para o Site............................................................................................................53 Herana entre POMs.........................................................................................................................56 Empacotando o Projeto.....................................................................................................................58 Reviso e Laboratrio.......................................................................................................................59 Captulo 4: Configuraes de Plug-ins e Relatrios..............................................................................60 Introduo..........................................................................................................................................61 Configurando a Fase de Compilao................................................................................................63 Configurando o Empacotamento da Aplicao.................................................................................65 Propriedades......................................................................................................................................67 Plug-in Report e Website do Projeto ...............................................................................................69 Utilizando o Plug-in Report .............................................................................................................72 Utilizando outros Plug-ins para Relatrios.......................................................................................75 Relatrios JavaDoc e JXR.................................................................................................................77 Disponibilizando o Website .............................................................................................................79 Reviso e Laboratrio.......................................................................................................................80 Bibliografia.............................................................................................................................................81
iv
Captulo 1 Introduo
Cada dia, novos requisitos tornam a construo do software mais complexa Manter um processo que possibilite gerar verses de forma consistente e rapidamente um desafio O Maven um software para construo de software integrado com a internet
A construo de um software atualmente no mais simplesmente construir um projeto simples, monoltico e individual. Cada dia novos requisitos so necessrios para se crier as chamadas solues corporativas: segurana, robustez, acessibilidade, integrao, etc. Manter o controle do projeto, de forma que seja possvel criar uma verso do software que seja consistente e padronizada um desafio e por isto, vrias ferramentas foram criadas: make, Ant, build, entre outras. O Apache Maven, com seu sistema de construo de software, a evoluo deste tipo de ferramenta atravs da integrao com a internet.
Sobre o Maven
O Maven um projeto de cdigo livre, mantido pela Apache Software Foundation, criado originalmente para gerenciar o complexo processo de criao do projeto Jakarta Turbine. Desde seu incio, o Maven tem sido utilizado por projetos de cdigo livre e tambm proprietrio. Com a verso 2, o Maven passou de uma ferramenta de construo para uma ferramenta complexa de gesto de construo de software, com vrias funcionalidades e aplicvel a maioria dos cenrios de desenvolvimento de software. Importante: Neste curso, sempre que nos referirmos ao Maven, estaremos tratando da verso 2, tambm chamada de Maven 2.
Viso Conceitual
Viso Conceitual
Project Object Model (POM): Configura o funcionamento do Maven. Dependency Management Model: Gerencia dependncias entre artefatos Ciclo de vida e fases: Controlam o processo de construo Plug-ins: So extenses do Maven
Para compreender o processo de construo de software com o Maven, importante entender um conjunto de modelos conceituais que explicam como as coisas funcionam.
Os componentes principais da figura anterior so: Project object model (POM): O POM o componente principal para o Maven. Parte deste modelo faz parte do mecanismo interno do Maven. Outra parte informada por um arquivo pom.xml editado por voc. Dependency management model: A gesto de dependncia uma parte do processo de construo de software que muitas ignorada em projetos, mas que fundamental. O Maven reconhecidamente uma das melhores
Viso Fsica
Viso Fsica
POM, como j foi dito, pode ser alterado atravs do arquivo pom.xml Artefatos: cada unidade do Maven que forma um componente Repositrios: onde o Maven procura por artefatos
Pode ser local ou remoto Permite identificar dependncias entre artefatos, inclusive dependncias transitivas
A figura a seguir mostra os componentes fsicos do Maven com os quais voc pode interagir:
Na figura anterior, o POM (Project Object Model), como j foi dito, formado por dados internos ao Maven e por um ou mais arquivos pom.xml. Os arquivos pom.xml formam uma espcie de hierarquia, com cada um herdando os atributos do seu pai. O prprio Maven prov um POM que est no topo da hierarquia e portanto define os valores default para todos os projetos.
10
Qual deve ser a estrutura de diretrios para organizar o Como devem ser estruturados os diretrios de forma a
projeto?
organizar o cdigo-fonte, cdigo de teste, bibliotecas, configurao, documentao e relatrios do projeto? De onde as bibliotecas Java (JARS) devero ser baixados?
O Maven...
Define como o projeto tipicamente organizado e construdo. Utiliza conveno sobre configurao flexvel e extensvel
No desenvolvimento de projetos de software, o desenvolvedor encontrar algumas perguntas como: Qual deve ser a estrutura de diretrios para organizar o projeto? Como devem ser estruturados os diretrios de forma a organizar o cdigofonte, cdigo de teste, bibliotecas, configurao, documentao e relatrios do projeto? De onde as bibliotecas Java (JARS) devero ser baixados? Quais verses das bibliotecas (JARS) devero ser utilizadas? Qual a melhor forma de resolver conflitos entre bibliotecas? Como manter o projeto com as verses mais recentes das bibliotecas? Como as bibliotecas e recursos de compilao, execuo e teste devem ser separados? Existe alguma forma de executar todos os testes durante o processo de construo e obter um percentual de cobertura dos testes? possvel executar testes para mensurar a qualidade do cdigo ou medir desempenho durante o processo de construo? possvel executar testes de integrao durante o processo de construo? Como separar os scripts para diferentes atividades de construo?
O Maven busca resolver estas questes fornecendo um modelo de construo que pode ser reutilizado por todos os projetos de software. O Maven abstrai a estrutura do projeto e seu contedo, seguindo os princpios da conveno sobre a configurao, execuo declarativa do processo de ciclo de vida do desenvolvimento, reso da lgica de construo entre projetos e organizao lgica das dependncias dos projetos. Em resumo, o Maven: Define como o projeto tipicamente construdo. Utiliza convenes para facilitar a configurao do projeto e assim, sua construo.
11
12
Instalao Tempo para iniciar um novo projeto Tempo para adicionar uma nova funcionalidade Tempo de aprendizado para um novo desenvolvedor Layout padro?
30 minutos. Muito fcil para se entender e suporte por parte de ferramentas que muito bom. No (pode ser bom, voc pode alter-lo como quiser) Sim, mas voc tem que criar toda a lgica para tratar mltiplos projetos. Nativamente, no, mas existem plug-ins. Sim e muito boa Sim, mas requer plug-in (Ivy)
Suporte a mltiplos projetos? Gerao de documentao Integrao com IDEs? Gerncia de dependncias?
O Apache Ant outra ferramenta comumente utilizada para a construo de projetos. Mas qual a diferena entre o Ant e o Maven? Primeiramente, importante esclarecer que cada ferramenta d nfase a um aspecto do problema de construo de aplicao. O Ant uma ferramenta multiplataforma para construir projetos escritos em Java. Maven, por sua vez, descreve o projeto em um nvel mais alto toma emprestadas vrias tarefas do Ant. A tabela a seguir mostra algumas diferenas entre as ferramentas em mais alto nvel:
Critrio Instalao Tempo para iniciar um novo projeto Tempo para adicionar uma nova funcionalidade Tempo de aprendizado para um novo desenvolvedor Layout padro? Suporte a mltiplos projetos? Ant Muito fcil 5 minutes 10 minutos para adicionar um novo alvo 30 minutos. Muito fcil para se entender e suporte por parte de ferramentas que muito bom. No (pode ser bom, voc pode alter-lo como quiser) Sim, mas voc tem que criar toda a lgica para tratar mltiplos projetos. Nativamente, no, mas existem plug-ins. Sim e muito boa Sim, mas requer plug-in (Ivy) Maven Muito fcil 15 minutos 2 minutos para adicionar uma nova meta (goal). 2 horas. Pode ser confuso no incio. Sim (pode ser bom, pois todos os seus projetos seguem o mesmo layout) Sim, nativo com o Maven Reactor. Sim Sim, mas bsica Sim, nativo
13
Define as informaes necessrias para que o Maven possa executar um conjunto de metas e o software seja construdo. O POM formado pelo POM interno do Maven e pelo contedo do arquivo pom.xml. O pom.xml formado por vrios elementos que:
Permitem configurar informaes sobre o projeto (equipe, controle de verso, licena, etc). Permitem configurar as dependncias Permitem configurar os plug-ins do Maven Definir e configurar relatrios a serem gerados
O Modelo de Objetos de Projeto (POM, em ingls) define as informaes necessrias para que o Maven possa executar um conjunto de metas e que a construo do software possa ser realizada. A representao do POM feita atravs de um arquivo XML chamado pom.xml. No conceito do Maven, o projeto um conceito que vai alm de um conjunto de arquivos. O projeto contm arquivos de configurao, uma lista de desenvolvedores que atuam em papis, um sistema de controle de ocorrncias (issues), informaes sobre a empresa e licenas, a URL onde o projeto reside, as dependncias e todo o cdigo que d vida ao projeto. De fato, para o Maven, um projeto no precisa ter nada mais do que um simples arquivo pom.xml.
A estrutura do pom.xml
14
Eteg Tecnologia da Informao Ltda
15
16
Repositrio Maven
Repositrios Maven
Podem ser locais ou remotos O repositrio local sempre pesquisado primeiro a procura de artefatos.
Settings\USUARIO\.m2 ou ~/.m2.
Como foi dito anteriormente, o Maven utiliza dois tipos de repositrios para armazenar os artefatos: o local e o remoto.
Repositrio local
O repositrio local armazena os artefatos localmente no seu computador. criado um diretrio .m2 no seu diretrio de usurio (no Unix, ~/.m2 e no Windows, C:\Documents and Settings\USUARIO\.m2). Os artefatos locais so acessados rapidamente e so consultados sempre que o Maven precisa resolver uma dependncia ou executar um plug-in. Quando um artefato necessrio no est presente no repositrio local, feita uma consulta a um ou mais repositrios remotos.
17
Repositrio remoto
O repositrio remoto pode estar em um dos vrios repositrios Maven espalhados pela internet ou mesmo na sua intranet. O principal repositrio remoto atualmente o site http://repo1.maven.org/maven2. Vrios projetos de cdigo livre publicam suas bibliotecas nestes repositrios remotos. Assim, se seu projeto utilizar algum framework de cdigo livre comumente utilizado (como Hibernate ou Spring), com muita chance as ltimas verses das bibliotecas estaro disponveis para download por parte do Maven. Importante: A lista de repositrios remotos configurada no arquivo $MAVEN/conf/settings.xml (global) ou $USERHOME/.m2/settings.xml (usurio), onde $USERHOME o diretrio pessoal do usurio.
Localizando artefatos
Baseando-se na informao de dependncia descrita no POM, o Maven tentar resolver as dependncias na seguinte ordem: 1. A dependncia procurada no repositrio local. 2. A dependncia procurada em todos os repositrios remotos configurados. 3. Falhando 1 e 2, um erro reportado. O elemento <repositories> no arquivo settings.xml pode ser utilizado para configurar repositrios remotos. Um ponto positivo do Maven que com a utilizao de repositrios locais, garantido que apenas uma cpia do artefato mantida, independentemente se um ou vrios projetos fazem uso dele. Isto evita que ocorram conflitos especialmente quando se utilizam mltiplos projetos.
18
Repositrios e Coordenadas
Repositrios e Coordenadas
Artefatos geralmente so empacotados na forma de bibliotecas Java (JAR). Para indexar um repositrio, o Maven utiliza o conceito de coordenadas:
Identificam de forma nica um artefato. So formadas por trs partes: Group Id, Artefact
Id e verso.
<dependencies> <dependency> <groupId>br.com.eteg</groupId> <artifactId>CalculadoraCientifica</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
Um artefato geralmente empacotado e distribudo na forma de um arquivo JAR contendo uma biblioteca binria ou um executvel. Na prtica, um artefato tambm pode ser um arquivo WAR ou EAR, arquivo tpicos da plataforma Java para empacotamento. Para indexar a coleo de artefatos armazenados nos repositrios, o Maven utiliza a estrutura de diretrios do sistema de arquivos do sistema operacional. A indexao do repositrio se baseia no fato de que um artefato pode ser identificado de forma nica por meio de suas coordenadas.
Coordenadas
Uma coordenada para o Maven um conjunto de valores que identificam de forma nica um artefato. Uma coordenada composta de trs partes de informao, separadas por hfens: Group ID: A entidade ou organizao responsvel pela produo do artefato. Por exemplo, br.com.eteg pode ser um group id. Artifact ID: Nome do artefato. Por exemplo, para um projeto com uma classe chamada CalculadoraCientifica pode usar tambm este nome. Verso: Um nmero de verso para o artefato formato suportado segue a forma mmm.nnn.bbb-qqqqqqq-dd , onde mmm verso maior, nnn a menor verso e bbb o nvel da correo de bugs. Opcionalmente, qqqqq (qualificador) ou dd (nmero da construo - build number) tambm podem ser adicionados ao nmero da verso.
As coordenadas do Maven so usadas tanto na configurao do repositrio quanto no POM. Por exemplo, para especificar uma dependncia a um projeto chamado CalculadoraCientifica, na verso 1.0-SNAPSHOT, um arquivo pom.xml inclui uma declarao como esta: ... <dependencies>
Eteg Tecnologia da Informao Ltda
19
20
21
A maior parte das tarefas executadas pelo Maven so feitas por meio de plug-ins. Um plug-in formado por um ou mais mojos, que so as menores unidades de execuo do Maven. Alguns plug-ins esto associados a fases do ciclo de vida e so executados automaticamente.
Uma meta (goal) so tarefas no Maven. Ao executar um mojo, estamos executando uma meta.
A maior parte das tarefas realizadas pelo Maven so feitas por meio de plug-ins. O Maven atua como um maestro na coordenao das aes dos plug-ins.
Instalao de plug-ins
Maven traz consigo vrios plug-ins pr-configurados, que baixam quaisquer dependncias pela internet, sem necessidade de configuraes. A maior parte dos projetos de software usar esse conjunto pr-configurado e raramente necessitar de plug-ins adicionais. Dica: Consulte o site http://maven.apache.org/plugins/ para obter uma lista de plugins disponveis.
Mojos em plug-ins
Plug-ins so mdulos de software que se enquadram no modelo de extenso do Maven. Os plug-ins podem ser criados em Java, Ant ou Beanshell. Cada tarefa dentro do plug-in chamada mojo. Em muitos casos, um plug-in pode ser visto como um conjunto de mojos. Um mojo executado pelo mecanismo do Maven durante o ciclo de vida da construo do projeto. Cada mojo est associado a uma ou mais fases. Para listar os mojos de um plug-in, basta digitar, mvn P plugin, como por exemplo: mvn P jar
22
Para que uma fase seja executada, todas as outras anteriores devem tambm ser executadas. Por exemplo, para executar a fase compile, as fases validate, initialize, generate sources, process sources, generate resources e process resources necessariamente sero executadas. Para disparar uma fase do ciclo de vida de construo, basta executar o comando mvn nome_da_fase. Por exemplo: mvn compile Dica: A diferena de um comando Maven que est associado a uma fase e a um plugin que no caso de fases, o comando no tem dois-pontos (:) e corresponde exatamente a uma fase do ciclo.
Goals
Goals (ou metas em portugus) goal so tarefas na terminologia do Maven. Geralmente, as metas so especificadas como argumentos para o Maven na linha de comando, mas algumas metas podem ser chamadas por outras metas. Metas so disponibilizadas por plug-ins instalados ou na forma de script no arquivo maven.xml. Para visualizar todas as metas disponveis, utilize o comando maven g
23
Reviso e Laboratrio
Reviso e Laboratrio
1- Cite algumas das funcionalidades do Maven que podem ser utilizadas para o desenvolvimento de softwares. 2- O que o Project Object Model (POM) do Maven? 3- Qual a finalidade dos plug-ins do Maven? 4- Quais so os tipos de repositrios de artefatos do Maven? Qual destes tipos sempre verificado primeiro a procura de artefatos? Por qu? 5- O que uma coordenada para o Maven? Como ela representada no sistema de arquivos?
24
25
Instalando o Maven 2
Instalando o Maven 2
Pr-requisitos:
Instalao
Baixe os arquivos do site http://maven.apache.org Descompacte-os Adicione o diretrio bin do Maven ao PATH do sistema.
Pr-requisitos
JDK Memria Disco Sistema operacional 1.4 ou posterior (para a execuo do Maven, mas voc pode compilar cdigo para as verses 1.3 e anteriores) No h um mnimo, depende do processo de construo. Geralmente, 64Mb No h mnimo. Aproximadamente 100MB para repositrio local tpico. O Maven foi testado no Windows XP, Fedora Core e Mac OS X. Teoricamente, funciona em qualquer sistema onde uma mquina virtual compatvel funcione.
Instalao
O primeiro passo fazer o download no site http://maven.apache.org. Em seguida, descompactar os arquivos em algum diretrio a sua escolha, que iremos referenciar neste curso como $MAVEN. Adicionar o diretrio $MAVEN/bin varivel PATH. Para verificar a instalao, execute no prompt/shell de comando o seguinte comando: mvn -help
26
As bibliotecas necessrias para o plug-in que no estiverem no repositrio local sero baixadas automaticamente Para criar um projeto para o IDE Eclipse:
mvn eclipse:eclipse
Nesta e nas prximas sees, vamos criar um pequeno projeto para ilustrar o funcionamento do Maven. O projeto uma calculadora financeira, que possui as seguintes operaes: rate(), nper(), pmt() e pv(). Para criar um projeto de partida, execute o comando: mvn archetype:create -DgroupId=br.com.eteg \ -DartifactId=CalculadoraFinanceira Nota: Sempre que um plug-in necessitar de bibliotecas que no esto no repositrio local, o Maven tentar baix-las dos repositrios remotos, por isto, certifique-se de ter uma conexo com a internet. Este comando (que deve estar na mesma linha) criar o arqutipo (archetype) do projeto, gerando um arquivo pom.xml como este: <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>br.com.eteg</groupId> <artifactId>CalculadoraFinanceira</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>CalculadoraFinanceira</name> <url>http://maven.apache.org</url> <dependencies> <dependency>
27
A classe App foi alterada para o seguinte cdigo: package br.com.eteg; import java.text.DecimalFormat;
28
29
O Plug-in Archetype
O Plug-in Archetype
Permite criar a primeira verso do POM para o projeto Existem vrios modelos de projetos disponveis
O plug-in archetype, como vimos, serve para criar a primeira verso do POM para o projeto. Cada projeto que usado como modelo chamado de archetype, da o nome do plug-in. Existem vrios modelos de projeto que podem ser utilizados. Uma forma de ver todos os que esto disponveis executar a meta generate: mvn archetype:generate Ser exibida uma lista de todos os modelos disponveis e ser solicitado que voc informe o nmero do modelo a ser utilizado. Uma forma mais direta de se utilizar o plug-in especificar qual archetype deve ser usado. Por exemplo: mvn archetype:create -DgroupId=br.com.eteg \ -DartifactId=exemploWeb -DarchetypeArtifactId=maven-archetype-webapp No exemplo anterior, ser criado um projeto para uma aplicao web em Java.
30
Alterando o POM
Alterando o POM
Alterar a forma de <packaging>jar</packaging> empacotamento (JAR, EAR, WAR, <name>CalculadoraFinanceira</name> POM) <url>http://maven.apache.org</url> Alterar o nome e a URL do projeto <dependencies> <dependency> Adicionar <groupId>junit</groupId> dependncias <artifactId>junit</artifactId> <version>3.8.1</version> Configurar <scope>test</scope> plugins </dependency>
</dependencies>
O Maven configurado para construir seu projeto atravs do arquivo pom.xml. Conforme vimos anteriormente, o plug-in Archetype permite gerar um arquivo pom.xml padro, onde informamos as coordenadas. Vamos analisar outras sees do arquivo pom.xml: <packaging>jar</packaging> Este elemento permite configurar como ser empacotado o projeto. No nosso caso, por ser uma biblioteca, vamos utilizar o formato JAR. <name>CalculadoraFinanceira</name> <url>http://maven.apache.org</url> Estes elementos permitem configurar o nome e a URL para o projeto. <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> O elemento dependencies permite configurar dependncias para o projeto e especificar qual o escopo. No caso, h uma dependncia da biblioteca JUnit, para testes unitrios. Note que o escopo apenas test, logo, a biblioteca no necessria em outras etapas do ciclo de vida de construo. Veremos mais sobre dependncias nos prximos captulos.
31
32
Para compilar um projeto, execute a fase compile do Maven: C:\curso\CalculadoraFinanceira>mvn compile [INFO] Scanning for projects... [INFO] ----------------------------------------------------------------[INFO] Building CalculadoraFinanceira [INFO] task-segment: [compile] [INFO] ----------------------------------------------------------------[INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:compile] [INFO] Compiling 3 source files to C:\curso\CalculadoraFinanceira\target\classes [INFO] ----------------------------------------------------------------[INFO] BUILD SUCCESSFUL [INFO] ----------------------------------------------------------------[INFO] Total time: 3 seconds [INFO] Finished at: Thu Oct 23 22:22:10 BRT 2008 [INFO] Final Memory: 3M/10M [INFO] ----------------------------------------------------------------Antes de testar, necessrio criar um arquivo de teste. No diretrio src/test/java do projeto gerado, foi adicionado um pacote chamado br.com.eteg.calculadora.financeira e nele includa a classe CalculadoraFinanceiraTest: package br.com.eteg.calculadora.financeira;
33
34
35
36
Para empacotar o projeto, isto , gerar, neste caso, uma biblioteca Java no formato JAR, basta executar o plug-in jar ou ento a fase package: C:\curso\CalculadoraFinanceira>mvn jar:jar [INFO] Scanning for projects... [INFO] Searching repository for plugin with prefix: 'jar'. [INFO] ----------------------------------------------------------------[INFO] Building CalculadoraFinanceira [INFO] task-segment: [jar:jar] [INFO] ----------------------------------------------------------------[INFO] [jar:jar] [INFO] Building jar: C:\ CalculadoraFinanceira\target\CalculadoraFinanceira-1.0-SNAPSHOT.jar [INFO] ----------------------------------------------------------------[INFO] BUILD SUCCESSFUL [INFO] ----------------------------------------------------------------[INFO] Total time: 3 seconds [INFO] Finished at: Thu Oct 23 23:10:53 BRT 2008 [INFO] Final Memory: 4M/8M [INFO] ----------------------------------------------------------------Note que o arquivo gerado tem o formato do nome conforme as coordenadas do Maven e inclui tambm a verso. Para instalar a biblioteca no repositrio local do Maven, basta executar: mvn install
37
38
A documentao no formato Javadoc apresenta os detalhes das classes, pacotes, mtodos e variveis que compem o projeto Java Para gerar a documentao:
Uma das grandes novidades que Java ajudou a popularizar foi a documentao da API das classes atravs da ferramenta Javadoc. possvel utilizar a ferramenta Javadoc atravs do prprio Maven. Os arquivos so gerados em $PROJECT/target/site/apidocs, onde $PROJECT o diretrio do projeto. Para isto, utilize o comando: mvn javadoc:javadoc Se voc quiser, tambm pode gerar a documentao e imediatamente empacot-la em um arquivo JAR: mvn javadoc:jar Dica: Nos prximos captulos veremos como integrar a gerao do Javadoc junto com a documentao do site.
39
40
eclipse:configure-workspace
O Eclipse possui um bom plug-in para integrao com o Maven, o m2Eclipse (gratuito) Entretanto, voc pode escolher utilizar os recursos que o Eclipse j prov (atravs da opo External Tools)
J vimos que o Maven possui um plug-in para gerar o projeto para o Eclipse. Este plug-in tem as seguintes metas (mojos):
eclipse:configure-workspace eclipse:eclipse eclipse:clean Usado para adicionar a varivel M2_REPO ao Eclipse. Isto pode ser feito no prprio Eclipse, atravs do menu Window>Preferentes, opo Java>Build Path>Classpath Variables Cria os arquivos de configurao do Eclipse Exclui os arquivos usados pelo Eclipse
Mas, e o contrrio? Como utilizar o Maven dentro do Eclipse? Para isto, podemos usar um plug-in para o IDE. Um dos mais famosos o m2eclipse, disponvel em http://m2eclipse.codehaus.org.
Mas para utilizar o Maven com o Eclipse, no necessrio um plug-in. Muitos preferem configur-lo como uma ferramenta externa, pois um novo plug-in pode deixar o Eclipse mais sobrecarregado e lento. Consulte a documentao do Eclipse para saber como configurar uma ferramenta externa. A pgina http://blog.danielfmartins.com/2007/05/16/debugando-uma-aplicacao-maven-com-
41
42
possvel eliminar a transitividade Novos repositrios remotos podem ser includos na lista de pesquisa
<project> <!-- partes omitidas --> ... <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version > <scope>test</scope > </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version > <scope>compile</scope > </dependency> </dependencies> <!-- partes omitidas --> ... </project>
Projetos Java geralmente fazem uso de muitas bibliotecas existentes, afinal, no h necessidade de ficar sempre inventando a roda. Bibliotecas utilitrias, como a do log4j, do Apache Commons e de frameworks como Spring e Hibernate so publicadas constantemente nos principais repositrios do Maven. Para o Maven, qualquer dependncia que esteja registrada para um projeto tida como um artefato.
43
Eliminando a transitividade
O Maven tem como um dos seus principais pontos fortes a gerncia de dependncias. As principais caractersticas do gerenciador de dependncias do Maven incluem a dependncia transitiva. Para a dependncia transitiva, possvel interromper a transitividade. Isto til quando vrias bibliotecas dependem de verses especficas de outra biblioteca e voc s quer que a mais recente seja utilizada. Para eliminar uma biblioteca com a transitividade habilitada, podemos utilizar o elemento exclusions no elemento dependency: <dependency> <groupId>org.acegisecurity</groupId> <artifactId>acegi-security</artifactId> <version>1.0.6</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-support</artifactId> </exclusion> </exclusions> </dependency> No exemplo anterior, foi definida uma dependncia ao artefato acegi-security, mas foi indicado que no para transitar a dependncia para o artefato spring-support.
Incluindo repositrios
Alguns projetos podem publicar seus artefatos em repositrios remotos diferentes daqueles pesquisados pelo Maven por padro. Tambm possvel que voc queira criar um repositrio remoto Maven na sua intranet. Nestes casos, possvel especificar repositrios adicionais para o Maven atravs do arquivo pom.xml: <project> <!-- partes omitidas -->
44
45
Reviso e Laboratrio
Reviso e Laboratrio
1- Qual comando utilizado para acionar o Maven? 2- Utilizando plug-in archetype, escreva a linha de comando para se criar um arcabouo de projeto Maven cujo grupo seja br.com.minhaempresa e o identificador do artefato seja curso. 3- Qual comando utilizado para compilar um projeto gerenciado pelo Maven? No caso, voc est utilizando uma fase do ciclo de vida de construo ou um plug-in? Como voc sabe? 4- Por que ao executar a fase test, o Maven sempre executa a fase compile antes? 5- Qual comando utilizado para disponibilizar um artefato no repositrio local? 6- Como podem ser definidas dependncias em projetos gerenciados pelo Maven?
46
47
Motivao
Motivao
Em projetos maiores, necessrio fazer uma segmentao em mdulos. O Maven facilita a gesto de construo de projetos compostos por vrios mdulos. Para o exemplo, usaremos os seguintes mdulos:
web application AplicacaoTeste CalculadoraFinanceira
CalculadoraEstatistica
At agora, trabalhamos com um projeto s e foi relativamente fcil utilizar o Maven. Entretanto, em muitos casos, ser necessrio trabalhar com um conjunto de diferentes projetos, a fim de se manter uma boa modularizao. Por exemplo, podemos ter bibliotecas separadas das aplicaes web ou mesmo duas ou mais aplicaes web. Organizar tudo isto, onde temos vrias dependncias intra-projetos e com artefatos externos, pode ser muito complicado. Felizmente, o Maven foi projetado para simplificar o trabalho. Havamos criado um projeto para a CalculadoraFinanceira, mas novos requisitos exigem agora que uma calculadora estatstica seja criada. Esta calculadora ir avaliar a mdia, mediana e desvio padro de uma amostra de dados. Finalmente, tambm se exigiu que fosse disponibilizada uma aplicao web que permita entrar com os dados para as funes e obter o resultado do clculo. Desta forma, podemos ver os projetos e as inter-dependncias como no diagrama a seguir:
pkg Business Process Model we b a p pl i ca ti o n AplicacaoTeste CalculadoraFinanceira
CalculadoraEstatistic a
Neste captulo vamos utilizar o Maven para construir todos esses projetos.
48
O projeto principal necessrio para que o Maven possa gerenciar a construo multiprojetos.
formado simplesmente por um arquivo pom.xml necessrio especificar quais mdulos compem
o projeto As dependncias podem ser especificadas no projeto principal e herdadas pelos mdulos
Quando trabalhamos com vrios projetos ou mdulos de cdigo que formam um projeto de desenvolvimento de software, precisamos criar um projeto principal para que o Maven possa construir toda a aplicao. O projeto principal formado simplesmente pelo arquivo pom.xml. Geralmente, este arquivo estar no diretrio que contm os subdiretrios para os mdulos, como ilustrado na figura a seguir:
49
Organizao de dependncias
50
Eteg Tecnologia da Informao Ltda
51
A biblioteca CalculadoraEstatistica
Esta biblioteca tem a mesma estrutura de projetos da CalculadoraFinanceira. A diferena bsica est nos nomes dos pacotes e nos mtodos disponveis nas classes:
Criando o projeto
O procedimento para criar o projeto idntico ao visto na seo Criando o Primeiro Projeto com Archetype: mvn archetype:create -DgroupId=br.com.eteg \ -DartifactId=CalculadoraEstatistica Se voc estiver utilizando o IDE Eclipse, ento gere o projeto com o comando: mvn eclipse:eclipse
52
Para que o Maven gere um projeto compatvel com o WTP do Eclipse, necessrio alterar o pom.xml gerado.
Para o site, podemos escolher um archetype mais especfico. mvn archetype:create -DgroupId=br.com.eteg \ -DartifactId=AplicacaoTeste \ -DarchetypeArtifactId=maven-archetype-webapp Desta vez, para integrar o projeto ao Eclipse, precisamos antes configurar a integrao com o Web Toolkit Project (WTP) do Eclipse, assim poderemos explorar todas as funcionalidades disponveis no IDE. O arquivo pom.xml gerado mostrado a seguir, j com as alteraes para suportar mltiplos projetos e com as dependncias. A parte em negrito necessria para a integrao com o o WTP: <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"> <parent> <groupId>br.com.eteg</groupId> <artifactId>ProjetoCalculadora</artifactId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>br.com.eteg</groupId> <artifactId>AplicacaoTeste</artifactId> <packaging>war</packaging> <name>AplicacaoTeste Maven Webapp</name>
53
54
O site contar com somente uma pgina JSP (index.jsp) e far uso da biblioteca Apache Commons Validator para converter e validar a entrada.
55
Descendo um nvel, at o diretrio da CalculadoraFinanceira, o novo arquivo pom.xml modificado para o mdulo fica assim: <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"> <parent> <groupId>br.com.eteg</groupId> <artifactId>ProjetoCalculadora</artifactId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>br.com.eteg</groupId> <artifactId>CalculadoraFinanceira</artifactId> <packaging>jar</packaging> <name>CalculadoraFinanceira</name> </project> Nota: O projeto CalculadoraEstatistica tem seu POM com a mesma estrutura do projeto CalculadoraFinanceira. O elemento parent especifica a relao do mdulo com o POM do projeto principal. Como podemos ver, ao herdar de outro POM, o arquivo ficou bem mais simples. Pudemos eliminar vrios elementos, entre eles o elemento version e o elemento dependencies.
56
57
Empacotando o Projeto
Empacotando o Projeto
Se as bibliotecas no tiverem sido instaladas, ao tentar empacotar a aplicao, ser gerado um erro. Instale as bibliotecas com o comando: mvn install Para empacotar a aplicao, no diretrio onde est o pom.xml do projeto principal, digite: mvn package possvel executar a aplicao com o plugin para o Jetty:
mvn org.mortbay.jetty:maven-jetty-plugin:run
Finalmente, para empacotar o projeto como um todo, podemos ir at o diretrio onde est o arquivo pom.xml principal e executar o comando: mvn package Para cada submdulo que compe o projeto, o Maven ir passar pelo ciclo de vida de construo e ao final, teremos uma aplicao pronta para ser instalada. Importante: Se tentarmos construir a aplicao web ela ir falhar at que as bibliotecas CalculadoraFinanceira e CalculadoraEstatistica tenham sido instaladas no repositrio local. Em cada projeto, execute o comando mvn install. No diretrio target do projeto AplicacaoTeste voc poder encontrar um arquivo WAR pronto para ser instalado em um servidor.
Executando a Aplicao
Para executar uma aplicao web, necessrio ter um servidor compatvel com a especificao Servlet 2.4/JSP 2.0. Felizmente, existe um servidor leve, gratuito e que integrado ao Maven atravs de um plug-in. Este servidor o Jetty. Para executar a aplicao, v at o diretrio AplicacaoTeste e execute o comando: mvn org.mortbay.jetty:maven-jetty-plugin:run Em seguida, basta navegar para http://localhost:8080/AplicacaoTeste/.
58
Reviso e Laboratrio
Reviso e Laboratrio
1- Qual deve ser o valor do elemento packaging para o projeto principal quando trabalhamos com mltiplos projetos no Maven? 2- Se todos os submdulos de um sistema necessitam de um mesmo artefato, como podemos declarar a dependncia a ele? 3- Como podemos criar rapidamente um projeto web com o Maven?
59
60
Introduo
Introduo
Veremos como configurar alguns plug-ins associados a importantes fases do ciclo de vida
Toda a configurao ser feita no arquivo pom.xml Veremos como utilizar propriedades
Tambm veremos como gerar relatrios e o site para o projeto com o Maven
Neste captulo veremos como alterar os padres de configurao para alguns plug-ins dos ciclos de vida de construo do projeto. Toda a alterao ser feita atravs do arquivo pom.xml do projeto principal (apesar de que tambm podemos fazer nos arquivos pom.xml dos submdulos). Basicamente, as configuraes para os plug-ins so informadas por meio da adio de um ou mais elementos plugin com sub-elementos configuration no arquivo pom.xml: <project> <!Partes omitidas --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.0.2</version> <configuration> <source>1.5</source> <target>1.5</target> <optimize>true</optimize> </configuration> </plugin> </plugins> </build> <!Partes omitidas --> <project>
61
62
O compilador Java pode ser configurado por meio de vrios parmetros Podemos determinar a compatibilidade de cdigo-fonte e do cdigo compilado
A compilao uma das mais importantes fases do ciclo de construo. Para que esta fase possa ser utilizada, muitas vezes precisamos configurar alguns parmetros que sero informados ao compilador. O compilador Java pode utilizar opes para a verso de compatibilidade tanto para o cdigo-fonte quanto para o cdigo compilado. Isto significa que para o cdigo-fonte, algumas funcionalidades no estaro disponveis para verses mais antigas. Por exemplo, generics foi uma funcionalidade introduzida na verso 5.0 do Java e no est disponvel nas verses anteriores. Para o cdigo compilado, importante certificar que voc est utilizando a mesma verso da mquina virtual que executar a aplicao, pois do contrrio, aparecer uma exceo como esta: java.lang.UnsupportedClassVersionError: Bad version number in .class file Para confirmar o plug-in compile, altere o POM, informando os parmetros: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.0.2</version> <configuration> <source>1.5</source> <target>1.5</target> <optimize>true</optimize> <debug>false</debug> </configuration> </plugin>
63
64
arquivos com extenso JAR Aplicaes web so empacotadas em arquivos com extenso WAR Aplicaes que empacotam bibliotecas, vrias aplicaes web e componentes EJB utilizam arquivos com extenso EAR Todos os arquivos de empacotamento so compatveis com o formato ZIP
Neste curso vimos o empacotamento de dois tipos de artefatos: bibliotecas JAR e arquivos web WAR. Algumas configuraes teis podem ser feitas para os plug-ins de empacotamento:
Bibliotecas JAR
Existem vrias opes que podem ser utilizadas com esta forma de empacotamento. Criando um JAR executvel: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> ... <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>br.com.eteg.Main</mainClass> </manifest> </archive> </configuration> ... </plugin> Voc informa a classe que a principal para o programa (possui um mtodo main()). Com isto, voc pode executar o programa digitando:
65
Aplicaes web
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.0.2</version> <configuration> <warSourceExcludes>**/CVS</warSourceExcludes> <warSourceExcludes>**/.svn</warSourceExcludes> <archiveClasses>true</archiveClasses> </configuration> </plugin> Por default, todo o cdigo-fonte da aplicao web copiado. Para excluir alguma parte, voc pode utilizar o elemento warSourceExcludes. No exemplo, os dois asteriscos (**) significam recursivamente. Para **/CVS, significa que todos os diretrios CVS sero eliminados do empacotamento. A configurao archiveClasses indica que as classes Java para a aplicao (*.class) sero antes empacotadas em uma biblioteca JAR. O valor default false.
66
Propriedades
Propriedades
So valores escritos em notao especial que podem ser utilizados para substituir parmetros de entrada para a configurao
Propriedades no Maven so valores escritos em uma notao especial que podem ser utilizados para substituir parmetros de entrada para a configurao. As propriedades atuam como uma varivel que pode ser utilizada em vrios lugares, mas definida e alterada em um nico ponto. Claramente, a principal vantagem de se utilizar propriedades facilitar a manuteno quando ocorrem mudanas. Um bom exemplo so verses de artefatos. Para ilustrar, vamos considerar o Spring Framework, um famoso framework para desenvolvimento em Java. O Spring Framework bem modular e possui vrios artefatos, como podemos ver no fragmento de um arquivo pom.xml tpico: <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring-release-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring-release-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring-release-version}</version> </dependency>
67
68
A criao da infra-estrutura para gerar relatrios e um site de projeto pode demandar grande esforo
O Maven j traz consigo vrios recursos para simplificar esta tarefa Para criar um site rapidamente, utilize a fase site:
mvn site
Mas gerar os relatrios e o site sem um propsito claro no faz sentido algum
A criao da infra-estrutura para gerar relatrios e o site para um projeto pode demandar grande esforo que quase sempre repetitivo. Por isto o Maven configurado para executar os relatrios do projeto por padro. No necessrio alterar nada para j se ter uma verso dos relatrios. Os relatrios recebero um conjunto de estilos (CSS) e faro parte do site da documentao do projeto. Basta executar: mvn site
Entretanto, fique atento aos comentrios feitos por Tim OBrien em seu blog. Ele critica o simples fato de se usar o Maven para gerar relatrios que no realmente utilizados. O blog est disponvel em:
http://www.oreillynet.com/onjava/blog/2006/03/maven_project_info_reports_con.html
Nota: O plug-in Report tem vrias opes de configurao. Muitas delas no sero abordadas no curso por serem avanadas. Para a lista completa de metas do plug-in, consulte:
69
70
71
Integrao com controle de verso Listas de discusso para o projeto Licena para o projeto Equipe do projeto
Controle de Verso
O plug-in Report tem uma meta chamada project-info-reports:scm que gera o relatrio com informaes sobre o controle de verso do projeto. Para configur-lo, necessrio alterar o POM do projeto: <project> ... <scm> <connection> scm:svn:http://eteg.net/svn/curso/trunk/site </connection> <developerConnection> scm:svn:https://eteg.net/svn/curso/trunk/site </developerConnection> <url>http://eteg.net/viewvc/curso/trunk/site</url> </scm> ... <reporting> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-project-info-reports-plugin</artifactId> <configuration> <webAccessUrl> http://eteg.net/viewvc/curso/trunk
72
Listas de Discusso
Permite configurar o relatrio sobre as listas de discusso para o projeto. Exemplo: <project> ... <mailingLists> <mailingList> <name>Lista de usurios</name> <subscribe>subscribe-curso@eteg.net</subscribe> <unsubscribe>unsubscribe-curso@eteg.net</unsubscribe> </mailingList> </mailingLists> ... </project>
73
Equipe do Projeto
Para detalhar a equipe do projeto, existem duas opes: detalh-los como desenvolvedores que fazem parte da equipe principal ou como colaboradores. Por exemplo: <project> ... <developers> <developer> <id>bart</id> <name>Bart Simpson</name> <email>bart at simpsons.com</email> <organization>20th Century Fox</organization> <roles> <role>Desenvolvedor</role> </roles> </developer> </developers> <contributors> <contributor> <name>Fred Flintstone</name> <email>fred at stoneage.org</email> <organization>Bedrock</organization> <roles> <role>Escritor tcnico</role> </roles> </contributor> </contributors> ... </project>
74
Utiliza a ferramenta de anlise de cdigo PMD Pode encontrar desde problemas simples, como
variveis que so declaradas e no utilizadas at problemas mais complexos como cdigo duplicado
Anlise de cdigo
Uma excelente ferramenta de anlise de cdigo o PMD (http://pmd.sf.net). Para gerar relatrios com esta ferramenta atravs do Maven, configure o plug-in: <project> ... <reporting> <plugins>
75
76
O plug-in Javadoc permite gerar a documentao a partir do cdigo-fonte Java do projeto. O plug-in JXR permite criar uma referncia cruzada entre as classes Java, transformando o cdigo-fonte em um conjunto de pginas HTML que podem ser navegadas
O plug-in JavaDoc permite gerar a documentao do projeto neste formato (apenas classes Java so suportadas). Para configur-lo, adicione o relatrio ao POM: <project> ... <reporting> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> </plugin> </plugins> ... </reporting> ... </project>
O plug-in JXR
Este plug-in produz a referncia cruzada do cdigo-fonte do projeto. Por meio do relatrio gerado fica fcil navegar pelo cdigo. Para utiliz-lo, configure o POM como neste exemplo: <project> ... <build> ...
77
78
Disponibilizando o Website
Disponibilizando o Website
Para implantar o site gerado pelo Maven, primeiramente voc deve ter um destino configurado no arquivo pom.xml:
<project> ... <distributionManagement> <site> <id>website</id> <url>scp://empresa.com.br/site/docs/project/</url> </site> </distributionManagement> ... </project>
Em seguida, execute a fase site-deploy Dependendo da configurao, ser solicitado o login e a senha de conexo
Para implantar o site gerado pelo Maven, primeiramente voc deve ter um local configurado no arquivo pom.xml: <project> ... <distributionManagement> <site> <id>website</id> <url>scp://www.empresa.com.br/site/docs/project/</url> </site> </distributionManagement> ... </project> O elemento <id> identifica o repositrio configurado no arquivo settings.xml usando o elemento <servers>. A informao sobre a autenticao deve estar configurada. O elemento <url> configura o servidor onde ser feita a disponibilizao do site. Atualmente, somente cpia por SCP, RSync e cpia local so suportadas. Para disponibilizar o site, utilize a fase site-deploy do ciclo de vida: mvn site-deploy
79
Reviso e Laboratrio
Reviso e Laboratrio
1- Suponha que voc queira utilizar no cdigo a palavra-chave assert de Java, mas ficou sabendo que ela s est disponvel nas verses iguais ou posteriores 1.4. Como voc pode configurar o Maven para compilar o cdigo-fonte? 2- Cite uma vantagem do uso de propriedades. 3- Qual plug-in deve ser configurado para que a documentao gerada pelo Maven fique em portugus? 4- Qual plug-in permite gerar uma referncia cruzada do cdigo Java?
80
Bibliografia
http://www.ibm.com/developerworks/java/library/j-maven/ https://www6.software.ibm.com/developerworks/education/j-mavenv2/section2.html http://java.sys-con.com/node/393300 http://www.kleineikenscheidt.de/stefan/archives/2006/01/comparison-table-ant-vsmaven.html http://www.javaworld.com/javaworld/jw-05-2006/jw-0529-maven.html http://www.javaworld.com/javaworld/jw-12-2005/jw-1205-maven.html http://maven.apache.org
81