Warum Gradle anstelle von Ant oder Maven verwenden? [geschlossen]


324

Was bringt mir ein anderes Build-Tool für Java wirklich?

Wenn Sie Gradle über einem anderen Tool verwenden, warum?


6
Google sprang mit Gradle für Android SDK. developer.google.com/events/io/sessions/325236644 . Intellij hat jetzt Unterstützung für Gradle hinzugefügt. Das bringt Gradle in den Hauptstrom (nicht nur Spielzeugprojekte)
Jayan

Frühlingsartefakte werden jetzt auch von Gradle erstellt. Ich denke, der Ruhezustand ist der gleiche.
Amir Pashazadeh

Antworten:


248

Ich benutze Gradle selbst nicht im Zorn (bisher nur ein Spielzeugprojekt) [Autor bedeutet, dass sie Gradle bisher nur für ein Spielzeugprojekt verwendet haben, nicht, dass Gradle ein Spielzeugprojekt ist - siehe Kommentare] , aber ich würde das sagen Die Gründe, warum man es in Betracht ziehen würde, wären die Frustrationen von Ant und Maven.

Nach meiner Erfahrung ist Ant oft nur schreibgeschützt (ja, ich weiß, dass es möglich ist, einen wunderschön modularen, eleganten Build zu schreiben , aber die meisten Leute tun dies nicht). Bei nicht trivialen Projekten wird es umwerfend und es wird sehr darauf geachtet, dass komplexe Builds wirklich portabel sind. Seine zwingende Natur kann zur Replikation der Konfiguration zwischen Builds führen (obwohl Makros hier helfen können).

Maven verfolgt den umgekehrten Ansatz und erwartet, dass Sie sich vollständig in den Maven-Lebenszyklus integrieren. Erfahrene Ant-Benutzer finden dies besonders beunruhigend, da Maven viele der Freiheiten, die Sie in Ant haben, aufhebt. Zum Beispiel gibt es einen Sonatype-Blog , der viele der Maven-Kritikpunkte und ihre Antworten auflistet .

Der Maven-Plugin-Mechanismus ermöglicht sehr leistungsfähige Build-Konfigurationen. Mit dem Vererbungsmodell können Sie einen kleinen Satz übergeordneter POMs definieren, die Ihre Build-Konfigurationen für das gesamte Unternehmen kapseln, und einzelne Projekte können diese Konfigurationen erben, sodass sie leichtgewichtig bleiben. Die Maven-Konfiguration ist sehr ausführlich (obwohl Maven 3 verspricht, dies zu beheben), und wenn Sie etwas tun möchten, das "nicht der Maven-Weg" ist, müssen Sie ein Plugin schreiben oder die hackige Ant-Integration verwenden. Hinweis: Ich schreibe gerne Maven-Plugins, weiß aber zu schätzen, dass viele Einwände gegen den Aufwand erheben.

Gradle verspricht, den Sweet Spot zwischen Ant und Maven zu erreichen. Es verwendet den Ivy -Ansatz zur Auflösung von Abhängigkeiten. Es ermöglicht Konventionen über die Konfiguration, enthält aber auch Ant-Aufgaben als erstklassige Bürger. Mit Bedacht können Sie auch vorhandene Maven / Ivy-Repositories verwenden.

Wenn Sie also einen der Schmerzpunkte von Ant / Maven getroffen haben und festgefahren sind, lohnt es sich wahrscheinlich, Gradle auszuprobieren. Meiner Meinung nach bleibt jedoch abzuwarten, ob Sie nicht nur bekannte Probleme gegen unbekannte austauschen würden. Der Beweis für den Pudding ist jedoch das Essen, daher würde ich mir ein Urteil vorbehalten, bis das Produkt etwas reifer ist und andere Knicke ausgebügelt haben (sie nennen es aus einem bestimmten Grund Blutungskante). Ich werde es trotzdem in meinen Spielzeugprojekten verwenden. Es ist immer gut, sich der Optionen bewusst zu sein.


69
@ Tom Ich habe nicht gesagt, dass Gradle ein Spielzeugprojekt ist, sondern dass ich es bisher nur für ein Spielzeugprojekt verwendet habe. Tut mir leid, dass Sie sich irregeführt fühlten
Rich Seller

18
Sleer - trotz des Alters habe ich den Beitrag bearbeitet, um inline zu klären, was in den Kommentaren klargestellt wird - das Missverständnis färbt den Beitrag sofort als Anti-Gradle. Wenn jemand, der Gradle recherchiert (wie ich), diesen einleitenden Satz anfänglich falsch versteht (wie ich), liest er möglicherweise nicht viel weiter oder liest den klarstellenden Kommentar (wie ich es fast getan habe). Bitte setzen Sie meine Änderung zurück / bearbeiten Sie sie, wenn Sie nicht einverstanden sind / nicht mögen.
Bert F

48
Für das, was es wert ist, hatte ich nicht den Eindruck, dass @RichSeller bedeutete, dass Gradle überhaupt für Spielzeugprojekte gedacht war (noch bevor ich das Teil in eckigen Klammern las).
Jack Leow

2
Als ich "bisher nur ein Spielzeugprojekt" las, hatte ich sofort den Eindruck, dass der Autor Gradle selbst als Spielzeugprojekt bezeichnete, insbesondere nach dem verwirrenden "Ich benutze Gradle selbst nicht im Zorn". Dies deutet darauf hin, dass der Autor Gradle verwendet, wenn er nicht wütend ist. Ich schlage vor, nur den ersten ganzen Satz umzuschreiben.
osa

79

Gradle kann für viele Zwecke verwendet werden - es ist ein viel besseres Schweizer Taschenmesser als Ant -, aber es konzentriert sich speziell auf Multi-Projekt-Builds.

Erstens ist Gradle ein Abhängigkeitsprogrammierwerkzeug, was auch bedeutet, dass es ein Programmierwerkzeug ist. Mit Gradle können Sie jede zufällige Aufgabe in Ihrem Setup ausführen und Gradle stellt sicher, dass alle deklarierten Abhängigkeiten ordnungsgemäß und rechtzeitig ausgeführt werden. Ihr Code kann in jeder Art von Layout (Baum, flach, verstreut, ...) auf viele Verzeichnisse verteilt werden.

Gradle hat zwei unterschiedliche Phasen: Bewertung und Ausführung. Grundsätzlich sucht und bewertet Gradle während der Evaluierung Build-Skripte in den Verzeichnissen, nach denen es suchen soll. Während der Ausführung führt Gradle Aufgaben aus, die während der Auswertung geladen wurden, wobei die Abhängigkeiten zwischen den Aufgaben berücksichtigt werden.

Zusätzlich zu diesen Abhängigkeitsprogrammierungsfunktionen fügt Gradle durch Integration mit Apache Ivy Projekt- und JAR-Abhängigkeitsfunktionen hinzu. Wie Sie wissen, ist Ivy ein viel leistungsfähigeres und weniger einfühlsames Tool für das Abhängigkeitsmanagement als Maven.

Gradle erkennt Abhängigkeiten zwischen Projekten sowie zwischen Projekten und JARs. Gradle arbeitet mit Maven-Repositorys (Download und Upload) wie dem iBiblio-Repository oder Ihren eigenen Repositorys, unterstützt aber auch andere Repository-Infrastrukturen, die Sie möglicherweise haben.

In Builds mit mehreren Projekten ist Gradle sowohl anpassbar als auch an die Struktur und Architektur des Builds anpassbar. Sie müssen Ihre Struktur oder Architektur nicht wie bei Maven an Ihr Build-Tool anpassen.

Gradle bemüht sich sehr, Ihnen nicht in die Quere zu kommen, eine Anstrengung, die Maven fast nie unternimmt. Konvention ist gut, aber auch Flexibilität. Gradle bietet Ihnen viel mehr Funktionen als Maven, aber am wichtigsten ist, dass Gradle Ihnen in vielen Fällen einen schmerzlosen Übergangspfad von Maven bietet.


64

Dies mag etwas kontrovers sein, aber Gradle verbirgt nicht die Tatsache, dass es sich um eine vollwertige Programmiersprache handelt.

Ant + Ant-Contrib ist im Wesentlichen eine vollständige Programmiersprache, in der niemand wirklich programmieren möchte.

Maven versucht den umgekehrten Ansatz, vollständig deklarativ zu sein und Sie zu zwingen, ein Plugin zu schreiben und zu kompilieren, wenn Sie Logik benötigen. Es wird auch ein Projektmodell auferlegt, das völlig unflexibel ist. Gradle kombiniert das Beste aus all diesen Tools:

  • Es folgt der Konvention über Konfiguration (ala Maven), aber nur in dem Maße, wie Sie es möchten
  • Sie können damit flexible benutzerdefinierte Aufgaben wie in Ant schreiben
  • Es bietet Projektunterstützung mit mehreren Modulen, die sowohl Ant als auch Maven überlegen ist
  • Es hat ein DSL, das die 80% Dinge einfach und die 20% Dinge möglich macht (im Gegensatz zu anderen Build-Tools, die die 80% einfach, 10% möglich und 10% effektiv unmöglich machen).

Gradle ist das konfigurierbarste und flexibelste Build-Tool, das ich bisher noch nicht verwendet habe. Das Erlernen von DSL und Konzepten wie Konfigurationen erfordert einige Investitionen, aber wenn Sie ein schnörkelloses und vollständig konfigurierbares JVM-Build-Tool benötigen, ist es schwer zu übertreffen.


49

Gradle kombiniert Ant und Maven gut und holt das Beste aus beiden Frameworks heraus. Flexibilität von Ant und Konvention über Konfiguration, Abhängigkeitsmanagement und Plugins von Maven.

Wenn Sie also einen Standard-Java-Build wie in Maven haben möchten, die Testaufgabe jedoch einen benutzerdefinierten Schritt ausführen muss, könnte dies wie folgt aussehen.

build.gradle:

apply plugin:'java'
task test{
  doFirst{
    ant.copy(toDir:'build/test-classes'){fileset dir:'src/test/extra-resources'}
  }
  doLast{
    ...
  }
}

Darüber hinaus wird eine groovige Syntax verwendet, die viel mehr Ausdruckskraft bietet als die XML von ant / maven.

Es ist eine Obermenge von Ant - Sie können alle Ant-Aufgaben in Gradle mit einer schöneren, groovigen Syntax verwenden, d. H.

ant.copy(file:'a.txt', toDir:"xyz")

oder

ant.with{
  delete "x.txt"
  mkdir "abc"
  copy file:"a.txt", toDir: "abc"
}

35

Wir verwenden Gradle und haben es Maven und Ant vorgezogen. Ant hat uns absolute Flexibilität gegeben, und Ivy bietet ein besseres Abhängigkeitsmanagement als Maven, aber es gibt keine großartige Unterstützung für Builds mit mehreren Projekten. Am Ende wird viel programmiert, um Builds für mehrere Projekte zu unterstützen. Es ist auch schön, einige Build-by-Konventionen zu haben, und macht Build-Skripte prägnanter. Mit Maven geht das Erstellen nach Konvention zu weit, und das Anpassen Ihres Erstellungsprozesses wird zu einem Hack. Außerdem fördert Maven jedes Projekt, das ein Artefakt veröffentlicht. Manchmal haben Sie ein Projekt in Teilprojekte aufgeteilt, aber Sie möchten, dass alle Teilprojekte zusammen erstellt und versioniert werden. Nicht wirklich etwas, für das Maven entwickelt wurde.

Mit Gradle können Sie die Flexibilität von Ant haben und nach der Konvention von Maven bauen. Zum Beispiel ist es trivial, den herkömmlichen Build-Lebenszyklus mit Ihrer eigenen Aufgabe zu verlängern. Und Sie sind nicht gezwungen, eine Konvention zu verwenden, wenn Sie nicht möchten. Groovy ist viel besser zu codieren als XML. In Gradle können Sie Abhängigkeiten zwischen Projekten im lokalen Dateisystem definieren, ohne Artefakte für jedes Projekt in einem Repository veröffentlichen zu müssen. Schließlich verwendet Gradle Ivy, sodass es ein hervorragendes Abhängigkeitsmanagement bietet. Der einzige wirkliche Nachteil für mich ist das Fehlen einer ausgereiften Eclipse-Integration, aber die Optionen für Maven sind nicht wirklich viel besser.


2
Persönlich denke ich, dass die Eclipse-Integration in Ordnung ist. Die Installation in Juno ist ziemlich einfach.
Djangofan

1
2 Jahre nachdem der Autor diese Antwort geschrieben hat!
Dennis

21

Dies ist nicht meine Antwort, aber es stimmt definitiv mit mir überein. Es ist vom Technologie-Radar von ThoughtWorks vom Oktober 2012 :

Zwei Dinge haben bei XML-basierten Build-Tools wie Ant und Maven zu Müdigkeit geführt: zu viele verärgerte spitze Klammern und die Grobheit von Plug-In-Architekturen. Während Syntaxprobleme durch Generierung behoben werden können, schränken Plug-In-Architekturen die Fähigkeit von Build-Tools, bei komplexeren Projekten elegant zu wachsen, erheblich ein. Wir haben das Gefühl, dass Plug-Ins die falsche Abstraktionsebene darstellen und bevorzugen stattdessen sprachbasierte Tools wie Gradle und Rake, da sie auf lange Sicht feinkörnigere Abstraktionen und mehr Flexibilität bieten.


16

Gradle hat den Spaß wieder in das Erstellen / Zusammenbauen von Software gesteckt. Ich habe während meiner gesamten Karriere Ant verwendet, um Software zu erstellen, und ich habe immer den eigentlichen "Buildit" -Teil der Entwicklungsarbeit als notwendiges Übel angesehen. Vor ein paar Monaten wurde unser Unternehmen es leid, kein binäres Repo zu verwenden (auch bekannt als Einchecken von Gläsern in die VCS), und ich erhielt die Aufgabe, dies zu untersuchen. Begonnen mit Efeu, da es auf Ameise geschraubt werden konnte, hatte ich nicht viel Glück, meine gebauten Artefakte so zu veröffentlichen, wie ich es wollte. Ich habe mich für Maven entschieden und mich mit XML gehackt, für einige einfache Hilfsbibliotheken hervorragend gearbeitet, aber ich hatte ernsthafte Probleme beim Versuch, bereitstellbare Anwendungen zu bündeln. Ich habe eine ganze Weile Probleme damit gehabt, Plugins zu googeln, Foren zu lesen und Billionen von Support-Gläsern für verschiedene Plugins herunterzuladen, die ich nur schwer verwenden konnte.

Aber vom ersten Tag an begann sich meine Stimmung zu verbessern. Ich kam irgendwohin. Ich habe ungefähr zwei Stunden gebraucht, um mein erstes Ant-Modul zu migrieren, und die Build-Datei war im Grunde nichts. Einfach ein Bildschirm montiert. Das große "Wow" war: Skripte in XML erstellen , wie dumm ist das? Die Tatsache, dass das Deklarieren einer Abhängigkeit EINE Zeile benötigt, ist für mich sehr ansprechend -> Sie können alle Abhängigkeiten für ein bestimmtes Projekt leicht auf einer Seite sehen. Von da an war ich ständig auf dem Laufenden, für jedes Problem, mit dem ich bisher konfrontiert war, gibt es eine einfache und elegante Lösung. Ich denke das sind die Gründe:

  • groovy ist für Java-Entwickler sehr intuitiv
  • Die Dokumentation ist großartig bis großartig
  • Die Flexibilität ist endlos

Jetzt verbringe ich meine Tage damit, mir neue Funktionen auszudenken, um unseren Erstellungsprozess zu erweitern. Wie krank ist das


+1 für " Skripte in XML erstellen , wie dumm ist das?" Im Jahr 2000 galt XML als die coolste Sache aller Zeiten, daher schien es zu dieser Zeit fairerweise eher trendy als dumm zu sein. XML-basierte Programmiersprachen sind im Grunde genommen Lisps, da sie die Open / Close-Trennzeichen für jeden Befehl haben. Aber es sind superverbose Versionen von lisp, bei denen aus 4 Zeichen Code 40 Zeichen werden. Es ist eine Möglichkeit zu lernen, wie man tippt, aber nicht meine Tasse Tee.
GlenPeterson

8

Es ist auch viel einfacher, native Builds zu verwalten. Ant und Maven sind praktisch nur Java. Für Maven gibt es einige Plugins, die versuchen, einige native Projekte zu bearbeiten, aber keine effektive Arbeit leisten. Es können Ameisenaufgaben geschrieben werden, die native Projekte kompilieren, aber sie sind zu komplex und umständlich.

Wir machen Java mit JNI und vielen anderen nativen Bits. Gradle hat unser Ameisen-Chaos erheblich vereinfacht. Als wir anfingen, das Abhängigkeitsmanagement in die nativen Projekte einzuführen, war es chaotisch. Wir haben Maven dazu gebracht, aber der entsprechende Gradle-Code war ein winziger Bruchteil dessen, was in Maven benötigt wurde, und die Leute konnten ihn lesen und verstehen, ohne Maven-Gurus zu werden.


3

Ich stimme Ed Staub teilweise zu. Gradle ist definitiv leistungsfähiger als Maven und bietet langfristig mehr Flexibilität.

Nachdem wir eine Evaluierung durchgeführt hatten, um von Maven zu Gradle zu wechseln, entschieden wir uns, bei zwei Problemen, die bei Gradle auftraten, bei Maven selbst zu bleiben (Geschwindigkeit ist langsamer als bei Maven, Proxy funktionierte nicht).


Ich hatte Proxy-Probleme mit v1.2, aber seitdem denke ich, dass es funktioniert hat. So sehr, ctnlm oder eine solche App ist eine Lösung für maven, um NTLM-Proxy-Probleme zu lösen. Gradle hat diese Unterstützung sofort. Obwohl dies so trivial ist, frage ich mich, warum Maven diese Unterstützung für NTLM-Authentifizierungs-basierte Proxys nie sofort hatte.
überspringen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.