Ant vs Maven vs Gradle

Ant vs Maven vs Gradle

1. Introdução

Neste artigo, vamosexplore three Java build automation tools which dominated the JVM ecosystem – Ant, Maven, and Gradle.

Apresentaremos cada um deles e exploraremos como as ferramentas de automação de construção Java evoluíram.

2. Formiga Apache

In the beginning, Make was the only build automation tool, além de soluções caseiras. Make existe desde 1976 e, como tal, foi usado para construir aplicativos Java nos primeiros anos do Java.

No entanto, muitas convenções de programas C não se encaixavam no ecossistema Java, então com o tempo o Ant foi lançado como uma alternativa melhor.

Apache Ant (“Another Neat Tool”) is a Java library used for automating build processes for Java applications. Além disso, o Ant pode ser usado para criar aplicativos não Java. Inicialmente, fazia parte da base de código do Apache Tomcat e foi lançado como um projeto independente em 2000.

Em muitos aspectos, o Ant é muito semelhante ao Make e é simples o suficiente para que qualquer pessoa possa começar a usá-lo sem nenhum pré-requisito específico. Os arquivos de construção Ant são escritos em XML e, por convenção, são chamados debuild.xml.

Diferentes fases de um processo de construção são chamadas de "destinos".

Aqui está um exemplo de um arquivobuild.xml para um projeto Java simples com a classe principalHelloWorld:


    
        
    

    
        
        
    

    
        
        
            
                
            
        
    

    
        
    

Este arquivo de construção define quatro destinos:clean,compile,jarerun. Por exemplo, podemos compilar o código executando:

ant compile

Isso acionará o targetclean primeiro, que excluirá o diretório “classes”. Depois disso, targetcompile irá recriar o diretório e compilar a pasta src nele.

The main benefit of Ant is its flexibility. Ant doesn’t impose any coding conventions or project structures. Consequentemente, isso significa que o Ant requer que os desenvolvedores escrevam todos os comandos por conta própria, o que às vezes leva a enormes arquivos de construção XML que são difíceis de manter.

Uma vez que não há convenções, apenas conhecer o Ant não significa que vamos entender rapidamente qualquer arquivo de construção do Ant. Provavelmente levará algum tempo para se acostumar com um arquivo Ant desconhecido, o que é uma desvantagem em comparação com outras ferramentas mais recentes.

No início, o Ant não tinha suporte interno para gerenciamento de dependências. No entanto, como o gerenciamento de dependências se tornou uma obrigação nos últimos anos,Apache Ivy foi desenvolvido como um subprojeto do projeto Apache Ant. É integrado ao Apache Ant e segue os mesmos princípios de design.

No entanto, as limitações iniciais do Ant devido à falta de suporte interno para gerenciamento de dependências e frustrações ao trabalhar com arquivos de construção XML incontroláveis ​​levaram à criação do Maven.

3. Apache Maven

Apache Maven é um gerenciamento de dependências e uma ferramenta de automação de construção, usada principalmente para aplicativos Java. Maven continues to use XML files just like Ant but in a much more manageable way. O nome do jogo aqui é convenção sobre configuração.

Embora o Ant dê a flexibilidade e exija que tudo seja escrito do zero,Maven relies on conventions and provides predefined commands (goals).

Simplificando, o Maven nos permite focar no que nossa compilação deve fazer e nos fornece a estrutura para fazê-lo. Outro aspecto positivo do Maven foi que ele forneceu suporte interno para gerenciamento de dependências.

O arquivo de configuração do Maven, contendo instruções de construção e gerenciamento de dependências, é por convenção chamadopom.xml. Além disso, o Maven também prescreve uma estrutura de projeto rigorosa, enquanto o Ant fornece flexibilidade também.

Aqui está um exemplo de um arquivopom.xml para o mesmo projeto Java simples com a classe principalHelloWorld de antes:


    4.0.0
    example
    mavenExample
    0.0.1-SNAPSHOT
    Maven example

    
        
            junit
            junit
            4.12
            test
        
    

No entanto, agora a estrutura do projeto também foi padronizada e está em conformidade com as convenções do Maven:

+---src
|   +---main
|   |   +---java
|   |   |   \---com
|   |   |       \---example
|   |   |           \---maven
|   |   |                   HelloWorld.java
|   |   |
|   |   \---resources
|   \---test
|       +---java
|       \---resources

Ao contrário do Ant, não há necessidade de definir cada uma das fases no processo de construção manualmente. Em vez disso, podemos simplesmente chamar os comandos integrados do Maven.

Por exemplo, podemos compilar o código executando:

mvn compile

Em seu núcleo, conforme observado nas páginas oficiais,Maven can be considered a plugin execution framework, since all work is done by plugins. Maven suporta uma ampla gama deavailable plugins, e cada um deles pode ser configurado adicionalmente.

Um dos plug-ins disponíveis é o plug-in de dependência do Apache Maven, que tem uma metacopy-dependencies que copiará nossas dependências para um diretório especificado.

Para mostrar este plugin em ação, vamos incluir este plugin em nosso arquivopom.xml e configurar um diretório de saída para nossas dependências:


    
        
            org.apache.maven.plugins
            maven-dependency-plugin
            
                
                    copy-dependencies
                    package
                    
                        copy-dependencies
                    
                    
                        target/dependencies
                          
                    
                
            
        
    

Este plugin será executado em uma fasepackage, então se executarmos:

mvn package

Vamos executar este plugin e copiar as dependências para a pasta target / dependencies.

Também existe umexisting article sobre como criar um JAR executável usando diferentes plug-ins Maven. Além disso, para uma visão geral detalhada do Maven, dê uma olhada emthis core guide on Maven, onde alguns dos principais recursos do Maven são explorados.

O Maven se tornou muito popular, já que os arquivos de compilação agora eram padronizados e levava muito menos tempo para manter os arquivos de compilação, em comparação com o Ant. No entanto, embora sejam mais padronizados que os arquivos Ant, os arquivos de configuração do Maven ainda tendem a ficar grandes e pesados.

Maven’s strict conventions come with a price of being a lot less flexible than Ant. A customização de metas é muito difícil, então escrever scripts de construção customizados é muito mais difícil de fazer, em comparação com o Ant.

Embora o Maven tenha feito algumas melhorias sérias em relação a tornar os processos de construção de aplicativos mais fáceis e padronizados, ele ainda tem um preço por ser muito menos flexível do que o Ant. Isso levou à criação do Gradle, que combina o melhor dos dois mundos - a flexibilidade do Ant e os recursos do Maven.

4. Gradle

Gradle é um gerenciamento de dependência e uma ferramenta de automação de compilação quewas built upon the concepts of Ant and Maven.

Uma das primeiras coisas que podemos observar sobre o Gradle é que ele não usa arquivos XML, ao contrário do Ant ou Maven.

Com o tempo, os desenvolvedores ficaram cada vez mais interessados ​​em ter e trabalhar com uma linguagem específica de domínio - o que, simplesmente, permitiria que eles resolvessem problemas em um domínio específico usando uma linguagem personalizada para esse domínio em particular.

Isso foi adotado pelo Gradle, que está usando um DSL baseado emGroovy. O arquivo de configuração do Gradle deThis led to smaller configuration files with less clutter since the language was specifically designed to solve specific domain problems. é por convenção chamadobuild.gradle.

Aqui está um exemplo de um arquivobuild.gradle para o mesmo projeto Java simples com a classe principalHelloWorld anterior:

apply plugin: 'java'

repositories {
    mavenCentral()
}

jar {
    baseName = 'gradleExample'
    version = '0.0.1-SNAPSHOT'
}

dependencies {
    compile 'junit:junit:4.12'
}

Podemos compilar o código executando:

gradle classes

Na sua essência, Gradle fornece intencionalmente muito pouca funcionalidade. Plugins add all useful features. Em nosso exemplo, estávamos usando o pluginjava que nos permite compilar o código Java e outros recursos valiosos.

Gradle gave its build steps name “tasks”, as opposed to Ant’s “targets” or Maven’s “phases”. Com o Maven, usamos o plug-in de dependência do Apache Maven e seu objetivo específico é copiar as dependências para um diretório especificado. Com Gradle, podemos fazer o mesmo usando tarefas:

task copyDependencies(type: Copy) {
   from configurations.compile
   into 'dependencies'
}

Podemos executar esta tarefa executando:

gradle copyDependencies

5. Conclusão

Neste artigo, apresentamos Ant, Maven e Gradle - três ferramentas de automação de construção Java.

Não surpreendentemente, o Maven detém a maioria dethe build tool market hoje. Gradle, no entanto, teve uma boa adoção em bases de código mais complexas, incluindo vários projetos de código aberto, como o Spring.