{"id":891,"date":"2016-03-31T10:10:48","date_gmt":"2016-03-31T08:10:48","guid":{"rendered":"http:\/\/invidit.de\/blog\/?p=891"},"modified":"2016-03-31T10:11:43","modified_gmt":"2016-03-31T08:11:43","slug":"laeuft-schon-mit-gradle","status":"publish","type":"post","link":"https:\/\/invidit.de\/blog\/laeuft-schon-mit-gradle\/","title":{"rendered":"L\u00e4uft schon mit Gradle"},"content":{"rendered":"<p>Hallo Spa\u00df-Coder.<\/p>\n<p>Wir haben uns hier im Blog bereits mit der Frage besch\u00e4ftigt, wie in einem Softwareprojekt Abh\u00e4ngigkeiten zu Fremdbibliotheken verwaltet werden k\u00f6nnen und der gesamte Lebenszyklus einer Software unterst\u00fctzt wird. Hierzu kann das Werkzeug Maven eingesetzt werden. Artikel dazu findet ihr unter <a href=\"http:\/\/invidit.de\/blog\/tag\/maven\/\">diesem Stichwort<\/a>.<\/p>\n<p>In diesem Artikel werden wir uns anschauen, welche Alternative es zu Maven gibt und wann diese sinnvoll eingesetzt werden kann. Je doch sei in dieser Stelle darauf hinwiesen, dann dieser Artikel nur an der Oberfl\u00e4che von Gradle kratzt und wenige Einblicke gibt. Weiterf\u00fchrende Infos findet ihr in den Verweisen.<\/p>\n<p>&nbsp;<\/p>\n<h1>Wer ist dieser Gradle?<\/h1>\n<p>Gradle wird von seinen Entwicklern als Build-Werkzeug mit Quantensprung in der Java-Welt bezeichnet. \u00c4hnlich zu Maven arbeitet Gradle mit Konventionen, die &#8211; falls genutzt &#8211; eine aufwendige Konfiguration \u00fcberfl\u00fcssig machen. Nur Abweichungen von den Konventionen m\u00fcssen explizit gemacht werden (build by convention). Abh\u00e4ngigkeiten werden unter Anbindung von Maven-Repositories verwaltet und auch der Lebenszyklus mehrerer Projekte wird unterst\u00fctzt.<\/p>\n<p>Gradle kann nat\u00fcrlich, wie andere Tools auch, heruntergeladen und installiert werden oder durch eine Integration der Entwicklungsumgebung genutzt werden. Dar\u00fcber hinaus bietet Gradle jedoch eine weitere Variante ganz ohne Installation &#8211; den Gradle-Wrapper. Hierbei befindet sich Gradle in einem Java-Archiv und kann ganz ohne Installation genutzt werden.<\/p>\n<p>Die Entwicklungsumgebung IntelliJ bietet beispielsweise eine Integration zu Gradle. Wird ein neues Gradle-Projekt erstellt, kann die verwendete Art von Gradle ausgew\u00e4hlt werden, der Gradle-Wrapper ist dabei eine Option. IntelliJ legt automatisch im Projektverzeichnis einen Ordner &#8222;gradle&#8220; mit der jar-Datei sowie einer Properties-Datei an. Nun kann Gradle genutzt werden.<\/p>\n<p>&nbsp;<\/p>\n<h1>Wie sieht Gradle denn nun aus?<\/h1>\n<p>Schauen wir uns eine einfache Gradle-Konfiguration an, welche \u00fcblicherweise (nach Konvention) aus zwei Bestandteilen besteht:<\/p>\n<ul>\n<li>eine Datei mit Einstellungen (<em>settings.gradle<\/em>) und<\/li>\n<li>die Build-Beschreibung (<em>build.gradle<\/em>).<\/li>\n<\/ul>\n<p>Hier nun ein Beispiel aus einem kleinen Projekt.<\/p>\n<p><strong>settings.gradle<\/strong><\/p>\n<pre class=\"lang:default decode:true\" title=\"settings.gradle\">rootProject.name = 'AbstractFactory'<\/pre>\n<p><strong>build.gradle<\/strong><\/p>\n<pre class=\"lang:xhtml decode:true\" title=\"build.gradle\">group 'de.invidit'\r\n\r\napply plugin: 'java'\r\n\r\nsourceCompatibility = 1.8\r\n\r\nrepositories {\r\n   mavenCentral()\r\n}\r\n\r\ndependencies {\r\n   testCompile group: 'junit', name: 'junit', version: '4.11'\r\n   testCompile 'org.assertj:assertj-core:3.3.0'\r\n}<\/pre>\n<p>Gehen wir die beiden Dateien einmal durch. In den Einstellungen legen wir nur den Projektnamen fest, der z.B. in der IDE angezeigt wird oder auf den wir an anderer Stelle verweisen k\u00f6nnen. Die Beschreibung des Builds beginnt mit der Group-Id. Wie auch bei Maven wird unserem Projekt eine eindeutige Id zugewiesen. Dar\u00fcber, gemeinsam mit dem Projektnamen, k\u00f6nnen wir das Projekt z.B. aus einem Repository abrufen.<\/p>\n<p>Dann legen wir fest, dass wir das Java-Plugin f\u00fcr Gradle nutzen wollen. Dieses bietet f\u00fcr Java-Projekte einige hilfreiche Schritte im Lebenszyklus unseres Projekts, die wir uns sp\u00e4ter noch anschauen. Unsere Programmquellen sollen gegen Java 8 gepr\u00fcft werden, was wir mit &#8222;sourceCompatibility&#8220; festlegen. Dann geben wir das zentrale Maven-Repository an, in dem die im n\u00e4chsten Schritt angegebenen Abh\u00e4ngigkeiten zu finden sind. In diesem Projekt ben\u00f6tigen wir zum Ausf\u00fchren von Tests zwei externe Bibliotheken, n\u00e4mlich <em>JUnit<\/em> und <em>AssertJ<\/em>. Da wir uns diese nicht selbst herunterladen und in unser Projekt einbinden wollen, definieren wir in unserer Build-Datei diese beiden Abh\u00e4ngigkeiten. Das verwendete Java-Plugin bietet uns verschiedene Konfiguration um festzulegen, zu welchem Zeitpunkt unsere Abh\u00e4ngigkeiten ben\u00f6tigt werden. F\u00fcr <em>JUnit<\/em> und <em>AssertJ<\/em> geben wir &#8222;testCompile&#8220; an. Dies bedeutet, dass zum Kompilieren unserer Testklassen diese beiden Abh\u00e4ngigkeiten ben\u00f6tigt werden. Unser Produktionscode wird hierbei automatisch ebenfalls in den Klassenpfad aufgenommen &#8211; sonst w\u00fcrden die Test auch kaum funktionieren.<\/p>\n<p>Wie euch sicherlich aufgefallen ist, lassen sich die Abh\u00e4ngigkeiten in verschiedenen Schreibweisen angeben. Sucht ihr im Maven-Repository nach einer Bibliothek und lasst euch den Gradle-Snippet dazu geben, sieht er so aus wie bei <em>AssertJ<\/em> in unserem Beispiel. Das ist die Kurzschreibweise zur der l\u00e4ngeren Variante bei <em>JUnit<\/em> (dieser Eintrag wird von IntelliJ automatisch beim Erstellen eines Gradle-Projekts hinzugef\u00fcgt &#8211; ist wohl ein Wink mit dem Scheunentor ;-).<\/p>\n<p><a href=\"http:\/\/invidit.de\/blog\/wp-content\/uploads\/2016\/03\/Gradle_IntelliJ.png\" rel=\"attachment wp-att-1007\"><img decoding=\"async\" loading=\"lazy\" class=\"alignright wp-image-1007 size-full\" src=\"http:\/\/invidit.de\/blog\/wp-content\/uploads\/2016\/03\/Gradle_IntelliJ.png\" alt=\"Gradle_IntelliJ\" width=\"270\" height=\"520\" srcset=\"https:\/\/invidit.de\/blog\/wp-content\/uploads\/2016\/03\/Gradle_IntelliJ.png 270w, https:\/\/invidit.de\/blog\/wp-content\/uploads\/2016\/03\/Gradle_IntelliJ-156x300.png 156w\" sizes=\"(max-width: 270px) 100vw, 270px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Und jetzt?<\/p>\n<p>Jetzt k\u00f6nnen wir unser Projekt bauen lassen, testen lassen und andere Sachen machen lassen. Aber wie? Hier gibt es zwei M\u00f6glichkeiten. Im Projektverzeichnis rufen wir auf der Befehlszeile &#8222;gradlew build&#8220; auf, um unser Projekt zu bauen. &#8222;gradlew&#8220; ist der Einstiegspunkt f\u00fcr unseren Gradle-Wrapper und wird per IntelliJ automatisch generiert, als Batch-Datei und als Shell-Script. Anschlie\u00dfend geben wir die auszuf\u00fchrende Aufgabe an, in diesem Fall &#8222;build&#8220;.<\/p>\n<p>Die zweite M\u00f6glichkeit ist die Ausf\u00fchrung von Gradle-Aufgaben per IDE, was in IntelliJ zum Beispiel so aussieht. Hier sind alle durch unsere verwendeten Plugins bereitgestellten Aufgaben sowie die Abh\u00e4ngigkeiten zu sehen. Per Doppelklick kann nun z.B. der <em>build<\/em> oder unsere Tests gestartet werden. In dieser Darstellung seht ihr auch, wie die Gradle-Projektstruktur abgebildet ist. Im gezeigten Beispiel gibt es ein Projekt &#8222;CodeQuality&#8220; und darunter mehrere Teilprojekte. Zu jedem Teilprojekt k\u00f6nnen Aufgaben einzeln ausgef\u00fchrt werden, oder sie werden auf Hauptprojekte-Ebene f\u00fcr alle Teilprojekte aufgerufen.<\/p>\n<p>&nbsp;<\/p>\n<h1><\/h1>\n<p>&nbsp;<\/p>\n<h1>Wann nehme ich denn welches Werkzeug?<\/h1>\n<p>An dieser Stelle m\u00f6chten wir auf den Artikel<sup>[1]<\/sup> verweisen. Hier werden anhand verschiedener Kriterien und Einsatzszenarios unter anderem Maven und Gradle miteinander verglichen. Als Fazit wird genannt, dass Gradle schneller und leichtgewichtiger ist als Maven und mehr und einfachere M\u00f6glichkeiten abseits der Konventionen zul\u00e4sst. Maven ist hingegen (zum Zeitpunkt des Vergleichs) deutlich besser in g\u00e4ngige Entwicklungsumgebungen integriert.<\/p>\n<p>&nbsp;<\/p>\n<h1>Zusammenfassung?<\/h1>\n<p>In diesem Artikel haben wir einen kurzen Blick auf das Build-Werkzeug Gradle als Alternative zu Maven geworfen. Dabei haben wir ein einfaches Projekt konfiguriert und Aufgaben aus dem Java-Plugin zu Gradle genutzt, um unseren Java-Quellecode zu kompilieren.<\/p>\n<p>&nbsp;<\/p>\n<p>In welchen Situationen habt ihr bisher Vor- und Nachteile von Gradle zu Maven erfahren? Oder nutzt ihr sogar noch andere Build-Werkzeuge? Welche?<\/p>\n<p>Eure Spa\u00df-Coder<\/p>\n<p>&nbsp;<\/p>\n<p>Dieser Artikel basiert neben unseren Erfahrungen auf den Ausf\u00fchrungen aus:<\/p>\n<ul>\n<li>https:\/\/docs.gradle.org\/current\/userguide\/introduction.html<\/li>\n<li>[1] http:\/\/zeroturnaround.com\/rebellabs\/java-build-tools-part-2-a-decision-makers-comparison-of-maven-gradle-and-ant-ivy\/<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Hallo Spa\u00df-Coder. Wir haben uns hier im Blog bereits mit der Frage besch\u00e4ftigt, wie in einem Softwareprojekt Abh\u00e4ngigkeiten zu Fremdbibliotheken verwaltet werden k\u00f6nnen und der gesamte Lebenszyklus einer Software unterst\u00fctzt wird. Hierzu kann das Werkzeug Maven eingesetzt werden. Artikel dazu findet ihr unter diesem Stichwort. In diesem Artikel werden wir uns anschauen, welche Alternative es [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":1009,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[136,137,124],"_links":{"self":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts\/891"}],"collection":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/comments?post=891"}],"version-history":[{"count":19,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts\/891\/revisions"}],"predecessor-version":[{"id":1033,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/posts\/891\/revisions\/1033"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/media\/1009"}],"wp:attachment":[{"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/media?parent=891"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/categories?post=891"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/invidit.de\/blog\/wp-json\/wp\/v2\/tags?post=891"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}