TheNEXUS

1.7. Comparando Maven com Ant

Os autores deste livro não têm interesse em criar uma rixa entre Apache Ant e Apache Maven, mas também estamos cientes do fato de que a maioria das organizações tem que tomar uma decisão entre as soluções de dois pesos e duas medidas: Apache Ant e Apache Maven. Nesta seção, vamos comparar e contrastar as ferramentas.

Ant se sobressai no processo de construção, é um sistema de construção modelado após o makewith com alvos e dependências. Cada alvo consiste de um conjunto de instruções que são codificadas em XML. Há uma copy task e umajavac task, bem como uma jar task. Quando você usa Ant, você fornece Ant com instruções específicas para compilação e empacotamento do youroutput. Veja o seguinte exemplo de um simples arquivo build.xml:

Um simples arquivo build.xml do Ant.

<project name="my-project" default="dist" basedir="."> <description> simple example build file </description> <!-- set global properties for this build --> <property name="src" location="src/main/java"/> <property name="build" location="target/classes"/> <property name="dist" location="target"/> <target name="init"> <!-- Create the time stamp --> <tstamp/> <!-- Create the build directory structure used by compile --> <mkdir dir="${build}"/> </target> <target name="compile" depends="init" description="compile the source " > <!-- Compile the java code from ${src} into ${build} --> <javac srcdir="${src}" destdir="${build}"/> </target> <target name="dist" depends="compile" description="generate the distribution" > <!-- Create the distribution directory --> <mkdir dir="${dist}/lib"/> <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --> <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/> </target> <target name="clean" description="clean up" > <!-- Delete the ${build} and ${dist} directory trees --> <delete dir="${build}"/> <delete dir="${dist}"/> </target></project>

Neste exemplo simples do Ant, você pode ver como você tem que dizer a Antexactly o que fazer. Há um objetivo de compilação que inclui a tarefa javac que compila o código fonte no diretório src/main/java para o diretóriotarget/classes. Você tem que dizer ao Ant exatamente onde está o seu código fonte, onde você quer que o bytecode resultante seja armazenado, e como empacotar tudo isso em um arquivo JAR. Enquanto existem alguns desenvolvimentos recentes que ajudam a tornar o Ant menos procedural, a experiência de um desenvolvedor com o Ant está na codificação de uma linguagem procedural escrita em XML.

Contraste o exemplo anterior do Ant com um exemplo Maven. No Maven, para criar um arquivo JAR a partir de algum fonte Java, tudo que você precisa fazer é criar um pom.xml simples, colocar seu código fonte em${basedir}/src/main/java e então executar mvn install a partir da linhacommand. O exemplo Maven pom.xml que atinge os sameresultados como o simples ficheiro Ant listado em A Simple Ant build.xml é mostrado emA Sample Maven pom.xml.

A Sample Maven pom.xml.

<project> <modelVersion>4.0.0</modelVersion> <groupId>org.sonatype.mavenbook</groupId> <artifactId>my-project</artifactId> <version>1.0</version></project>

É tudo o que você precisa no seu pom.xml. Executando mvn install a partir da linha de comando irá processar recursos, compilar fontes, executar testes unitários, criar um JAR e instalar o JAR em um repositório local para forreuse em outros projetos. Sem modificação, você pode executar mvn site e então encontrar um arquivo index.html no target/site que contém links para JavaDoc e alguns relatórios sobre seu código fonte.

Admittedly, este é o exemplo mais simples possível de projeto contendo nada mais do que algum código fonte e produzindo um JAR simples. É um projeto que segue de perto as convenções Maven e não requer nenhuma dependência ou customização. Se quisermos começar a customizar o comportamento, nosso pom.xml vai crescer em tamanho, e no maior dos projetos você pode ver coleções de Maven POMswswsw que contém uma grande quantidade de customização de plugins e declarações de dependência. Mas, mesmo quando os arquivos POM do seu projeto se tornam moresubstanciais, eles contêm um tipo de informação completamente diferente do arquivo de construção de um projeto de tamanho similar usando o Ant. Maven POMscontain declarações: “Este é um projeto JAR”, e “O código fonte isin src/main/java”. Os ficheiros de compilação Ant contêm instruções explícitas: “This is project”, “The source is in src/main/java”, “Run javacagainst this directory”, “Put the results in target/classes”, “Create a JAR from the ….”, etc. Onde Ant tinha que ser explícito sobre o processo, havia algo “embutido” para Maven que apenas sabia onde estava o código fonte e como ele deveria ser processado.

As diferenças entre Ant e Maven neste exemplo são:

  • Apache Ant

    • Ant não tem convenções formais como uma estrutura comum de directórios de projectos ou comportamento por omissão. Você tem que dizer ao Ant exatamente onde encontrar a fonte e onde colocar a saída. Convenções informais surgiram ao longo do tempo, mas não foram codificadas no produto.
    • Ant é procedimento. Você tem que dizer ao Ant exatamente o que fazer e quando fazer. Tem de dizer-lhe para compilar, depois copiar, depois comprimir.
    • Ant não tem um ciclo de vida. Você tem de definir objectivos e dependências de objectivos. Você tem que anexar uma sequência de tarefas a cada meta manualmente.
  • Apache Maven

    • Maven tem convenções. Ele sabe onde está o seu código fonte porque você seguiu a convenção. Maven’s Compiler plugin coloca o bytecode em target/classes, e produz um ficheiro JAR em target.
    • Maven é declarativo. Tudo que você tinha que fazer era criar um arquivo pom.xml e colocar seu código fonte no diretório padrão. Maven tomou conta do resto.
    • Maven tem um ciclo de vida que foi invocado quando você executou mvn install. Este comando disse à Maven para executar uma série de fases sequenciais do ciclo de vida até chegar à fase de instalação do ciclo de vida. Como um efeito secundário desta jornada através do ciclo de vida, Maven executou uma série de metas padrão de plugins que fizeram coisas como compilar e criar um JAR.

Maven tem inteligência incorporada sobre tarefas comuns do projeto nos plugins formof Maven. Se você quisesse escrever e executar testes unitários, allyou precisaria fazer é escrever os testes, colocá-los em${basedir}/src/test/java, adicionar uma dependência testada ou TestNG ou JUnit, e executar mvn test. Se você quisesse implementar uma aplicação aweb e não um JAR, tudo que você precisaria fazer era mudar seu tipo de projeto para war e colocar seu docroot em${basedir}/src/main/webapp. Claro, você pode fazer tudo isso comAnt, mas você estará escrevendo as instruções a partir do zero. No Ant,você terá primeiro que descobrir onde o arquivo JAR do JUnit deve estar. Depois você teria que criar um classpath que inclua o arquivo JUnitJAR. Então você diria ao Ant onde ele deveria procurar pelo código fonte de teste, escreveria um objetivo que compila a fonte de teste para bytecode, e executaria os testes unitários com JUnit.

Sem tecnologias de suporte como antlibs e Ivy (mesmo com tecnologias de suporte a teses), o Ant tem a sensação de um c`ustom proceduralbuild. Um conjunto eficiente de Maven POMs em um projeto que adere às convenções assumidas pela Maven tem surpreendentemente pouco XML comparado com a alternativa Ant. Outro benefício de Maven é a confiança em plugins Maven compartilhados. Todos usam o plugin Maven Surefire para testes unitários, e se alguém adicionar suporte para um novo framework de testes unitários, você pode ganhar novas capacidades na sua própria compilação, bastando para isso criar a versão de um plugin Maven em particular no POM.

A decisão de usar Maven ou Ant não é binária, e Ant ainda tem um lugar numa compilação complexa. Se o seu build atual contém algum processo altamente personalizado, ou se você escreveu alguns scripts Ant para completar um processo específico de uma forma específica que não pode ser adaptada aos padrões do Maven, você ainda pode usar esses scripts com Maven. Ant ismade está disponível como um plugin Maven principal. Plugins Maven personalizados podem ser implementados no Ant, e projetos Maven podem ser configurados para executar scripts Ant dentro do ciclo de vida do projeto Maven.

Leave a Reply