Por que o Apache possui duas ferramentas separadas para gerenciamento de compilação e dependência?

9

O Apache possui duas ferramentas separadas:

Eles parecem preencher o mesmo nicho. Eu tenho duas perguntas:

  1. Quais são os destaques das principais diferenças entre as duas ferramentas?
    • Tenho certeza de que um artigo muito longo poderia ser escrito sobre as diferenças entre os dois, não estou procurando tantos detalhes, nem estou procurando um argumento subjetivo para escolher um sobre o outro.
  2. História da programação - como aconteceu que o Apache evoluiu para criar dois conjuntos de ferramentas completamente separados que são, em última análise, de propósito tão semelhante?
durron597
fonte

Respostas:

7

Quais são os destaques das principais diferenças entre as duas ferramentas?

  • Estrutura do projeto

    • Maven prefere uma estrutura de projeto específica: é preciso comprometer-se a fazer as coisas da maneira Maven. O Maven vem com etapas comuns de compilação já configuradas em uma raiz pom.xmlque normalmente é herdada por todos os outros projetos pom.xml.

    • O Ant + Ivy é mais aberto: embora possa fazer muito, existem apenas alguns requisitos básicos em termos de estrutura do projeto ou uso de scripts. Não há tarefas, objetivos ou processos de construção predeterminados. Cada build.xmlum é uma lista limpa (a menos que inclua outro script, é claro).

  • Orientação

    • Maven é orientado a objetivos . Você não diz "executar este destino de compilação", pede para "compilar" ou "implantar" e o Maven faz o que for necessário para chegar lá: você diz o que deseja fazer.

    • Ant + Ivy é orientado a tarefas . Cada tarefa é definida pela implementação e personalizada. Você diz a ele como fazer o que deseja.

  • Gerenciamento de Dependências

    • O Maven é conhecido por lidar automaticamente com dependências. Ele fará o download das versões corretas enquanto cria sem nenhuma interação do usuário, desde que os URLs do repositório sejam configurados corretamente com antecedência.

    • Ant não possui gerenciamento de dependência, exceto "Java Classpath". Ivy adiciona um gerenciamento de dependência um pouco mais entediante que o Maven, mas ainda automatizado. A chave aqui é que você não pode escolher nenhum gerenciamento de dependências (por exemplo, "jars incluídos na minha distribuição ou verificados no controle de origem") ou pode terceirizar via Ivy. Essa escolha significa mais flexibilidade para atender às necessidades do projeto.

  • Fácil de usar

    • Maven é (em teoria) fácil de usar. Qualquer desenvolvedor pode pegar um projeto do Maven e saber imediatamente onde todos os recursos do projeto estão localizados e para que servem: isso se deve ao primeiro ponto sobre o Maven ter uma maneira específica de fazer as coisas.

    • Ant + Ivy pode ter uma curva de aprendizado mais acentuada porque cada projeto pode ser diferente. Projetos diferentes podem ter maneiras diferentes de atingir os mesmos objetivos.

  • Extensibilidade

    • O Maven permite escrever plugins e alterar seu processo de criação. No entanto, ele sai da caixa com uma raiz pom.xmlque empurra os desenvolvedores para seus processos de construção predeterminados. Novos objetivos ou etapas de construção requerem reflexão cuidadosa e esforço extra para injetar no processo de construção.

    • O Ant + Ivy também permite escrever plug-ins e novas tarefas: fazer isso é muito fácil e é possível integrar uma nova tarefa com o mínimo de esforço. Não há metas ou alvos predeterminados para embaralhar ou integrar a nova tarefa.

Como aconteceu que o Apache evoluiu para criar dois conjuntos de ferramentas completamente separados que são, em última análise, de propósito tão semelhante?

A primeira coisa a entender é que o projeto Apache nada mais é do que um guarda-chuva sob o qual projetos independentes e independentes operam. Equipes diferentes trabalham em projetos diferentes. Embora os desenvolvedores individuais possam trabalhar em vários projetos, não há um roteiro geral que incorpore Ant, Ivy e Maven.

Ant veio primeiro. Foi projetado para ser um equivalente em Java do Make. Enquanto o Make pode criar projetos Java, é tedioso: o Make existia para compilar várias unidades de compilação separadamente e depois vinculá-las. A maneira Java é javaccompilar tudo de uma só vez, e o que chamamos de "vinculação" realmente ocorre nas entranhas da JVM em tempo de execução. Make não era a ferramenta certa para o trabalho: um Makefile para Java é basicamente um ou dois destinos ( javac, jar).

Ant adicionou um pouco de estrutura sobre o Make, mas não alterou fundamentalmente o processo.

Depois de um tempo, a comunidade percebeu que caçar arquivos jar não era divertido. Além disso, não havia uma maneira padrão de compor projetos. Sem consistência, o desenvolvimento Java foi uma bagunça. O Maven foi projetado para resolver esses problemas: traria uma estrutura de projeto comum e automatizaria a busca de arquivos jar.

No entanto, Ant ainda era realmente útil. Alguns projetos se prestam mais à natureza ad-hoc dos processos do Ant. Alguns projetos não estão compilando código. Alguns projetos eram antigos e era improvável que alguém os "atualizasse" para o Maven.

A seguir vem Ivy: adiciona gerenciamento de dependência ao Ant, dando aos projetos o melhor dos dois mundos. Você pode manter seus scripts herdados ou um ambiente altamente personalizado, mas obtém o recurso mais importante do Maven: gerenciamento de dependências.


fonte