Quase todos os projetos Java que eu vi usam Maven ou Ant. São ferramentas excelentes e acho que qualquer projeto pode usá-las. Mas o que aconteceu para fazer ? É usado para uma variedade de projetos não Java e pode lidar facilmente com Java. Claro que você precisa baixar o make.exe se usar o Windows, mas o Ant e o Maven também não vêm com o JDK.
Existe alguma falha fundamental no make quando usado com Java? É apenas porque Ant e Maven são escritos em Java?
make
. E ter um makefile que só funciona em um sistema não é muito bom para uma linguagem de plataforma cruzada.Respostas:
O problema fundamental do Make e Java é que o Make funciona com a premissa de que você especificou uma dependência e, em seguida, uma regra para resolvê-la.
Com C básico, que normalmente "para converter um arquivo main.c em um arquivo main.o, execute" cc main.c ".
Você pode fazer isso em java, mas aprende rapidamente algo.
Principalmente que o compilador javac é lento para iniciar.
A diferença entre:
e
é noite e dia.
Exacerbe isso com centenas de classes, e isso se torna insustentável.
Então você combina isso com o fato de que o java tende a ser organizado como grupos de arquivos em diretórios, vs C e outros que tendem a uma estrutura mais plana. O Make não tem muito suporte direto para trabalhar com hierarquias de arquivos.
O Make também não é muito bom para determinar quais arquivos estão desatualizados, no nível da coleção.
Com o Ant, ele examinará e resumirá todos os arquivos desatualizados e os compilará de uma só vez. Make simplesmente chamará o compilador java em cada arquivo individual. Fazer o make NÃO fazer isso exige ferramentas externas suficientes para realmente mostrar que o make não está preparado para a tarefa.
É por isso que alternativas como Ant e Maven surgiram.
fonte
$?
variável automática que se expande para "todos os pré-requisitos mais recentes que o destino". Há também o recurso de regras de padrão com vários destinos que executariam a receita apenas uma vez para atualizar todos os.class
arquivos. Combine isso com algum uso inteligente de arquivo / funções de texto como$(wildcard)
,$(shell)
,$(eval)
e você pode ensinar seu makefile para descobrir alvos de construção espalhados por todo o seu layout de diretório.O venerável
make
programa lida com linguagens compiladas separadamente como C e C ++ razoavelmente bem. Você compila um módulo, ele usa#include
para extrair o texto de outros arquivos de inclusão e grava um único arquivo de objeto como saída. O compilador é basicamente um sistema de cada vez, com uma etapa de vinculação separada para vincular os arquivos de objeto a um binário executável.No entanto, em Java, o compilador precisa realmente compilar outras classes com as quais você importa
import
. Embora fosse possível escrever algo que gerasse todas as dependências necessárias do código-fonte Java, paramake
criar classes na ordem correta, uma de cada vez, isso ainda não trataria casos como dependências circulares.O compilador Java também pode ser mais eficiente, armazenando em cache os resultados compilados de outras classes enquanto compila outras classes que dependem dos resultados das que já foram compiladas. Esse tipo de avaliação automática de dependência não é realmente possível
make
sozinho.fonte
A questão é baseada em uma suposição incorreta: um número não-trivial de desenvolvedores fazem uso
make
. Consulte Java Build Tools: Ant vs. Maven . Quanto ao motivo pelo qual um desenvolvedor não usariamake
: muitos desenvolvedores nunca o usarammake
ou o usaram e o odiaram com um fogo que queima mais que mil sóis. Como tal, eles usam ferramentas alternativas.fonte
make
possui muitos "recursos" que podem ter sentido quando foram escritos, mas agora são mais parecidos com bugs, por exemplo, você deve usar um caractere TAB, não espaços, em determinados lugares. Provavelmente esse tipo de coisa não incomoda as pessoas realmente experientesmake
, mas deixa o resto de nós doido.make depend
alguém?)Na verdade, o make pode manipular a recompilação em um comando de todos os arquivos java desatualizados. Altere a primeira linha se não desejar compilar todos os arquivos no diretório ou desejar uma ordem específica ...
fonte
Todas as outras respostas sobre os méritos técnicos de cada uma são verdadeiras.
Ant
eMaven
pode ser mais adequado para Java do que make, ou, como Hank Gay aponta, eles podem não ser :)No entanto, você perguntou se importa que Ant e Maven sejam escritos em Java. Embora no StackOverflow não consideremos tais pensamentos (fechados! Não relacionados à programação! Etc.), é claro que faz parte disso. Nos trilhos, usamos Rake, os caras C usam make e, em Java, usamos Ant e Maven. Embora seja verdade que os desenvolvedores Ant ou Maven cuidem do desenvolvedor Java talvez melhor do que outros, também há outra pergunta: em que você escreve tarefas Ant? Java. Se você é um desenvolvedor Java, é fácil.
Então, sim, parte disso é usar ferramentas escritas no idioma que você está usando ferramentas.
fonte
make
provém do background do UNIX, de modo que as ferramentas são feitas escrevendo utilitários compactos úteis e integrando-os em pipeline. É por isso que a maior parte da costura é feita usando comandos de shell.make
e pequenos utilitários Unix. O GIT também é filho desse processo. Em uma nota pessoal, eu não diria que não é melhor. Mas é uma enorme mudança de paradigma para programadores Java. Ant é muito mais consoante com as maneiras de pensar em Java.O Ant e mais tarde o Maven foram projetados para resolver algumas dores de cabeça causadas por
Make
(ao criar novas no processo). É apenas evolução.Em http://ant.apache.org/faq.html#history
Se eles resolvem alguma coisa ou apenas criam um formato extra para aprender é um tópico subjetivo. A verdade é que é praticamente a história de toda nova invenção: o criador diz que resolve muitos problemas e os usuários originais dizem que essas são virtudes.
A principal vantagem que ele tem é a possibilidade de integrar-se ao java.
Eu acho que uma história semelhante seria com,
rake
por exemplo.fonte
Um dos principais problemas resolvidos pelo Maven (e pelas configurações Ant habilitadas para Ivy) sobre o make é a resolução de dependência automatizada e o download dos seus jars de dependência.
fonte
Penso que a explicação mais provável é que vários fatores desencorajaram o uso de make dentro da comunidade Java em um período crítico (final da década de 1990):
Em resumo, embora o make certamente possa ser usado para projetos Java, houve um momento de oportunidade para torná-lo a ferramenta de construção Java de fato. Esse momento passou.
fonte
Fazer scripts tendem a ser inerentemente dependentes da plataforma. Java deve ser independente de plataforma. Portanto, ter um sistema de compilação que funcione apenas em uma plataforma para uma base de origem de várias plataformas é um problema.
fonte
Resposta curta: porque
make
não é bom. Mesmo na frente C, você vê muitas alternativas surgindo.Resposta longa:
make
possui várias falhas que dificilmente são adequadas para compilar C e inadequadas para compilar Java. Você pode forçá-lo a compilar Java, se desejar, mas espere encontrar problemas, alguns dos quais não têm uma solução ou solução alternativa adequada. Aqui estão alguns:Resolução de dependência
make
espera inerentemente que os arquivos tenham uma dependência semelhante a uma árvore, na qual um arquivo é o resultado da criação de vários outros. Isso já sai pela culatra em C ao lidar com arquivos de cabeçalho.make
requer que ummake
arquivo de inclusão específico seja gerado para representar a dependência de um arquivo C em seus arquivos de cabeçalho; portanto, uma alteração no último faria com que o anterior fosse reconstruído. No entanto, como o arquivo C em si não é recriado (apenas reconstruído), o make geralmente requer a especificação do destino como.PHONY
. Felizmente, o GCC suporta a geração desses arquivos automaticamente.Em Java, a dependência pode ser circular e não há ferramenta para gerar automaticamente dependências de classe no
make
formato.ant
EmDepend
vez disso, a tarefa de pode ler o arquivo de classe diretamente, determinar quais classes ele importa e excluir o arquivo de classe se alguma delas estiver desatualizada. Sem isso, qualquer dependência não trivial pode resultar em você ser forçado a usar compilações limpas repetidas, removendo qualquer vantagem de usar uma ferramenta de compilação.Espaços em nomes de arquivos
Embora nem Java nem C incentivem o uso de espaços em seus nomes de arquivos de código-fonte,
make
isso pode ser um problema, mesmo que os espaços estejam no caminho do arquivo. Considere, por exemplo, se seu código-fonte existe emC:\My Documents\My Code\program\src
. Isso seria suficiente para quebrarmake
. Isso ocorre porquemake
trata os nomes de arquivos como strings.ant
trata os caminhos como objetos especiais.Verificando arquivos para compilação
make
requer definir explicitamente quais arquivos devem ser criados para cada destino.ant
permite especificar uma pasta que deve ser verificada automaticamente em busca de arquivos de origem. Pode parecer uma conveniência menor, mas considere que em Java cada nova classe requer um novo arquivo. Adicionar arquivos ao projeto pode se tornar um grande aborrecimento rápido.E o maior problema com
make
:make depende do POSIX
O lema de Java é "compilar uma vez executado em qualquer lugar". Mas restringir essa compilação a sistemas baseados em POSIX, nos quais o suporte a Java é realmente o pior, não é a intenção.
As regras de compilação
make
são essencialmente pequenosbash
scripts. Mesmo que exista uma portamake
para o Windows, para que funcione corretamente, ela deve ser empacotada com uma porta debash
, que inclui uma camada de emulação POSIX para o sistema de arquivos.Isso vem em duas variedades:
MSYS
que tenta limitar a conversão POSIX a caminhos de arquivo e, portanto, pode ter dicas desagradáveis ao executar ferramentas externas não criadas especialmente para ela.cygwin
que fornece uma emulação completa do POSIX. Os programas resultantes, no entanto, tendem a ainda confiar nessa camada de emulação.Por esse motivo, no Windows, a ferramenta de construção padrão nem sequer é
make
, mas simMSBuild
, que também é uma ferramenta baseada em XML, mais próxima em princípioant
.Por outro lado,
ant
é construído em Java, pode ser executado em qualquer lugar e contém ferramentas internas, chamadas "tarefas", para manipular arquivos e executar comandos de maneira independente da plataforma. É suficientemente versátil que você pode ter mais facilidade para criar um programa C no Windows usando doant
que usandomake
.E um último menor:
Mesmo programas em C não usam make nativamente
Você pode não perceber isso inicialmente, mas os programas C geralmente não são enviados com um
Makefile
. Eles são enviados com umCMakeLists.txt
, ou umbash
script de configuração, que gera o realMakefile
. Por outro lado, a fonte de um programa Java construído usandoant
é fornecida com umant
script pré-construído. AMakefile
é um produto de outras ferramentas - é quantomake
é inadequado ser uma ferramenta de construção por si só.ant
é independente e lida com tudo o que você precisa para seu processo de construção Java, sem nenhum requisito ou dependência adicional.Quando você executa
ant
em qualquer plataforma, ele simplesmente funciona (tm). Você não pode entender issomake
. É incrivelmente dependente de plataforma e configuração.fonte
A menos que eu não seja ninguém, a suposição de que ninguém está (mis) usando o make for java está errada.
"Gerenciando projetos com o GNU Make" (disponível em GFDL) contém um capítulo completo dedicado ao uso
make
com projetos java.Como contém uma lista longa (e espero que justa) dos prós e contras do uso do make em vez de outras ferramentas, você pode dar uma olhada lá. (consulte: http://oreilly.com/catalog/make3/book/ )
fonte
Ant é um aprimoramento orientado à configuração XML em relação a Makefiles e o Maven é uma melhoria da ferramenta de criação de dependências em relação ao Ant. Alguns projetos usam todos os três. Eu acho que os projetos JDK costumavam usar uma mistura de makefiles e formiga.
fonte
Um grande motivo é que o Ant e o Maven (e a maioria das ferramentas SCM, CI e IDE direcionadas a java) são gravados em java por / para desenvolvedores de java. Isso facilita a integração em seu ambiente de desenvolvimento e permite que outras ferramentas, como os servidores IDE e CI, integrem partes das bibliotecas ant / maven à infraestrutura de construção / implantação.
fonte
Era uma vez eu trabalhei em um projeto Java que usava o gmake. Minha lembrança é nebulosa, mas no IIRC tivemos dificuldade em lidar com a estrutura de diretórios de pacotes que javac espera. Também me lembro que a criação de arquivos JAR era um aborrecimento, a menos que você tivesse algo trivial.
fonte
ApacheAnt não é nada como Make. Make é sobre descrever dependências entre arquivos e como criar arquivos. Ant é sobre dependências entre "tarefas" e é realmente mais uma maneira de colar scripts de compilação.
pode ajudar você a AntVsMake
fonte
Ant e Maven abordam o gráfico de dependência de construção e o gerenciamento de uma visão mais 'moderna' ... Mas, como Oscar diz, eles criaram seus próprios problemas ao tentar resolver os problemas antigos com make.
fonte
Nunca usei projetos GNU Make for Java, mas costumava usar o jmk . Infelizmente, não é atualizado desde 2002.
Ele possuía alguma funcionalidade específica para Java, mas era pequeno o suficiente para incluir no tarball de origem sem aumentar significativamente seu tamanho.
Atualmente, apenas assumo que qualquer desenvolvedor Java com o qual compartilho código tenha o Ant instalado.
fonte