Кто круче: Maven или Gradle?
Таким вопросом часто задаются начинающие разработчики, выбирая лучший сборщик для своего Java-проекта. Давайте попробуем немного разобраться в этом совсем неоднозначном вопросе.
Кто проще?
Скрипты сборки Gradle, написанные на Groovy, на порядок короче XML, используемых Maven. Разница заметна уже на hello world.
Hello world на Maven:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>edu.maven</groupId> <artifactId>hello-maven</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
Hello world на Gradle:
// build.gradle apply plugin: 'java' repositories { mavenCentral() } dependencies { compile 'org.slf4j:slf4j-api:1.7.25' testCompile 'junit:junit:4.12' }
Обратите внимание, что зависимость в Gradle записывается одной (!) строкой, вместо 4-6 в Maven. Но за простотой скриптов скрываются сложная модель сборки, особенности Groovy и DSL Gradle. Удивительно, но в этом build.gradle записаны не массивы и задание параметров, а полноценные вызовы методов (!). А аналог scope в Gradle называется конфигурацией, и их может быть 13, помимо пользовательских. Проще ли это?
Кто быстрее?
Безусловно, Gradle быстрее Maven. Впечатляющие графики и GIF-ку можно посмотреть здесь. Чтобы Gradle максимально быстро собирал ваш проект, в нём используются всевозможные кэши и даже специальный процесс – Gradle Daemon, живущий после сборки. Но если вы отключите Gradle Daemon на CI (или осуществляете сборку не так часто), то прирост в скорости станет не такой очевидный.
У кого инфраструктура?
Если присмотреться к вышеописанному build.gradle, то можем увидеть упоминание Maven в конфигурации. Да, вы не ошиблись, Gradle загружает зависимости из Maven-репозитория — у Gradle нет собственной инфраструктуры, это просто сборщик. И если вы решили разрабатывать библиотеку на Gradle, то придётся не только загружать её в Maven-репозиторий, но генерировать и сам pom.xml.
Так кто же круче?
Напишите в комментариях!