Basicamente, Maven [12] é uma ferramenta de código livre para automação de tarefas relacionadas ao desenvolvimento de software, como compilação, execução de testes, empacotamento de classes, implantação no servidor, etc, considerada uma inovação em relação ao Ant [13]. O mecanismo do Ant é semelhante ao do Makefile, com a execução de tarefas definidas em scripts, mas apresenta vantagens como a portabilidade (tecnologia baseada em baseada em Java) e uma sintaxe mais compreensível (XML). Apesar da eficácia oferecida por Ant, seu uso torna-se repetitivo e mesmo cansativo ao longo do desenvolvimento de vários projetos. Frequentemente existem tarefas semelhantes, de modo que o método "copiar e colar" é uma alternativa à falta de suporte ao reaproveitamento de scripts. Entretanto, customizar o código copiado nem sempre é uma atividade simples.
Ao contrário dessa propriedade imperativa de Ant, com scripts listando comandos, Maven parte de um princípio diferente, focando em uma perspectiva mais descritiva do projeto. Baseada no conceito de POM (Project Object Model), Maven permite a execução de tarefas a partir de um arquivo xml que descreve algumas informações do projeto. As funcionalidades propriamente ditas são executadas por plugins, permitindo ao Maven alta extensibilidade. Não há nenhuma mágica, pois o código complexo ainda existe: apenas está escondido, na definição do plugin. A reutilização de código é atingida configurando-se o projeto para que o plugin funcione corretamente.
É necessário acostumar-se com uma regra básica: o POM descreve apenas um artefato (um JAR, WAR, EAR, RAR). Para projetos mais complexos, certamente será preciso definir sub-projetos e estabelecer regras de dependência. Para as conversões de projetos ao Maven que fiz no estágio (veja), tal regra aumentou razoavelmente a complexidade da tarefa.
Atualmente, existem dezenas de plugins com objetivos bem distintos, desde aqueles que proveêm funcionalidades mais comuns, até alguns mais curiosos: para as pessoas relutantes a novidades, existe um plugin que cria um script de Ant a partir de um projeto de Maven.
Maven foi útil até mesmo na produção desta monografia, com o uso de um plugin que aplica estilos em arquivos HTML simples. Nem foi necessário codificar o descritor XML do projeto, pois existe um plugin que gera alguns projetos para teste.
A ferramenta também possui aspectos de flexibilidade. Várias propriedades são configuráveis e é possivel definir tarefas (goals) arbitrárias em um arquivo (também em XML), de forma semelhante ao que era feito em Ant. A linguagem utilizada é Jelly [18], também empregada para a definição de plugins. Além dos recursos de Ant, Jelly oferece novas funcionalidades e permite a invocação de tarefas definidas em scripts de Ant.
Outra característica é a maneira como as dependências são gerenciadas. Antes, era necessário agregar à estrutura de arquivos do projeto as bibliotecas (arquivos JAR) de terceiros necessárias para o funcionamento. Com Maven, isso não é necessário: pode-se listar as dependëncias do projeto no descritor XML e as mesmas são obtidas de um repositório remoto durante a primeira execução de alguma tarefa. Por padrão, o repositório remoto consultado por Maven está na Ibiblio (www.ibiblio.org/maven), mas pode-se configurar a ferramenta para consultar outros.
A figura abaixo descreve a arquitetura básica:
Maven também permite a geração de um site com diversas informações sobre o projeto, tanto definidas pelos desenvolvedores, como providas por plugins. Existem plugins que geram relatórios com resultados de testes, javadocs, análises sintática de código, métricas de software, informações do CVS, e outros. O site gerado possui um layout bem característico, permitindo que uma pessoa reconheça rapidamente que o site foi gerado pelo Maven.
As imagens abaixo são do site com a documentação do próprio projeto Maven: