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:
- Apache Ant 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 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-versieApache 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:
En maak in dezelfde map helloworld het bestand ivy.xml aan met de volgende code:
>
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:
$mierkanEen 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/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 WereldHallo 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 --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-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:
XMLSchema-instantie'
xsi:schemaLocatie='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0
_0.xsd'>
>
>
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.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 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:
$ schaaltjeBOUWEN SUCCESVOL in 1s
2uitvoerbare taken:2uitgevoerd
Je kunt je pot als volgt uitvoeren:
$ java -cp build/libs/helloworld-1.0.kanHallo WereldHallo 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:
- http://ant.apache.org/
- http://ant.apache.org/ivy/
- https://maven.apache.org/
- https://gradle.org/
- http://makble.com/gradle-junit-helloworld-example
- https://examples.javacodegeeks.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://technologyconversations.com/2014/06/18/build-tools/
- https://www.quora.com/What-are-the-pros-and-cons-of-Maven-versus-Ant-as-building-tools-for-Java