Муравей против Мавена против Грэдла

Муравей против Мавена против Грэдла

1. Вступление

В этой статье мы будемexplore three Java build automation tools which dominated the JVM ecosystem – Ant, Maven, and Gradle.

Мы познакомим вас с каждым из них и рассмотрим, как развивались инструменты автоматизации сборки Java.

2. Apache Ant

In the beginning, Make was the only build automation tool, помимо собственных решений. Make существует с 1976 года и, как таковой, использовался для создания приложений Java в первые годы существования Java.

Однако многие соглашения программ на C не вписывались в экосистему Java, поэтому со временем Ant был выпущен как лучшая альтернатива.

Apache Ant (“Another Neat Tool”) is a Java library used for automating build processes for Java applications. Кроме того, Ant можно использовать для создания не-Java-приложений. Первоначально он был частью кодовой базы Apache Tomcat и был выпущен как самостоятельный проект в 2000 году.

Во многих аспектах Ant очень похож на Make, и он достаточно прост, так что любой может начать использовать его без каких-либо предварительных условий. Файлы сборки Ant написаны в XML и по соглашению называютсяbuild.xml.

Различные фазы процесса сборки называются «целями».

Вот пример файлаbuild.xml для простого проекта Java с основным классомHelloWorld:


    
        
    

    
        
        
    

    
        
        
            
                
            
        
    

    
        
    

Этот файл сборки определяет четыре цели:clean,compile,jar иrun. Например, мы можем скомпилировать код, выполнив:

ant compile

Это сначала вызовет целевойclean, который удалит каталог «классов». После этого целевойcompile воссоздает каталог и компилирует в него папку src.

The main benefit of Ant is its flexibility. Ant doesn’t impose any coding conventions or project structures. Следовательно, это означает, что Ant требует, чтобы разработчики сами писали все команды, что иногда приводит к огромным файлам сборки XML, которые трудно поддерживать.

Поскольку нет никаких соглашений, просто знание Ant не означает, что мы быстро разберемся с любым файлом сборки Ant. Скорее всего, потребуется некоторое время, чтобы привыкнуть к незнакомому файлу Ant, что является недостатком по сравнению с другими, более новыми инструментами.

Сначала у Ant не было встроенной поддержки управления зависимостями. Однако, поскольку в последующие годы управление зависимостями стало обязательным,Apache Ivy был разработан как подпроект проекта Apache Ant. Он интегрирован с Apache Ant и следует тем же принципам проектирования.

Однако первоначальные ограничения Ant из-за отсутствия встроенной поддержки управления зависимостями и разочарований при работе с неуправляемыми файлами сборки XML привели к созданию Maven.

3. Apache Maven

Apache Maven - это средство управления зависимостями и автоматизации сборки, в основном используемое для приложений Java. Maven continues to use XML files just like Ant but in a much more manageable way. Здесь название игры - соглашение, а не конфигурация.

Хотя Ant дает гибкость и требует, чтобы все было написано с нуля,Maven relies on conventions and provides predefined commands (goals).

Проще говоря, Maven позволяет нам сосредоточиться на том, что должна делать наша сборка, и дает нам основу для этого. Еще одним положительным аспектом Maven было то, что он предоставил встроенную поддержку управления зависимостями.

Файл конфигурации Maven, содержащий инструкции по сборке и управлению зависимостями, по соглашению называетсяpom.xml. Кроме того, Maven также предписывает строгую структуру проекта, в то время как Ant также обеспечивает гибкость.

Вот пример файлаpom.xml для того же простого проекта Java с основным классомHelloWorld из предыдущего:


    4.0.0
    example
    mavenExample
    0.0.1-SNAPSHOT
    Maven example

    
        
            junit
            junit
            4.12
            test
        
    

Однако теперь структура проекта также стандартизирована и соответствует конвенциям Maven:

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

В отличие от Ant, нет необходимости определять каждый из этапов процесса сборки вручную. Вместо этого мы можем просто вызвать встроенные команды Maven.

Например, мы можем скомпилировать код, выполнив:

mvn compile

По своей сути, как указано на официальных страницах,Maven can be considered a plugin execution framework, since all work is done by plugins. Maven поддерживает широкий диапазонavailable plugins, и каждый из них может быть дополнительно настроен.

Один из доступных плагинов - это плагин Apache Maven Dependency Plugin, цель которогоcopy-dependencies - копировать наши зависимости в указанный каталог.

Чтобы показать этот плагин в действии, давайте включим этот плагин в наш файлpom.xml и настроим выходной каталог для наших зависимостей:


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

Этот плагин будет выполняться на этапеpackage, поэтому, если мы запустим:

mvn package

Мы запустим этот плагин и скопируем зависимости в папку target / dependencies.

Также естьexisting article о том, как создать исполняемый JAR-файл с использованием различных плагинов Maven. Кроме того, для получения подробного обзора Maven взгляните наthis core guide on Maven, где исследуются некоторые ключевые функции Maven.

Maven стал очень популярным, так как теперь файлы сборки были стандартизированы, и для обслуживания файлов сборки требовалось значительно меньше времени, по сравнению с Ant. Однако файлы конфигурации Maven, хотя и более стандартизированные, чем файлы Ant, все же имеют тенденцию становиться большими и громоздкими.

Maven’s strict conventions come with a price of being a lot less flexible than Ant. Настройка цели очень сложна, поэтому писать собственные сценарии сборки намного сложнее, чем с Ant.

Несмотря на то, что Maven внес некоторые серьезные улучшения в упрощение и стандартизацию процессов сборки приложений, он по-прежнему имеет свою цену из-за того, что он намного менее гибок, чем Ant. Это привело к созданию Gradle, который сочетает в себе лучшее из обоих миров - гибкость Ant и возможности Maven.

4. Gradle

Gradle - это средство управления зависимостями и средство автоматизации сборки, котороеwas built upon the concepts of Ant and Maven.

Первое, что мы можем отметить в Gradle, это то, что он не использует XML-файлы, в отличие от Ant или Maven.

Со временем разработчики все больше и больше интересовались наличием и работой с языком, специфичным для предметной области, что, проще говоря, позволило бы им решать проблемы в конкретной области, используя язык, адаптированный для этой конкретной области.

Это было принято в Gradle, который использует DSL на основеGroovy. This led to smaller configuration files with less clutter since the language was specifically designed to solve specific domain problems. Файл конфигурации Gradle по соглашению называетсяbuild.gradle.

Вот пример файлаbuild.gradle для того же простого проекта Java с основным классомHelloWorld из предыдущего:

apply plugin: 'java'

repositories {
    mavenCentral()
}

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

dependencies {
    compile 'junit:junit:4.12'
}

Мы можем скомпилировать код, запустив:

gradle classes

По своей сути, Gradle намеренно предоставляет очень мало функций. Plugins add all useful features. В нашем примере мы использовали плагинjava, который позволяет нам компилировать код Java и другие ценные функции.

Gradle gave its build steps name “tasks”, as opposed to Ant’s “targets” or Maven’s “phases”. В Maven мы использовали подключаемый модуль Apache Maven Dependency Plugin, и его конкретная цель - скопировать зависимости в указанный каталог. С Gradle мы можем сделать то же самое, используя задачи:

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

Мы можем запустить эту задачу, выполнив:

gradle copyDependencies

5. Заключение

В этой статье мы представили Ant, Maven и Gradle - три средства автоматизации сборки Java.

Неудивительно, что сегодня Maven владеет большинствомthe build tool market. Gradle, однако, нашел хорошее применение в более сложных кодовых базах, включая ряд проектов с открытым исходным кодом, таких как Spring.