it-swarm.com.de

Warum Gradle anstelle von Ant oder Maven verwenden?

Was bringt mir ein anderes Build-Tool, das auf Java) abzielt?

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

325
IttayD

Ich benutze Gradle selbst nicht im Zorn (bisher nur ein Spielzeugprojekt) [Der Autor meint, sie haben Gradle bisher nur für ein Spielzeugprojekt verwendet, nicht für dieses Gradle ist ein Spielzeugprojekt - siehe Kommentare] , aber ich würde 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 schreibgeschützt (ja, ich weiß, dass es möglich ist, wunderschön modular, elegant gebaut s zu schreiben, aber die meisten Leute tun dies nicht). Bei allen nicht trivialen Projekten wird es nervenaufreibend und es wird sehr darauf geachtet, dass komplexe Builds wirklich portabel sind. Der Imperativcharakter kann zu einer Replikation der Konfiguration zwischen Builds führen (obwohl Makros hier Abhilfe schaffen können).

Maven verfolgt den umgekehrten Ansatz und erwartet, dass Sie sich vollständig in den Maven-Lebenszyklus integrieren. Erfahrene Ant-Benutzer empfinden dies als 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-Plug-in-Mechanismus ermöglicht sehr leistungsfähige Build-Konfigurationen, und das Vererbungsmodell bedeutet, dass Sie einen kleinen Satz übergeordneter POMs definieren können, in denen Ihre Build-Konfigurationen für das gesamte Unternehmen zusammengefasst sind. Einzelne Projekte können diese Konfigurationen übernehmen, sodass sie unkompliziert bleiben. Die Maven-Konfiguration ist sehr ausführlich (obwohl Maven 3 dies verspricht), und wenn Sie etwas tun möchten, das "nicht der Maven-Weg" ist, müssen Sie ein Plugin schreiben oder die Hacky Ant-Integration verwenden. Hinweis: Ich schreibe gerne Maven-Plugins, aber ich weiß, dass viele gegen den Aufwand sind.

Gradle verspricht, den Sweet Spot zwischen Ant und Maven zu erreichen. Es wird der Ivy - Ansatz für die Auflösung von Abhängigkeiten verwendet. Es erlaubt Konventionen über die Konfiguration, beinhaltet aber auch Ant-Aufgaben als Bürger erster Klasse. Mit Bedacht können Sie auch vorhandene Maven/Ivy-Repositorys verwenden.

Wenn Sie also eine der Ameisen-/Maven-Schwachstellen getroffen haben und nicht weiterkommen, lohnt es sich wahrscheinlich, Gradle auszuprobieren. Meiner Meinung nach bleibt jedoch abzuwarten, ob Sie nicht einfach bekannte Probleme gegen unbekannte austauschen. Der Beweis für den Pudding ist das Essen, also würde ich mir ein Urteil vorbehalten, bis das Produkt etwas reifer ist und andere irgendwelche Knicke ausgebügelt haben (sie nennen es aus einem bestimmten Grund Blutungsrand). Ich werde es dennoch in meinen Spielzeugprojekten verwenden. Es ist immer gut, die Optionen zu kennen.

248
Rich Seller

Gradle kann für viele Zwecke verwendet werden - es ist ein viel besseres Schweizer Taschenmesser als Ant - aber es ist speziell auf Multiprojekt-Builds ausgerichtet.

Zuallererst ist Gradle ein Abhängigkeitsprogrammierwerkzeug, was auch bedeutet, dass es ein Programmierwerkzeug ist. Mit Gradle können Sie jede beliebige 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 vielen Verzeichnissen in jeder Art von Layout (Baum, flach, verstreut, ...) verteilt werden.

Gradle hat zwei verschiedene 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 unter Berücksichtigung der Abhängigkeiten zwischen den Aufgaben geladen wurden.

Zusätzlich zu diesen Funktionen für die Abhängigkeitsprogrammierung fügt Gradle durch die Integration mit Apache Ivy Funktionen für Projekt- und JAR-Abhängigkeiten 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 jedoch auch eine andere Art von Repository-Infrastruktur, 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 an Ihr Build-Tool anpassen, wie dies bei Maven erforderlich wäre.

Gradle ist sehr bemüht, sich nicht in die Quere zu kommen, eine Anstrengung, die Maven so gut wie nie macht. Konvention ist gut, Flexibilität aber auch. Gradle bietet Ihnen viel mehr Funktionen als Maven, vor allem aber bietet Gradle Ihnen in vielen Fällen einen schmerzlosen Übergangsweg von Maven weg.

79
Steven Devijver

Dies mag ein wenig umstritten sein, aber Gradle verbirgt nicht die Tatsache, dass es sich um eine vollwertige Programmiersprache handelt.

Ant + ant-contrib ist im Grunde eine aufregende vollständige Programmiersprache, in der niemand wirklich programmieren möchte.

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

  • Es folgt Konvention-über-Konfiguration (ala Maven), aber nur in dem Umfang, in dem Sie es wollen
  • Hiermit können Sie flexible benutzerdefinierte Aufgaben wie in Ant schreiben
  • Es bietet mehrmodulige Projektunterstützung, 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 verwendet habe. Das Erlernen von DSL und Konzepten wie Konfigurationen erfordert im Vorfeld einige Investitionen. Wenn Sie jedoch ein schnörkelloses und vollständig konfigurierbares JVM-Build-Tool benötigen, ist dies kaum zu übertreffen.

64
omnisis

Gradle kombiniert sowohl Ant als auch Maven sehr gut und nutzt das Beste aus beiden Frameworks. Flexibilität von Ant und Convention über Konfiguration, Abhängigkeitsmanagement und Plugins von Maven.

Wenn Sie also einen Standard-Build Java 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-Tasks 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"
}
49
piotrga

Wir verwenden Gradle und haben es Maven und Ant vorgezogen. Ant hat uns völlige 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. Sie müssen viel programmieren, um mehrere Projekte zu erstellen. Es ist auch nett, einige Build-by-Convention zu haben, und macht Build-Skripte prägnanter. Mit Maven geht es mit Builds zu weit und das Anpassen des Build-Prozesses wird zum Hack. Außerdem wirbt Maven für jedes Projekt, in dem ein Artefakt veröffentlicht wird. 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 haben Sie die Flexibilität von Ant und können nach den Konventionen von Maven bauen. Zum Beispiel ist es trivial, den konventionellen Build-Lebenszyklus mit Ihrer eigenen Aufgabe zu verlängern. Und Sie sind nicht gezwungen, eine Konvention zu verwenden, wenn Sie nicht möchten. Groovy lässt sich viel besser codieren als XML. In Gradle können Sie Abhängigkeiten zwischen Projekten im lokalen Dateisystem definieren, ohne dass Artefakte für jedes Projekt in einem Repository veröffentlicht werden müssen. Gradle verwendet schließlich Ivy und verfügt daher über ein hervorragendes Abhängigkeitsmanagement. 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.

35
BCK

Dies ist nicht meine Antwort, aber es schwingt definitiv mit mir mit. Es ist von ThoughtWorks 'Technologie-Radar von Oktober 2012 :

Zwei Dinge haben bei XML-basierten Build-Tools wie Ant und Maven Müdigkeit verursacht: 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 Möglichkeiten für Build-Tools, mit komplexeren Projekten problemlos 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 detailliertere Abstraktionen und langfristig mehr Flexibilität bieten.

21
Ed Staub

Gradle hat den Spaß wieder in das Bauen/Zusammenbauen von Software gesteckt. Ich habe während meiner gesamten Karriere mit ant Software erstellt und habe immer gedacht, dass der eigentliche "Buildit" -Teil der Entwicklungsarbeit ein notwendiges Übel ist. Vor ein paar Monaten wurde unser Unternehmen müde, kein binäres Repo (auch bekannt als Einchecken von Gläsern in die VCS) zu verwenden, 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 in XML gehackt. Ich habe großartig für einige einfache Helfer-Bibliotheken gearbeitet, aber ich hatte ernsthafte Probleme beim Versuch, Anwendungen zu bündeln, die für die Bereitstellung bereit sind. Es war eine Weile lang schwierig, Plugins zu googeln, Foren zu lesen und Billionen von Support-Jars für verschiedene Plugins herunterzuladen, mit denen ich Schwierigkeiten hatte. Endlich bin ich gradle gegangen (an diesem Punkt wurde ich ziemlich bitter und ärgerte mich darüber, dass "es nicht so schwer sein sollte!")

Aber vom ersten Tag an besserte sich meine Stimmung. Ich kam irgendwohin. Ich brauchte ungefähr zwei Stunden, um mein erstes Ant-Modul zu migrieren, und die Build-Datei war im Grunde genommen nichts. Ein Bildschirm passt problemlos. Das große "wow" war: build scripts in xml, wie dumm ist das denn? 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 auf einer Seite anzeigen. 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 Build-Prozess zu erweitern. Wie krank ist das

16
Kalle

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

Wir machen Java mit JNI und vielen anderen nativen Bits. Gradle hat unser Ameisen-Chaos erheblich vereinfacht. Als wir begannen, 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 zu Maven-Gurus zu werden.

8
swpalmer

Ich stimme Ed Staub teilweise zu. Gradle ist definitiv leistungsstärker 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 wir mit Gradle hatten, bei Maven zu bleiben (Geschwindigkeit ist langsamer als bei Maven, Proxy funktionierte nicht).

3
lives