Ant vs Maven vs Gradle

Ant Vs Maven Vs Gradle



Tijdens de ontwikkeling van software moeten ontwikkelaars dezelfde code steeds opnieuw opbouwen. Ze proberen vaak bash-scripts of andere scripttalen te gebruiken om de taak te automatiseren. Er zijn echter build-tools beschikbaar die meer geschikt zijn voor build-automatisering. De belangrijkste bouwtools zijn:

Laten we de tools onderzoeken om meer te weten te komen.







Apache mier met klimop

Apache Ant is een op Java gebaseerde opdrachtregeltool die XML-bestanden gebruikt om buildscripts te definiëren. Het wordt voornamelijk gebruikt voor Java-builds, maar het kan ook worden gebruikt voor C/C++-ontwikkeling. Ingebouwde taken bieden manieren om softwaretoepassingen te compileren, samen te stellen, te testen en uit te voeren. Gebruikers kunnen ook hun eigen antlibs maken om de functionaliteit van Ant te verbeteren. Apache Ivy is een tool voor afhankelijkheidsbeheer die eenvoudig kan worden geïntegreerd met Ant om een ​​robuuster ecosysteem te bieden. De ontwikkeling van Ant begon in 2000.



Pluspunten



  • Betere controle over het algehele bouwproces
  • Flexibel genoeg om met elk werkproces te werken

nadelen





  • Op XML gebaseerde buildbestanden kunnen groot en onhoudbaar worden
  • Er zijn veel tijd en middelen nodig om de buildscripts te onderhouden
  • IDE-integratie is moeilijk te bereiken

Voorbeeld mier met klimop

U kunt de nieuwste Ant installeren vanaf: hier . Je moet de zip downloaden, uitvouwen en de bin-map in je pad plaatsen. U kunt de volgende opdracht gebruiken om te zien of Ant correct is geïnstalleerd:

$ mier-versie
Apache Ant(TM)versie 1.10.1 gecompileerd in februari2 2017.

Zodra je Ant hebt geïnstalleerd, kun je de nieuwste Ivy-jar downloaden en in de lib-map in de Ant-map plaatsen.



Nadat je Ant hebt geïnstalleerd, maak je de mappen helloworld en helloworld/src aan. Plaats in de src-map het bestand helloworld.java met de code:

/ *************************

Print 'Hallo wereld!'

************************** /

openbaar klasHallo Wereld{

openbaar statisch leegtehoofd( Snaar []argumenten) {
Systeem .uit.println('Hallo Wereld!');
}

}

Maak nu in de map helloworld een build.xml-bestand met de volgende code:

xmlns:klimop='antlib:org.apache.ivy.ant' naam='Hallo Wereld' standaard='kan'>

naam='src.dir' waarde='src'/>
naam='build.dir' waarde='bouwen'/>
naam='klassen.dir' waarde='${build.dir}/classes'/>
naam='am.dir' waarde='$ {build.dir} / bin'/>
naam='lib.dir' waarde='lib' />
ID kaart='lib.pad.id'>
aan u='$ {lib.dir}' />
>

naam='oplossen'>
/>
>

naam='schoon'>
aan u='$ {build.dir}'/>
>

naam='compileren' ligt eraan='oplossen'>
aan u='$ {klassen.dir}'/>
srcdir='$ {src.dir}' bestemming='$ {klassen.dir}' classpathref='lib.pad.id'/>
>

naam='kan' ligt eraan='compileren'>
aan u='$ {bin.dir}'/>
destfile='${bin.dir}/${ant.project.name}.jar' gebaseerd op='$ {klassen.dir}'/>
>

>

En maak in dezelfde map helloworld het bestand ivy.xml aan met de volgende code:

versie='2.0'>
organisatie='org.apache' module='Hallo Wereld'/>
>
org='junit' naam='junit' rev='4.12'/>
>
>

De directorystructuur zou er als volgt uit moeten zien:

Hallo Wereld
|-- build.xml
| - klimop.xml
`-- src
`- helloworld.java

Nu kunt u de build uitvoeren met het commando:

$mierkan

Een succesvolle build zou de volgende output moeten opleveren:

$ mierenpot
Buildbestand: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build.xml

oplossen:
[klimop:ophalen] :: Apache Ivy 2.4.0 - 20141213170938 :: http://ant.apache.org/ivy/ ::
[ivy:retrieve] :: instellingen laden :: url = jar:file:/Users/zak/BuildTools/ANT/apache
-ant-1.10.1/lib/ivy-2.4.0.jar!/org/apache/ivy/core/settings/ivysettings.xml
[ivy:retrieve] :: afhankelijkheden oplossen :: org.apache#helloworld; [e-mail beveiligd]
MacBook-Air.local
[klimop:ophalen] confs: [standaard]
[ivy:retrieve] vond junit#junt;4.12 in het openbaar
[ivy:retrieve] vond org.hamcrest#hamcrest-core;1.3 in het openbaar
[klimop: ophalen] :: resolutierapport :: 397ms oplossen :: artefacten dl 15ms
-------------------------------------------------- -------------------
| | modules || artefacten |
| conf | nummer| zoeken|verdwenen|uitgezet|| aantal|verdronken|
-------------------------------------------------- -------------------
| standaard | 2 | 0 | 0 | 0 || 4 | 0 |
-------------------------------------------------- -------------------
[klimop:ophalen] :: ophalen :: org.apache#helloworld
[klimop:ophalen] confs: [standaard]
[ivy:retrieve] 0 artefacten gekopieerd, 4 al opgehaald (0kB/39ms)

compileren:
[mkdir] Gemaakt map: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/
klassen
[javac] /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build.xml:22: waarschuwing:
'includeantruntime' was niet ingesteld, standaard ingesteld op build.sysclasspath=last; ingesteld op false
voor herhaalbare builds
[javac] 1 bronbestand compileren naar /Users/zak/_work/LearnBuildScripts/LearnANT/
helloworld/bouwen/klassen

kan:
[mkdir] Gemaakt map: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/bin
[jar] Jar bouwen: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/bin/
helloworld.jar

SUCCESVOL BOUWEN
Totale tijd: 6 seconden

U kunt het jar-bestand als volgt uitproberen:

$ java -cp build/bin/helloworld.kanHallo Wereld
Hallo Wereld!

We hebben het jar-bestand gedefinieerd dat in de build/bin-map moet worden geplaatst. De mappen worden aangemaakt tijdens de build. De opdracht ant jar roept het jar-doel aan in de build.xml.

Maven

Maven is ontwikkeld om de problemen met op Ant gebaseerde scripting op te lossen. Het behield de XML-bestanden, maar nam een ​​andere benadering van de organisatie. In Ant moeten ontwikkelaars alle taken maken. Maven vermindert het maken van taken door strengere normen te implementeren voor het organiseren van code. Hierdoor is het makkelijker om aan de slag te gaan met standaard projecten.

Het introduceerde ook afhankelijkheidsdownloads die de ontwikkeling gemakkelijker maakten. Vóór de introductie van Ivy in Ant moesten gebruikers afhankelijkheden lokaal beheren. Maven nam eerst de filosofie van afhankelijkheidsbeheer over.

De strenge normen van Maven maken het echter moeilijk om op maat gemaakte scripts te schrijven. De tool is gemakkelijk om mee te werken zolang het project de strikte normen volgt.

Pluspunten

  • Automatische afhankelijkheidsdownloads
  • Alle afhankelijkheden worden automatisch vastgelegd in bronbeheer als onderdeel van de Maven-scripts
  • Standaardiseert en vereenvoudigt het bouwproces
  • Gemakkelijk te integreren met IDE's en CI/CD-systemen

nadelen

  • Niet flexibel in het maken van aangepaste workflows
  • Steile leercurve en het proces is moeilijk te begrijpen voor beginners
  • Tijdrovend om buildproblemen en nieuwe bibliotheekintegraties op te lossen
  • Niet goed met meerdere versies van dezelfde afhankelijkheid

Maven Voorbeeld

U kunt de nieuwste Maven downloaden van hier . U kunt de installatie als volgt controleren:

$ mvn --versie
Apache Maven 3.5.2(138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017.-10-18T00:58:13-07: 00)
Maven home: /Gebruikers/zak/BuildTools/Maven/apache-maven-3.5.2
Java-versie: 1.8.0_74, leverancier: Oracle Corporation
Java-startpagina: /Bibliotheek/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Inhoud/Home/jre
Standaardtaal: en_US, platformcodering: UTF-8
OS-naam:'Mac OS X', versie:'10 .11.6 ', boog:'x86_64', familie:'Mac'

Maak een helloworld-map en genereer een project met de volgende opdracht:

$ mvn archetype:generate -DgroupId=com.Bedrijfsnaam.Hallo Wereld-DartifactId=hallowereld
-DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode =vals

Het moet de mappenstructuur maken en de uitvoer genereren die er als volgt uitziet:

[INFO] Scannen naar projecten...
[INFO]
[INFO] ----------------------------------------------- -------------------------
[INFO] Maven Stub-project bouwen (geen POM) 1
[INFO] ----------------------------------------------- -------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:3.0.0:generate (default-cli) > genereer-bronnen
@ standalone-pom >>>
[INFO]
[INFO]<<< maven-archetype-plugin:3.0.0:generate (default-cli) < generate-sources
@ standalone-pom<<<
[INFO]
[INFO]
[INFO] --- maven-archetype-plugin:3.0.0:genereren (standaard-cli) @ standalone-pom ---
[INFO] Project genereren in batchmodus
[INFO] ----------------------------------------------- -----------------------------
[INFO] De volgende parameters gebruiken voor het maken van een project van het oude (1.x) archetype:
maven-archetype-snelstart: 1.0
[INFO] ----------------------------------------------- -----------------------------
[INFO] Parameter: basedir, Waarde: /Users/zak/_work/LearnBuildScripts/LearnMaven
[INFO] Parameter: pakket, Waarde: com.companyname.helloworld
[INFO] Parameter: groupId, Waarde: com.companyname.helloworld
[INFO] Parameter: artifactId, Waarde: helloworld
[INFO] Parameter: pakketnaam, waarde: com.bedrijfsnaam.helloworld
[INFO] Parameter: versie, Waarde: 1.0-SNAPSHOT
[INFO] project gemaakt van Old (1.x) Archetype in dir: /Users/zak/_work/
LearnBuildScripts/LearnMaven/helloworld
[INFO] ----------------------------------------------- -------------------------
[INFO] BOUW SUCCES
[INFO] ----------------------------------------------- -------------------------
[INFO] Totale tijd: 8.602 s
[INFO] Geëindigd op: 2018-01-27T00:05:37-08:00
[INFO] Laatste geheugen: 15M/152M
[INFO] ----------------------------------------------- -------------------------

De mappenstructuur zou er als volgt uit moeten zien:

Hallo Wereld
|- pom.xml
``-- meer
|-- hoofd
| ``-Java
| ``-- met
| ``-- Bedrijfsnaam
| ``-- Hallo Wereld
| ``- App.java
``-toets
``-Java
``-- met
``-- Bedrijfsnaam
``-- Hallo Wereld
``- AppTest.java

De pom.xml bevat de buildconfiguraties. Binnen de pom.xml ziet de code er als volgt uit:

xmlns='http://maven.apache.org/POM/4.0.0' xmlns:xsi='http://www.w3.org/2001/
XMLSchema-instantie'
xsi:schemaLocatie='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0
_0.xsd'>
>4.0.0>
>com.bedrijfsnaam.helloworld>
>Hallo Wereld>
>kan>
>1.0-MOMENTOPNAME>
>Hallo Wereld>
>http://maven.apache.org>
>
>
>junit>
>junit>
>3.8.1>
>toets>
>
>
>

U kunt het jar-bestand genereren met de volgende opdracht:

$ mvn pakket

[INFO] Scannen naar projecten...
[INFO]
[INFO] ----------------------------------------------- -------------------------
[INFO] Helloworld 1.0-SNAPSHOT bouwen
[INFO] ----------------------------------------------- -------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (standaard-bronnen) @ helloworld ---
[WAARSCHUWING] Gebruik van platformcodering (UTF-8) om gefilterde bronnen te kopiëren, d.w.z.
build is platformafhankelijk!
[INFO] niet bestaande resourceDirectory overslaan /Users/zak/_work/LearnBuildScripts/LearnMaven/
helloworld/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compileren (standaard-compileren) @ helloworld ---
[INFO] Wijzigingen gedetecteerd - module opnieuw compileren!
[WAARSCHUWING] Bestandscodering is niet ingesteld, gebruikmakend van platformcodering UTF-8, d.w.z. build is
platformafhankelijk!
[INFO] 1 bronbestand compileren naar /Users/zak/_work/LearnBuildScripts/LearnMaven/
halloworld/target/classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (standaard-testResources) @
Hallo Wereld ---
[WAARSCHUWING] Gebruik van platformcodering (UTF-8) om gefilterde bronnen te kopiëren, d.w.z.
build is platformafhankelijk!
[INFO] niet bestaande resourceDirectory overslaan /Users/zak/_work/LearnBuildScripts/LearnMaven/
halloworld/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (standaard-testCompile) @ helloworld ---
[INFO] Wijzigingen gedetecteerd - module opnieuw compileren!
[WAARSCHUWING] Bestandscodering is niet ingesteld, gebruikmakend van platformcodering UTF-8, d.w.z. build is
platformafhankelijk!
[INFO] 1 bronbestand compileren naar /Users/zak/_work/LearnBuildScripts/LearnMaven
/helloworld/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (standaardtest) @ helloworld ---
[INFO] Surefire-rapportmap: /Users/zak/_work/LearnBuildScripts/LearnMaven
/hallowereld/doel/
trefzekere-rapporten

-------------------------------------------------- -----
T E S T S
-------------------------------------------------- -----
Com.companyname.helloworld.AppTest uitvoeren
Tests uitgevoerd: 1, fouten: 0, fouten: 0, overgeslagen: 0, verstreken tijd: 0,014 sec

Resultaten :

Tests uitgevoerd: 1, fouten: 0, fouten: 0, overgeslagen: 0

[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (standaard-jar) @ helloworld ---
[INFO] Pot bouwen: /Users/zak/_work/LearnBuildScripts/LearnMaven/helloworld/target/
helloworld-1.0-SNAPSHOT.jar
[INFO] ----------------------------------------------- -------------------------
[INFO] BOUW SUCCES
[INFO] ----------------------------------------------- -------------------------
[INFO] Totale tijd: 5.624 s
[INFO] Geëindigd op: 2018-01-27T00:11:10-08:00
[INFO] Laatste geheugen: 16M/114M
[INFO] ----------------------------------------------- -------------------------

U kunt het jar-bestand als volgt uitvoeren:

$ java -cp target/helloworld-1.0-MOMENTOPNAME.kanmet.Bedrijfsnaam.Hallo Wereld.App
Hallo Wereld!

Het jar-bestand wordt in de doelmap geplaatst.

Gradle

Gradle combineert de kracht van Ant en Maven. De eerste versie van Gradle werd uitgebracht in 2012. Het is snel geadopteerd. Google gebruikt het momenteel voor Android OS.

In plaats van XML gebruikt Gradle de Groovy-taal. Als gevolg hiervan zijn build-scripts in Gradle gemakkelijker te schrijven en te lezen. Het gebruikte aanvankelijk Ivy voor afhankelijkheidsbeheer, maar gebruikt nu zijn eigen afhankelijkheidsengine.

Pluspunten

  • Biedt standaardisatie en blijft flexibel
  • Gemakkelijk te lezen en te schrijven bouwscripts
  • Beter in het omgaan met meerdere versies van afhankelijkheden
  • Kan omgaan met meerdere programmeertalen en technologieën
  • Actieve community die de tool helpt ontwikkelen
  • Gradle DSL (Domain-Specific Language) maakt het een eenvoudige configuratiestructuur
  • Gradle biedt prestatieverbeteringen met behulp van incrementeel bouwen van cache en de Gradle Daemon

nadelen

  • IDE-integratie niet zo goed als Maven

Graadvoorbeeld

U kunt Gradle installeren vanaf: hier . Nadat u Gradle in uw pad hebt ingesteld, kunt u dit controleren door:

$ gradueel--versie

-------------------------------------------------- ----------
Gradle4.5
-------------------------------------------------- ----------

Bouw tijd:2018-01-24 17: 04:52UTC
Revisie: 77d0ec90636f43669dc794ca17ef80dd65457bec

Groovy: 2.4.12
Mier: Apache Ant(TM)versie 1.9.9 gecompileerd in februari2 2017.
JVM: 1.8.0_74(Oracle Corporation25,74-b02)
Besturingssysteem: Mac OS X 10.11.6 x86_64

Maak vervolgens de volgende directorystructuur:

Hallo Wereld
| -bouwen.gradueel
``-src
| -hoofd
``-Java
``-Hallo Wereld
``-Hallo Wereld.Java

Zet voor de helloworld.java de code uit het voorbeeld van Ant. En voer voor build.gradle de volgende code in:

plug-in toepassen: 'Java'

versie= '1.0'

repositories{
mavenCentral()
}

afhankelijkheden{
testCompile groep: 'junit', naam: 'junit', versie: '4.12'
}

U kunt gradle-taken gebruiken -all commando om alle beschikbare commando's te bekijken. Gradle pakt automatisch de plug-ins op die u opgeeft in het build.gradle-bestand en toont u de extra taken die beschikbaar zijn vanwege de plug-ins.

U kunt de build krijgen door het volgende uit te voeren:

$ schaaltje

BOUWEN SUCCESVOL in 1s
2uitvoerbare taken:2uitgevoerd

Je kunt je pot als volgt uitvoeren:

$ java -cp build/libs/helloworld-1.0.kanHallo Wereld
Hallo Wereld!

Het jar-bestand wordt in de map build/libs geplaatst.

Conclusie

Van de build-tools kan Ant nuttig zijn voor kleinere projecten, terwijl Maven er beter voor zorgt dat alle ontwikkelaars dezelfde regels volgen. Gradle is de nieuwste tool die de meeste flexibiliteit biedt.

Referenties: