Ant gegen Maven gegen Gradle

Ameise gegen Maven gegen Gradle

1. Einführung

In diesem Artikel werden wirexplore three Java build automation tools which dominated the JVM ecosystem – Ant, Maven, and Gradle.

Wir werden sie alle vorstellen und untersuchen, wie sich die Java Build Build-Automatisierungstools entwickelt haben.

2. Apache Ant

In the beginning, Make was the only build automation tool, jenseits von selbst entwickelten Lösungen. Make gibt es seit 1976 und als solches wurde es in den frühen Java-Jahren zum Erstellen von Java-Anwendungen verwendet.

Viele Konventionen von C-Programmen passten jedoch nicht in das Java-Ökosystem, sodass Ant mit der Zeit als bessere Alternative veröffentlicht wurde.

Apache Ant (“Another Neat Tool”) is a Java library used for automating build processes for Java applications. Darüber hinaus kann Ant zum Erstellen von Nicht-Java-Anwendungen verwendet werden. Es war ursprünglich Teil der Apache Tomcat-Codebasis und wurde im Jahr 2000 als eigenständiges Projekt veröffentlicht.

In vielen Aspekten ist Ant Make sehr ähnlich und es ist einfach genug, damit jeder es ohne besondere Voraussetzungen verwenden kann. Ant-Build-Dateien werden in XML geschrieben und laut Konvention alsbuild.xml bezeichnet.

Verschiedene Phasen eines Build-Prozesses werden als "Ziele" bezeichnet.

Hier ist ein Beispiel einerbuild.xml-Datei für ein einfaches Java-Projekt mit der HauptklasseHelloWorld:


    
        
    

    
        
        
    

    
        
        
            
                
            
        
    

    
        
    

Diese Build-Datei definiert vier Ziele:clean,compile,jar undrun. Zum Beispiel können wir den Code kompilieren, indem wir Folgendes ausführen:

ant compile

Dies löst zuerst das Zielclean aus, wodurch das Verzeichnis "Klassen" gelöscht wird. Danach erstellt Zielcompile das Verzeichnis neu und kompiliert den src-Ordner darin.

The main benefit of Ant is its flexibility. Ant doesn’t impose any coding conventions or project structures. Folglich bedeutet dies, dass Ant von Entwicklern verlangt, dass sie alle Befehle selbst schreiben, was manchmal zu riesigen XML-Build-Dateien führt, die schwer zu warten sind.

Da es keine Konventionen gibt, bedeutet das Wissen um Ant nicht, dass wir eine Ant-Build-Datei schnell verstehen. Es wird wahrscheinlich einige Zeit dauern, bis Sie sich an eine unbekannte Ant-Datei gewöhnt haben. Dies ist ein Nachteil gegenüber den anderen, neueren Tools.

Anfangs hatte Ant keine eingebaute Unterstützung für das Abhängigkeitsmanagement. Da das Abhängigkeitsmanagement in den späteren Jahren jedoch zu einem Muss wurde, wurdeApache Ivy als Teilprojekt des Apache Ant-Projekts entwickelt. Es ist in Apache Ant integriert und folgt denselben Designprinzipien.

Die anfänglichen Einschränkungen von Ant, da keine integrierte Unterstützung für das Abhängigkeitsmanagement vorhanden war und Frustrationen bei der Arbeit mit nicht verwaltbaren XML-Build-Dateien auftraten, führten zur Erstellung von Maven.

3. Apache Maven

Apache Maven ist ein Abhängigkeitsmanagement- und ein Build-Automatisierungstool, das hauptsächlich für Java-Anwendungen verwendet wird. Maven continues to use XML files just like Ant but in a much more manageable way. Der Name des Spiels hier ist Konvention über Konfiguration.

Während Ant die Flexibilität bietet und erfordert, dass alles von Grund auf neu geschrieben wird,Maven relies on conventions and provides predefined commands (goals).

Einfach ausgedrückt, Maven ermöglicht es uns, uns auf das zu konzentrieren, was unser Build tun soll, und gibt uns den Rahmen dafür. Ein weiterer positiver Aspekt von Maven war die integrierte Unterstützung für das Abhängigkeitsmanagement.

Die Konfigurationsdatei von Maven, die Anweisungen zum Erstellen und zur Verwaltung von Abhängigkeiten enthält, heißt üblicherweisepom.xml. Zusätzlich schreibt Maven eine strikte Projektstruktur vor, während Ant auch dort Flexibilität bietet.

Hier ist ein Beispiel für einepom.xml-Datei für dasselbe einfache Java-Projekt mit der HauptklasseHelloWorldvon zuvor:


    4.0.0
    example
    mavenExample
    0.0.1-SNAPSHOT
    Maven example

    
        
            junit
            junit
            4.12
            test
        
    

Jetzt wurde die Projektstruktur jedoch ebenfalls standardisiert und entspricht den Maven-Konventionen:

+---src
|   +---main
|   |   +---java
|   |   |   \---com
|   |   |       \---example
|   |   |           \---maven
|   |   |                   HelloWorld.java
|   |   |
|   |   \---resources
|   \---test
|       +---java
|       \---resources

Im Gegensatz zu Ant ist es nicht erforderlich, jede der Phasen im Erstellungsprozess manuell zu definieren. Stattdessen können wir einfach die integrierten Befehle von Maven aufrufen.

Zum Beispiel können wir den Code kompilieren, indem wir Folgendes ausführen:

mvn compile

Wie auf offiziellen Seiten erwähnt, unterstütztMaven can be considered a plugin execution framework, since all work is done by plugins. Maven im Kern einen weiten Bereich vonavailable plugins, und jeder von ihnen kann zusätzlich konfiguriert werden.

Eines der verfügbaren Plugins ist das Apache Maven Dependency Plugin, das eincopy-dependencies-Ziel hat, das unsere Abhängigkeiten in ein bestimmtes Verzeichnis kopiert.

Um dieses Plugin in Aktion zu zeigen, fügen wir dieses Plugin in unserepom.xml-Datei ein und konfigurieren ein Ausgabeverzeichnis für unsere Abhängigkeiten:


    
        
            org.apache.maven.plugins
            maven-dependency-plugin
            
                
                    copy-dependencies
                    package
                    
                        copy-dependencies
                    
                    
                        target/dependencies
                          
                    
                
            
        
    

Dieses Plugin wird in einerpackage-Phase ausgeführt. Wenn wir also Folgendes ausführen:

mvn package

Wir führen dieses Plugin aus und kopieren Abhängigkeiten in den Ordner target / dependencies.

Es gibt auchexisting article zum Erstellen einer ausführbaren JAR mit verschiedenen Maven-Plugins. Eine detaillierte Übersicht über Maven finden Sie inthis core guide on Maven, wo einige der wichtigsten Funktionen von Maven erläutert werden.

Maven wurde sehr populär, da Build-Dateien jetzt standardisiert waren und es im Vergleich zu Ant deutlich weniger Zeit in Anspruch nahm, Build-Dateien zu pflegen. Maven-Konfigurationsdateien sind zwar standardisierter als Ant-Dateien, werden jedoch in der Regel immer noch groß und umständlich.

Maven’s strict conventions come with a price of being a lot less flexible than Ant. Die Zielanpassung ist sehr schwierig, daher ist das Schreiben von benutzerdefinierten Build-Skripten im Vergleich zu Ant viel schwieriger.

Obwohl Maven einige ernsthafte Verbesserungen vorgenommen hat, um die Erstellungsprozesse von Anwendungen einfacher und standardisierter zu gestalten, ist dies immer noch mit einem Preis verbunden, da es viel weniger flexibel als Ant ist. Dies führte zur Schaffung von Gradle, das das Beste aus beiden Welten kombiniert - Ants Flexibilität und Mavens Funktionen.

4. Gradle

Gradle ist ein Abhängigkeitsmanagement- und ein Build-Automatisierungstool, daswas built upon the concepts of Ant and Maven.

Eines der ersten Dinge, die wir bei Gradle feststellen können, ist, dass im Gegensatz zu Ant oder Maven keine XML-Dateien verwendet werden.

Mit der Zeit interessierten sich Entwickler immer mehr dafür, eine domänenspezifische Sprache zu haben und mit dieser zu arbeiten - was es ihnen, vereinfacht ausgedrückt, ermöglichen würde, Probleme in einer bestimmten Domäne mit einer auf diese bestimmte Domäne zugeschnittenen Sprache zu lösen.

Dies wurde von Gradle übernommen, der ein DSL verwendet, das aufGroovy basiert. This led to smaller configuration files with less clutter since the language was specifically designed to solve specific domain problems. Die Konfigurationsdatei von Gradle heißt üblicherweisebuild.gradle.

Hier ist ein Beispiel für einebuild.gradle-Datei für dasselbe einfache Java-Projekt mit der HauptklasseHelloWorldvon zuvor:

apply plugin: 'java'

repositories {
    mavenCentral()
}

jar {
    baseName = 'gradleExample'
    version = '0.0.1-SNAPSHOT'
}

dependencies {
    compile 'junit:junit:4.12'
}

Wir können den Code kompilieren, indem wir Folgendes ausführen:

gradle classes

Im Kern bietet Gradle absichtlich sehr wenig Funktionalität. Plugins add all useful features. In unserem Beispiel haben wir das Pluginjava verwendet, mit dem wir Java-Code und andere wertvolle Funktionen kompilieren können.

Gradle gave its build steps name “tasks”, as opposed to Ant’s “targets” or Maven’s “phases”. Mit Maven haben wir das Apache Maven-Abhängigkeits-Plugin verwendet. Ziel ist es, Abhängigkeiten in ein bestimmtes Verzeichnis zu kopieren. Mit Gradle können wir dasselbe tun, indem wir Aufgaben verwenden:

task copyDependencies(type: Copy) {
   from configurations.compile
   into 'dependencies'
}

Wir können diese Aufgabe ausführen, indem wir Folgendes ausführen:

gradle copyDependencies

5. Fazit

In diesem Artikel haben wir Ant, Maven und Gradle vorgestellt - drei Java-Tools zur Build-Automatisierung.

Es überrascht nicht, dass Maven heute die Mehrheit vonthe build tool market hält. Gradle hat sich jedoch in komplexeren Codebasen bewährt, darunter in einer Reihe von Open-Source-Projekten wie Spring.