# Apache Ant

Apache Ant é uma ferramenta utilizada para automação de compilação na construção de software. Ela é similar ao make, mas é escrita na linguagem Java; e foi desenvolvida inicialmente para ser utilizada em projetos desta linguagem.
A mais aparente diferença entre as ferramentas Ant e make, é que a primeira utiliza um arquivo no formato XML para descrever o processo de construção (build) e suas dependências, enquanto o make possui o seu próprio formato de arquivo, o Makefile. Por padrão, este arquivo XML tem o nome build.xml.
A ferramenta Ant é um projeto da Apache Software Foundation. É um software livre, licenciado sob a licença Apache.

## Portabilidade

Um dos principais objetivos do Ant é resolver os problemas de portabilidade do make. Em um arquivo Makefile (o arquivo lido pelo make), as ações para construir o projeto (por exemplo, gerar um arquivo executável) são disparadas por comandos do sistema operacional (ou mais especificamente, da sua shell), usualmente uma shell Unix. O Ant resolve este problema através do grande número de funcionalidades próprias; e que garante que se comportarão identicamente (em tese, pelo menos), em todas as plataformas.
Por exemplo, no arquivo build.xml mostrado acima, a diretiva clean apaga o diretório classes e todos arquivos abaixo dele. Em um arquivo Makefile típico, isto seria feito com o comando:
Este comando, rm, é próprio do Unix; e muito provavelmente não estará disponível se o ambiente não for Unix, como o Microsoft Windows. Num arquivo de construção Ant, esta mesma operação seria realizada através do comando:
Uma discrepância comum entre sistemas operacionais está na forma em que os caminhos de diretórios são especificados. Os sistemas Unix utilizam uma barra (/), enquanto no Windows é utilizada uma barra invertida (\). O Ant deixa o autor escolher a sua forma preferida: barras ou barras invertidas para diretórios; e ponto e vírgula ou vírgula para separadores de caminhos. Ele converte tudo para a forma apropriada para a plataforma corrente.

## História

O Ant foi inventado por James Duncan Davidson, enquanto migrava um produto da Sun Microsystems para o modelo de software livre. O produto, que posteriormente foi chamado Apache Tomcat, era conhecido como a implementação de referência para o padrão JSP/Servlet. A ferramenta make pode ser utilizada na construção do Solaris, mas no mundo do software livre não há como controlar em qual plataforma o usuário construirá o Tomcat. O Ant foi criado como uma ferramenta simples, que utilizava um "arquivo de construção" em XML para construir o Tomcat, independentemente da plataforma alvo. A partir deste início humilde, a ferramenta tornou-se mais presente; e talvez teve maior êxito que o próprio Tomcat para o qual foi criada. A ferramenta Ant foi inicialmente liberada como um produto independente em 19 de julho de 2000, na sua versão 1.1. Ela passou a ser base dos projetos de software livre escritos em Java.
Devido à facilidade para integrar testes feitos em JUnit com o processo de construção, a ferramenta Ant permitiu que os desenvolvedores adotassem facilmente o modelo de "desenvolvimento orientado a testes" (test-driven development); e até mesmo a Extreme Programming.

## Limitações

* Os arquivos de construção devem ser escritos no formato XML. Alguns consideram esta característica uma barreira para usuários novatos e para grandes projetos onde estes arquivos podem se tornar grandes e complexos. Este é um problema de todas as linguagens baseadas em XML, mas ocorre particularmente no caso do Ant, em grandes projetos com um grande número de tarefas. A ferramenta Apache Maven pode ser utilizada como alternativa para solucionar estes problemas, já que tem uma visão de mais alto nível na construção de sistemas;
* Algumas "tarefas" Ant mais velhas, como <javac>, <exec> e <java>, têm opções que utilizam valores padrão que não são consistentes com as tarefas mais recentes. Ao mudar estes valores, o usuário corre o risco de provocar erros em versões mais novas;
* No caso de substituição de strings existentes em arquivos de propriedades, se estas strings não forem definidas, o Ant não levanta uma exceção e mantém a referência no texto. Por exemplo, ${unassigned.property};
* O tratamento de exceções e de persistência de estado é limitado. Por isso, a ferramenta não é considerada uma alternativa ao gerenciamento de múltiplas construções ao longo de um dia.