Auswahl des richtigen Build-Tools: Ant vs Maven vs Gradle
Während der Softwareentwicklung müssen Entwickler immer wieder den gleichen Code neu erstellen. Sie versuchen oft, Bash-Skripte oder andere Skriptsprachen zu verwenden, um die Aufgabe zu automatisieren. Es gibt jedoch Build-Tools, die besser für die Build-Automatisierung geeignet sind. Die vorherrschenden Build-Tools sind:
- Apache Ameise mit Efeu
- Maven
- Gradle
Lassen Sie uns die Tools untersuchen, um mehr zu erfahren.
Apache Ameise mit Efeu
Apache Ant ist ein Java-basiertes Befehlszeilentool, das XML-Dateien verwendet, um Build-Skripte zu definieren. Es wird hauptsächlich für Java-Builds verwendet, kann aber auch für die C/C++-Entwicklung verwendet werden. Integrierte Tasks bieten Möglichkeiten zum Kompilieren, Assemblieren, Testen und Ausführen von Softwareanwendungen. Benutzer können auch ihre eigenen „antlibs“ erstellen, um die Funktionalität von Ant . zu verbessern. Apache Ivy ist ein Tool zur Verwaltung von Abhängigkeiten, das sich leicht in Ant integrieren lässt, um ein robusteres Ökosystem bereitzustellen. Die Entwicklung von Ant begann im Jahr 2000.
Vorteile
- Bessere Kontrolle über den gesamten Build-Prozess
- Flexibel genug, um mit jedem Arbeitsprozess zu arbeiten
Nachteile
- XML-basierte Build-Dateien können groß und nicht mehr wartbar werden
- Es wird viel Zeit und Ressourcen benötigt, um die Build-Skripte zu pflegen
- IDE-Integration ist schwer zu erreichen
Ameise mit Efeu Beispiel
Sie können die neueste Ant von hier aus installieren. Sie müssen die ZIP-Datei herunterladen, erweitern und den bin-Ordner in Ihren Pfad legen. Sie können den folgenden Befehl verwenden, um zu sehen, ob Ant richtig installiert ist:
$ ant -versionApache Ant(TM)-Version 1.10.1 zusammengestellt am 2. Februar 2017
Sobald Sie Ant installiert haben, können Sie das neueste Ivy-Jar herunterladen und im lib-Ordner im Ant-Verzeichnis ablegen.
Nachdem Sie Ant installiert haben, erstellen Sie die Ordner helloworld und helloworld/src. Legen Sie in den src-Ordner helloworld.Java-Datei mit dem Code:
/****************************Druckt "Hallo Welt . aus!"
**************************/
öffentliche Klasse halloworld
public static void main(String[] args)
System.aus.println("Hallo Welt!");
Jetzt im helloworld-Ordner einen Build erstellen.xml-Datei mit folgendem Code:
Und erstelle im selben helloworld-Ordner den Efeu.xml-Datei mit folgendem Code:
Die Verzeichnisstruktur sollte wie folgt aussehen:
Hallo Welt|-- bauen.xml
|-- Efeu.xml
'-- src
'-- Hallo Welt.Java
Jetzt können Sie den Build mit dem Befehl ausführen:
$ AmeisenglasEin erfolgreicher Build sollte eine Ausgabe wie diese liefern:
$ AmeisenglasBuilddatei: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build.xml
Entschlossenheit:
[ivy:retrieve] :: Apache Ivy 2.4.0 - 20141213170938 :: http://ant.Apache.org/ivy/ ::
[ivy:retrieve] :: Einstellungen laden :: url = jar:file:/Users/zak/BuildTools/ANT/apache
-Ameise-1.10.1/lib/ivy-2.4.0.Krug!/org/apache/ivy/core/settings/ivysettings.xml
[ivy:retrieve] :: Abhängigkeiten auflösen :: org.apache#helloworld;[email protected]
MacBook Air.lokal
[ivy:retrieve] confs: [default]
[ivy:retrieve] gefunden junit#junit;4.12 in der Öffentlichkeit
[ivy:retrieve] gefundene Organisation.hamcrest#hamcrest-core;1.3 in der Öffentlichkeit
[ivy:retrieve] :: Auflösungsbericht :: 397ms auflösen :: Artefakte dl 15ms
---------------------------------------------------------------------
| | Module || Artefakte |
| conf | Nummer| suchen|ausgelöscht|verdrängt|| Nummer|ausgeschaltet|
---------------------------------------------------------------------
| Standard | 2 | 0 | 0 | 0 || 4 | 0 |
---------------------------------------------------------------------
[ivy:retrieve] :: Abrufen :: org.Apache#helloworld
[ivy:retrieve] confs: [default]
[ivy:retrieve] 0 Artefakte kopiert, 4 bereits abgerufen (0kB/39ms)
kompilieren:
[mkdir] Erstelltes Verzeichnis: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/
Klassen
[javac] /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build.xml:22: Warnung:
'includeantruntime'wurde nicht gesetzt, standardmäßig auf build.sysclasspath=letzter; auf false setzen
für wiederholbare Builds
[javac] Kompilieren einer Quelldatei nach /Users/zak/_work/LearnBuildScripts/LearnANT/
halloworld/build/classes
Krug:
[mkdir] Erstelltes Verzeichnis: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/bin
[jar] Baukasten: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/bin/
Hallo Welt.Krug
ERFOLGREICH AUFBAUEN
Gesamtzeit: 6 Sekunden
Sie können die JAR-Datei wie folgt ausprobieren:
$ java -cp build/bin/helloworld.glas halloworldHallo Welt!
Wir haben die JAR-Datei definiert, die in den build/bin-Ordner gelegt werden soll. Die Ordner werden während des Builds erstellt. Der Befehl ant jar ruft das jar-Ziel im Build auf.xml.
Maven
Maven wurde entwickelt, um die Probleme beim Ant-basierten Scripting zu lösen. Es behielt die XML-Dateien bei, verfolgte jedoch einen anderen Organisationsansatz. In Ant müssen Entwickler alle Aufgaben erstellen. Maven verringert die Aufgabenerstellung durch die Implementierung strengerer Standards für die Organisation von Code. Dadurch ist der Einstieg in Standardprojekte einfacher.
Es wurden auch Abhängigkeits-Downloads eingeführt, die die Entwicklung erleichterten. Vor der Einführung von Ivy in Ant mussten Benutzer Abhängigkeiten lokal verwalten. Maven hat zuerst die Dependency-Management-Philosophie übernommen.
Die strengen Standards von Maven machen es jedoch schwierig, benutzerdefinierte Build-Skripte zu schreiben. Das Tool ist einfach zu bedienen, solange das Projekt den strengen Standards entspricht.
Vorteile
- Automatische Abhängigkeits-Downloads
- Alle Abhängigkeiten werden automatisch in der Quellcodeverwaltung als Teil der Maven-Skripte aufgezeichnet
- Standardisiert und vereinfacht den Build-Prozess
- Einfache Integration mit IDEs und CI/CD-Systemen
Nachteile
- Nicht flexibel bei der Erstellung benutzerdefinierter Workflows
- Steile Lernkurve und der Prozess ist für Anfänger schwer zu verstehen
- Zeitaufwändig zur Lösung von Build-Problemen und Integration neuer Bibliotheken
- Nicht gut mit mehreren Versionen derselben Abhängigkeit depend
Maven-Beispiel
Sie können den neuesten Maven hier herunterladen. Sie können die Installation wie folgt überprüfen:
$ mvn --versionApache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T00:58:13-07:00)
Maven-Startseite: /Users/zak/BuildTools/Maven/apache-maven-3.5.2
Java-Version: 1.8.0_74, Anbieter: Oracle Corporation
Java-Startseite: /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Inhalt/Home/jre
Standardgebietsschema: en_US, Plattformcodierung: UTF-8
Betriebssystemname: "mac os x", Version: "10.11.6", Bogen: "x86_64", Familie: "mac"
Erstellen Sie einen helloworld-Ordner und generieren Sie ein Projekt mit dem folgenden Befehl:
$ mvn archetype:generate -DgroupId=com.Name der Firma.helloworld -DartifactId=helloworld-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Es sollte die Ordnerstruktur erstellen und die Ausgabe generieren, die wie folgt aussieht:
[INFO] Suche nach Projekten…[DIE INFO]
[DIE INFO] ------------------------------------------------------------------------
[INFO] Gebäude Maven Stub Projekt (kein POM) 1
[DIE INFO] ------------------------------------------------------------------------
[DIE INFO]
[INFO] >>> maven-archetype-plugin:3.0.0:generate (default-cli) > Generier-Quellen
@ standalone-pom >>>
[DIE INFO]
[DIE INFO] <<< maven-archetype-plugin:3.0.0:generate (default-cli) < generate-sources
@ standalone-pom <<<
[DIE INFO]
[DIE INFO]
[INFO] --- maven-archetype-plugin:3.0.0:generate (default-cli) @ standalone-pom ---
[INFO] Projekt im Batch-Modus generieren
[DIE INFO] ----------------------------------------------------------------------------
[INFO] Verwenden der folgenden Parameter zum Erstellen eines Projekts aus Alt (1.x) Archetyp:
maven-archetype-schnellstart:1.0
[DIE INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Wert: /Users/zak/_work/LearnBuildScripts/LearnMaven
[INFO] Parameter: Paket, Wert: com.Name der Firma.Hallo Welt
[INFO] Parameter: groupId, Wert: com.Name der Firma.Hallo Welt
[INFO] Parameter: artifactId, Wert: helloworld
[INFO] Parameter: Paketname, Wert: com.Name der Firma.Hallo Welt
[INFO] Parameter: Version, Wert: 1.0-SCHNAPPSCHUSS
[INFO] Projekt erstellt aus Alt (1.x) Archetyp im Verzeichnis: /Users/zak/_work/
LearnBuildScripts/LearnMaven/helloworld
[DIE INFO] ------------------------------------------------------------------------
[INFO] ERFOLG AUFBAUEN
[DIE INFO] ------------------------------------------------------------------------
[INFO] Gesamtzeit: 8.602 s
[INFO] Fertiggestellt am: 2018-01-27T00:05:37-08:00
[INFO] Endgültiger Speicher: 15M/152M
[DIE INFO] ------------------------------------------------------------------------
Die Ordnerstruktur sollte wie folgt aussehen:
Hallo Welt|-- pom.xml
'-- src
|-- Hauptsache
| '--java
| '--com
| '-- Name der Firma
| '-- Hallo Welt
| '-- App.Java
'-- Prüfung
'--java
'--com
'-- Name der Firma
'-- Hallo Welt
'-- AppTest.Java
Die pom.xml enthält die Build-Konfigurationen. Innerhalb der pom.xml sieht der Code so aus:
_0.xsd">
Sie können die JAR-Datei mit dem folgenden Befehl generieren:
$ mvn-Paket[INFO] Suche nach Projekten…
[DIE INFO]
[DIE INFO] ------------------------------------------------------------------------
[INFO] Gebäude helloworld 1.0-SCHNAPPSCHUSS
[DIE INFO] ------------------------------------------------------------------------
[DIE INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ helloworld ---
[WARNUNG] Verwenden der Plattformcodierung (eigentlich UTF-8) zum Kopieren gefilterter Ressourcen, i.e.
Build ist plattformabhängig!
[INFO] überspringen nicht vorhandenes Ressourcenverzeichnis /Users/zak/_work/LearnBuildScripts/LearnMaven/
halloworld/src/main/resources
[DIE INFO]
[INFO] --- maven-compiler-plugin:3.1:kompilieren (Standardkompilieren) @ helloworld ---
[INFO] Änderungen erkannt - Modul neu kompilieren!
[WARNUNG] Die Dateicodierung wurde nicht eingestellt, die Plattformcodierung UTF-8 verwendet, d. h.e. bauen ist
plattformabhängig!
[INFO] Kompilieren einer Quelldatei nach /Users/zak/_work/LearnBuildScripts/LearnMaven/
halloworld/target/classes
[DIE INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @
Hallo Welt ---
[WARNUNG] Verwenden der Plattformcodierung (eigentlich UTF-8) zum Kopieren gefilterter Ressourcen, i.e.
Build ist plattformabhängig!
[INFO] überspringen nicht vorhandenes Ressourcenverzeichnis /Users/zak/_work/LearnBuildScripts/LearnMaven/
halloworld/src/test/ressourcen
[DIE INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ helloworld ---
[INFO] Änderungen erkannt - Modul neu kompilieren!
[WARNUNG] Die Dateicodierung wurde nicht eingestellt, die Plattformcodierung UTF-8 verwendet, d. h.e. bauen ist
plattformabhängig!
[INFO] Kompilieren einer Quelldatei nach /Users/zak/_work/LearnBuildScripts/LearnMaven
/helloworld/target/test-classes
[DIE INFO]
[INFO] --- Maven-Surefire-Plugin:2.12.4:test (Standardtest) @ helloworld ---
[INFO] Surefire-Berichtsverzeichnis: /Users/zak/_work/LearnBuildScripts/LearnMaven
/helloworld/ziel/
todsichere Berichte
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Laufcom.Name der Firma.Hallo Welt.AppTest
Testlauf: 1, Fehler: 0, Fehler: 0, Übersprungen: 0, Verstrichene Zeit: 0.014 Sek
Ergebnisse :
Testlauf: 1, Fehler: 0, Fehler: 0, Übersprungen: 0
[DIE INFO]
[INFO] --- maven-jar-plugin:2.4:jar (Standard-jar) @ helloworld ---
[INFO] Baukasten: /Users/zak/_work/LearnBuildScripts/LearnMaven/helloworld/target/
halloworld-1.0-SCHNAPPSCHUSS.Krug
[DIE INFO] ------------------------------------------------------------------------
[INFO] ERFOLG AUFBAUEN
[DIE INFO] ------------------------------------------------------------------------
[INFO] Gesamtzeit: 5.624 s
[INFO] Fertiggestellt am: 2018-01-27T00:11:10-08:00
[INFO] Endgültiger Speicher: 16M/114M
[DIE INFO] ------------------------------------------------------------------------
Sie können die JAR-Datei wie folgt ausführen:
$ java -cp Ziel/helloworld-1.0-SCHNAPPSCHUSS.glas com.Name der Firma.Hallo Welt.AppHallo Welt!
Die JAR-Datei wird im Zielordner abgelegt.
Gradle
Gradle kombiniert die Kraft von Ant und Maven. Die erste Version von Gradle wurde 2012 veröffentlicht. Es hat eine schnelle Akzeptanz erfahren. Google verwendet es derzeit für Android OS.
Anstelle von XML verwendet Gradle die Sprache Groovy. Dadurch sind Build-Skripte in Gradle einfacher zu schreiben und zu lesen. Es verwendete ursprünglich Ivy für das Abhängigkeitsmanagement, verwendet jetzt jedoch seine eigene Abhängigkeits-Engine engine.
Vorteile
- Bietet Standardisierung und bleibt dabei flexibel
- Einfach zu lesende und zu schreibende Build-Skripte
- Besser im Umgang mit mehreren Versionen von Abhängigkeiten
- Kann mit mehreren Programmiersprachen und Technologien umgehen
- Aktive Community, die bei der Entwicklung des Tools hilft
- Gradle DSL (Domain-Specific Language) ermöglicht eine einfache Konfigurationsstruktur
- Gradle bietet Leistungsverbesserungen durch inkrementelle, Build-Cache und den Gradle Daemon
Nachteile
- IDE-Integration nicht so gut wie Maven
Gradle-Beispiel
Sie können Gradle von hier aus installieren. Nachdem Sie Gradle in Ihrem Pfad eingerichtet haben, können Sie dies folgendermaßen überprüfen:
$gradle --version------------------------------------------------------------
Grad 4.5
------------------------------------------------------------
Bauzeit: 2018-01-24 17:04:52 UTC
Überarbeitung: 77d0ec90636f43669dc794ca17ef80dd65457bec
Groovig: 2.4.12
Ant: Apache Ant(TM)-Version 1.9.9 zusammengestellt am 2. Februar 2017
JVM: 1.8.0_74 (Oracle Corporation 25.74-b02)
Betriebssystem: Mac OS X 10.11.6 x86_64
Erstellen Sie als Nächstes die folgende Verzeichnisstruktur:
Hallo Welt|-- bauen.gradle
'-- src
|-- Hauptsache
'--java
'-- Hallo Welt
'-- Hallo Welt.Java
Für die halloworld.Java habe den Code aus dem Ant-Beispiel eingefügt. Und zum bauen.gradle gibt folgenden Code ein:
Plugin anwenden: 'java'Version = '1.0'
Repositorys
mavenCentral()
Abhängigkeiten
testCompile-Gruppe: 'junit', Name: 'junit', Version: '4.12'
Sie können den Befehl "gradle Tasks -all" verwenden, um alle verfügbaren Befehle anzuzeigen. Gradle nimmt automatisch die Plugins auf, die Sie im Build angeben.gradle-Datei und zeigt Ihnen die zusätzlichen Aufgaben, die aufgrund der Plugins verfügbar sind.
Sie können den Build erhalten, indem Sie Folgendes ausführen:
$ Gradle-GlasERFOLGREICH AUFBAUEN in 1s
2 umsetzbare Aufgaben: 2 ausgeführt
Sie können Ihr Glas wie folgt ausführen:
$ java -cp build/libs/helloworld-1.0.glas halloworldHallo Welt!
Die JAR-Datei wird im Ordner build/libs abgelegt.
Fazit
Unter den Build-Tools kann Ant für kleinere Projekte nützlich sein, während Maven besser ist, um sicherzustellen, dass alle Entwickler die gleichen Regeln befolgen. Gradle ist das neueste Tool, das die größte Flexibilität bietet.
Verweise:
- http://ant.Apache.Organisation/
- http://ant.Apache.org/efeu/
- https://maven.Apache.Organisation/
- https://gradle.Organisation/
- http://makble.com/gradle-junit-helloworld-beispiel
- https://Beispiele.Javacode-Freaks.com/core-java/gradle/gradle-hello-world-tutorial/
- https://gradle.org/maven-vs-gradle/
- https://maven.Apache.org/guides/getting-started/maven-in-five-minutes.html
- https://stackoverflow.com/questions/20755437/java-build-tools-ant-vs-maven
- https://technologiegespräche.com/2014/06/18/build-tools/
- https://www.Quora.com/Was-sind-die-Vor-und-Nachteile-von-Maven-versus-Ant-als-Building-Tools-für-Java