De juiste bouwtool kiezen: Ant vs Maven vs Gradle
Tijdens de softwareontwikkeling moeten ontwikkelaars dezelfde code steeds opnieuw opbouwen rebuild. 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:
- Apache mier met klimop
- Maven
- Gradle
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 vanaf hier installeren. Je moet de zip downloaden, uitvouwen en de bin-map in je pad zetten. U kunt de volgende opdracht gebruiken om te zien of Ant correct is geïnstalleerd:
$ mier -versieApache Ant(TM) versie 1.10.1 samengesteld op 2 februari 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. Zet in de src-map helloworld.java-bestand met de code:
/******************************Drukt "Hallo wereld" af!"
**************************/
openbare klas helloworld
public static void main(String[] args)
Systeem.uit.println("Hallo wereld!");
Maak nu in de map helloworld een build.xml-bestand met de volgende code:
En maak in dezelfde map helloworld de klimop.xml-bestand met de volgende code:
De directorystructuur zou er als volgt uit moeten zien:
Hallo Wereld|-- bouwen.xml
|-- klimop.xml
'-- src
'-- Hallo Wereld.Java
Nu kunt u de build uitvoeren met het commando:
$ mierenpotEen succesvolle build zou de volgende output moeten opleveren:
$ mierenpotBuildbestand: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build.xml
oplossen:
[klimop:ophalen] :: Apache Ivy 2.4.0 - 20141213170938 :: http://ant.apache.org/klimop/ ::
[ivy:retrieve] :: instellingen laden :: url = jar:file:/Users/zak/BuildTools/ANT/apache
-mier-1.10.1/lib/klimop-2.4.0.pot!/org/apache/ivy/core/settings/ivysettings.xml
[klimop:ophalen] :: afhankelijkheden oplossen :: org.apache#helloworld;[email protected]
MacBook Air.lokaal
[ivy:ophalen] confs: [standaard]
[ivy:retrieve] gevonden junit#junt;4.12 in het openbaar
[ivy:retrieve] gevonden organisatie.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
[ivy: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=laatste; ingesteld op false
voor herhaalbare builds
[javac] 1 bronbestand compileren naar /Users/zak/_work/LearnBuildScripts/LearnANT/
helloworld/bouwen/klassen
pot:
[mkdir] Gemaakt map: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/bin
[jar] Jar bouwen: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/bin/
Hallo Wereld.pot
SUCCESVOL BOUWEN
Totale tijd: 6 seconden
U kunt het jar-bestand als volgt uitproberen:
$ java -cp build/bin/helloworld.pot helloworldHallo Wereld!
We hebben het jar-bestand gedefinieerd dat in de build/bin-map moet worden geplaatst. De mappen worden aangemaakt tijdens het bouwen. Het ant jar-commando 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 aan. 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 standaardprojecten.
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
Je kunt de nieuwste Maven hier downloaden. U kunt de installatie als volgt controleren:
$ mvn --versieApache 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 home: /Bibliotheek/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Inhoud/Home/jre
Standaardlandinstelling: 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.helloworld -DartifactId=helloworld-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
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:genereer (standaard-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 Old (1.x) Archetype:
maven-archetype-snelstart:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Waarde: /Users/zak/_work/LearnBuildScripts/LearnMaven
[INFO] Parameter: pakket, Waarde: com.Bedrijfsnaam.Hallo Wereld
[INFO] Parameter: groupId, Waarde: com.Bedrijfsnaam.Hallo Wereld
[INFO] Parameter: artifactId, Waarde: helloworld
[INFO] Parameter: pakketnaam, waarde: com.Bedrijfsnaam.Hallo Wereld
[INFO] Parameter: versie, Waarde: 1.0-SNAPSHOT
[INFO] project gemaakt op basis van Old (1.x) Archetype in dir: /Users/zak/_work/
LearnBuildScripts/LearnMaven/helloworld
[INFO] ------------------------------------------------------------------------
[INFO] BOUW SUCCES
[INFO] ------------------------------------------------------------------------
[INFO] Totale tijd: 8.602 euro
[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
'-- src
|-- hoofd
| '-- java
| '-- kom'
| '-- Bedrijfsnaam
| '-- Hallo Wereld
| '-- App.Java
'-- test
'-- java
'-- kom'
'-- Bedrijfsnaam
'-- Hallo Wereld
'-- AppTest.Java
de pom.xml bevat de build-configuraties. Binnen de pom.xml ziet de code er als volgt uit:
_0.xsd">
U kunt het jar-bestand genereren met de volgende opdracht:
$ mvn pakket[INFO] Scannen naar projecten..
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Helloworld bouwen 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:bronnen (standaardbronnen) @ helloworld ---
[WAARSCHUWING] Platformcodering (UTF-8) gebruiken om gefilterde bronnen te kopiëren, i,.e.
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, met platformcodering UTF-8, i.e. bouwen is
platform afhankelijk!
[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] Platformcodering (UTF-8) gebruiken om gefilterde bronnen te kopiëren, i,.e.
build is platformafhankelijk!
[INFO] niet bestaande resourceDirectory overslaan /Users/zak/_work/LearnBuildScripts/LearnMaven/
halloworld/src/test/resources
[INFO]
[INFO] --- maven-compiler-plug-in:3.1:testCompile (standaard-testCompile) @ helloworld ---
[INFO] Wijzigingen gedetecteerd - module opnieuw compileren!
[WAARSCHUWING] Bestandscodering is niet ingesteld, met platformcodering UTF-8, i.e. bouwen is
platform afhankelijk!
[INFO] 1 bronbestand compileren naar /Users/zak/_work/LearnBuildScripts/LearnMaven
/helloworld/target/testklassen
[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
-------------------------------------------------------
Hardlopen com.Bedrijfsnaam.Hallo Wereld.AppTest
Tests uitgevoerd: 1, fouten: 0, fouten: 0, overgeslagen: 0, verstreken tijd: 0.014 seconden
Resultaten :
Tests uitgevoerd: 1, fouten: 0, fouten: 0, overgeslagen: 0
[INFO]
[INFO] --- maven-jar-plug-in:2.4:jar (standaard-jar) @ helloworld ---
[INFO] Jar bouwen: /Users/zak/_work/LearnBuildScripts/LearnMaven/helloworld/target/
halloworld-1.0-SNAPSHOT.pot
[INFO] ------------------------------------------------------------------------
[INFO] BOUW SUCCES
[INFO] ------------------------------------------------------------------------
[INFO] Totale tijd: 5.624 euro
[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-SNAPSHOT.jar com.Bedrijfsnaam.Hallo Wereld.AppHallo 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 heeft een snelle adoptie gekend. 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 engine.
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
Je kunt Gradle hier installeren install. Nadat u Gradle in uw pad hebt ingesteld, kunt u dit controleren door:
$ gradle --versie------------------------------------------------------------
Graad 4.5
------------------------------------------------------------
Bouwtijd: 24-01-2018 17:04:52 UTC
Revisie: 77d0ec90636f43669dc794ca17ef80dd65457bec
Groovy: 2.4.12
Ant: Apache Ant(TM) versie 1.9.9 samengesteld op 2 februari 2017
JVM: 1.8.0_74 (Oracle Corporation 25.74-b02)
Besturingssysteem: Mac OS X 10.11.6x86_64
Maak vervolgens de volgende directorystructuur:
Hallo Wereld|-- bouwen.gradueel
'-- src
|-- hoofd
'-- java
'-- Hallo Wereld
'-- Hallo Wereld.Java
Voor de hallowereld.java zet de code uit het voorbeeld van Ant. En voor de bouw.gradle zet de volgende code in:
plug-in toepassen: 'java'versie = '1.0'
opslagplaatsen
mavenCentral()
afhankelijkheden
testCompile groep: 'junit', naam: 'junit', versie: '4.12'
U kunt de opdracht "gradle taken -all" gebruiken om alle beschikbare opdrachten te bekijken. Gradle pakt automatisch de plug-ins op die u opgeeft in de build.gradle-bestand en toont u de extra taken die beschikbaar zijn dankzij de plug-ins.
U kunt de build krijgen door het volgende uit te voeren:
$ schaaltjeBOUW SUCCESVOL in 1s
2 bruikbare taken: 2 uitgevoerd
Je kunt je pot als volgt uitvoeren:
$ java -cp build/libs/helloworld-1.0.pot helloworldHallo Wereld!
Het jar-bestand wordt in de map build/libs geplaatst.
Conclusie
Van de bouwtools 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:
- http://ant.apache.org/
- http://ant.apache.org/klimop/
- https://maven.apache.org/
- https://gradle.org/
- http://makble.com/gradle-junit-helloworld-voorbeeld
- https://voorbeelden.javacodegeeks.com/core-java/gradle/gradle-hello-world-tutorial/
- https://gradle.org/maven-vs-gradle/
- https://maven.apache.org/gidsen/aan de slag/maven-in-vijf-minuten.html
- https://stackoverflow.com/questions/20755437/java-build-tools-ant-vs-maven
- https://technologiegesprekken.com/2014/06/18/build-tools/
- https://www.quora.com/Wat-zijn-de-voor-en-nadelen-van-Maven-versus-Ant-als-bouwtools-voor-Java