Under programvareutvikling må utviklere bygge den samme koden om og om igjen. De prøver ofte å bruke bash -skript eller andre skriptspråk for å automatisere oppgaven. Imidlertid finnes det byggeverktøy som er mer passende for byggautomatisering. De dominerende byggeverktøyene er:
- Apache Ant med Eføy
- Maven
- Gradle
La oss undersøke verktøyene for å finne ut mer.
Apache maur med Ivy
Apache Ant er et Java-basert kommandolinjeverktøy som bruker XML-filer til å definere byggeskript. Den brukes hovedsakelig til Java -builds, men den kan også brukes til C/C ++ - utvikling. Innebygde oppgaver gir måter å kompilere, montere, teste og kjøre programvare. Brukere kan også lage sine egne antlibs for å forbedre funksjonaliteten til Ant. Apache Ivy er et verktøy for avhengighetsbehandling som enkelt kan integreres med Ant for å gi et mer robust økosystem. Utviklingen av Ant startet i 2000.
Fordeler
- Bedre kontroll over den generelle byggeprosessen
- Fleksibel nok til å jobbe med enhver arbeidsprosess
Ulemper
- XML -baserte byggfiler kan vokse seg store og uholdbare
- Mye tid og ressurser er nødvendig for å vedlikeholde byggeskriptene
- IDE -integrasjon er vanskelig å oppnå
Maur med eføy eksempel
Du kan installere den siste Ant fra her . Du må laste ned zip, utvide og sette bin -mappen i banen. Du kan bruke følgende kommando for å se om Ant er riktig installert:
$ maur-versjonApache Ant(TM)versjon 1.10.1 kompilert februar2 2017
Når du har installert Ant, kan du laste ned den nyeste Ivy -krukken og legge den i lib -mappen inne i Ant -katalogen.
Etter at du har installert Ant, oppretter du mapper helloworld og helloworld/src. Sett helloworld.java -filen inne i src -mappen med koden:
/ **************************Skriver ut 'Hei verden!'
*************************** /
offentlig klasseHei Verden{
offentlig statisk tomromhoved-( String []args) {
System .ute.println('Hei Verden!');
}
}
Lag en build.xml -fil med følgende kode i helloworld -mappen:
Og i den samme helloworld -mappen, opprett ivy.xml -filen med følgende kode:
>
Katalogstrukturen skal se slik ut:
Hei Verden|- build.xml
| - eføy.xml
`- src
`- helloworld.java
Nå kan du kjøre bygningen med kommandoen:
$maurkrukkeEn vellykket build bør gi utgang som denne:
$ maur krukkeBuildfile: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build.xml
Løse:
[ivy: retrieve] :: Apache Ivy 2.4.0 - 20141213170938 :: http://ant.apache.org/ivy/ ::
[ivy: retrieve] :: lasting settings :: 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] :: løse avhengigheter :: org.apache#helloworld; [e -postbeskyttet]
MacBook-Air. Lokal
[ivy: retrieve] confs: [standard]
[ivy: retrieve] funnet junit#junit; 4.12 offentlig
[ivy: retrieve] fant org.hamcrest#hamcrest-core; 1,3 offentlig
[ivy: retrieve] :: resolusjonsrapport :: løse 397 ms :: artifacts dl 15 ms
-------------------------------------------------- -------------------
| | moduler || artefakter |
| conf | nummer | søk | dwnlded | kastet ut || nummer | dwnlded |
-------------------------------------------------- -------------------
| standard | 2 | 0 | 0 | 0 || 4 | 0 |
-------------------------------------------------- -------------------
[ivy: retrieve] :: henter :: org.apache#helloworld
[ivy: retrieve] confs: [standard]
[ivy: retrieve] 0 gjenstander kopiert, 4 allerede hentet (0 kB/39 ms)
kompilere:
[mkdir] Opprettet dir:/Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/
klasser
[javac] /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build.xml:22: advarsel:
'includedeantruntime' ble ikke angitt, som standard er build.sysclasspath = last; satt til false
for repeterbare bygg
[javac] Kompilere 1 kildefil til/Users/zak/_work/LearnBuildScripts/LearnANT/
helloworld/build/klasser
krukke:
[mkdir] Opprettet dir:/Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/bin
[jar] Bygningskrukke:/Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/bin/
helloworld.jar
BYGG SUKSESSFULL
Total tid: 6 sekunder
Du kan prøve jarfilen slik:
$ java -cp build/bin/helloworld.krukkeHei VerdenHei Verden!
Vi har definert jar -filen som skal settes i build/bin -mappen. Mappene blir opprettet under byggingen. Ant jar -kommandoen kaller jar -målet i build.xml.
Maven
Maven ble utviklet for å løse problemene med ant-basert skripting. Det beholdt XML -filene, men tok en annen tilnærming til organisering. I Ant må utviklere lage alle oppgavene. Maven reduserer opprettelsen av oppgaver ved å implementere sterkere standarder for organisering av kode. Som et resultat er det lettere å komme i gang med standardprosjekter.
Det introduserte også nedlastingsnedlastinger som gjorde utviklingen enklere. Før introduksjonen av Ivy i Ant, måtte brukerne administrere avhengigheter lokalt. Maven vedtok først avhengighetsstyringsfilosofien.
Imidlertid gjør Mavens strenge standarder det vanskelig å skrive skreddersydde byggeskript. Verktøyet er enkelt å jobbe med så lenge prosjektet følger de strenge standardene.
Fordeler
- Automatisk nedlasting av avhengighet
- Alle avhengigheter registreres automatisk i kildekontroll som en del av Maven -skriptene
- Standardiserer og forenkler byggeprosessen
- Integreres enkelt med IDEer og CI/CD -systemer
Ulemper
- Ikke fleksibel når det gjelder å lage tilpassede arbeidsflyter
- Bratt læringskurve og prosessen er vanskelig for nybegynnere å forstå
- Tidkrevende å løse byggeproblemer og nye bibliotekintegrasjoner
- Ikke bra med flere versjoner av samme avhengighet
Maven eksempel
Du kan laste ned den nyeste Maven fra her . Du kan sjekke installasjonen slik:
$ mvn -versjonApache Maven 3.5.2(138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T00:58:1. 3-07: 00)
Maven home: /Users/zak/BuildTools/Maven/apache-maven-3.5.2
Java -versjon: 1.8.0_74, leverandør: Oracle Corporation
Java -hjem: /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Innhold/Hjem/jre
Standard språk: en_US, plattformkoding: UTF-8
OS -navn:'mac os x', versjon:'10 .11.6 ', bue:'x86_64', familie:'mac'
Lag en helloworld -mappe og generer et prosjekt med følgende kommando:
$ mvn arketype: generere -DgroupId = com.selskapsnavn.Hei Verden-DartifactId = helloworld-DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode =falsk
Det skal opprette mappestrukturen og generere utdataene som ser slik ut:
[INFO] Søker etter prosjekter ...[INFO]
[INFO] ----------------------------------------------- -------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ----------------------------------------------- -------------------------
[INFO]
[INFO] >>> maven-archetype-plugin: 3.0.0: generere (standard-cli)> generere-kilder
@ frittstående-pom >>>
[INFO]
[INFO]<<< maven-archetype-plugin:3.0.0:generate (default-cli) < generate-sources
@ frittstående-pom<<<
[INFO]
[INFO]
[INFO] --- maven-archetype-plugin: 3.0.0: generere (standard-cli) @ standalone-pom ---
[INFO] Genererer prosjekt i batchmodus
[INFO] ----------------------------------------------- -----------------------------
[INFO] Bruke følgende parametere for å lage prosjekt fra gammel (1.x) arketype:
maven-archetype-quickstart: 1.0
[INFO] ----------------------------------------------- -----------------------------
[INFO] Parameter: basedir, Value:/Users/zak/_work/LearnBuildScripts/LearnMaven
[INFO] Parameter: pakke, verdi: com.companyname.helloworld
[INFO] Parameter: groupId, verdi: com.companyname.helloworld
[INFO] Parameter: artifactId, verdi: helloworld
[INFO] Parameter: packageName, Value: com.companyname.helloworld
[INFO] Parameter: versjon, verdi: 1.0-SNAPSHOT
[INFO] prosjekt opprettet fra gammel (1.x) arketype i dir:/Users/zak/_work/
LearnBuildScripts/LearnMaven/helloworld
[INFO] ----------------------------------------------- -------------------------
[INFO] BYGGESUKSESS
[INFO] ----------------------------------------------- -------------------------
[INFO] Total tid: 8.602 s
[INFO] Ferdig: 2018-01-27T00: 05: 37-08: 00
[INFO] Endelig minne: 15M/152M
[INFO] ----------------------------------------------- -------------------------
Mappestrukturen skal se slik ut:
Hei Verden|- pom.xml
``- src
|- hoved
| ``-java
| ``- med
| ``-- selskapsnavn
| ``-- Hei Verden
| ``- App. Java
``-test
``-java
``- med
``-- selskapsnavn
``-- Hei Verden
``- AppTest.java
Pom.xml inneholder build -konfigurasjonene. Inne i pom.xml ser koden slik ut:
XMLSchema-forekomst '
xsi: schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0
_0.xsd '>
>
>
Du kan generere jar -filen ved å bruke følgende kommando:
$ mvn pakke[INFO] Søker etter prosjekter ...
[INFO]
[INFO] ----------------------------------------------- -------------------------
[INFO] Bygge helloworld 1.0-SNAPSHOT
[INFO] ----------------------------------------------- -------------------------
[INFO]
[INFO] --- maven-resources-plugin: 2.6: resources (default-resources) @ helloworld ---
[ADVARSEL] Bruke plattformkoding (UTF-8 faktisk) for å kopiere filtrerte ressurser, dvs.
build er plattformavhengig!
[INFO] hopp over ikke eksisterende ressursDirectory/Users/zak/_work/LearnBuildScripts/LearnMaven/
helloworld/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin: 3.1: compile (default-compile) @ helloworld ---
[INFO] Endringer oppdaget - kompilering av modulen på nytt!
[ADVARSEL] Filkoding er ikke angitt ved bruk av plattformkoding UTF-8, dvs.
plattformavhengig!
[INFO] Kompilere 1 kildefil til/Users/zak/_work/LearnBuildScripts/LearnMaven/
helloworld/target/classes
[INFO]
[INFO] --- maven-resources-plugin: 2.6: testResources (default-testResources) @
Hei Verden ---
[ADVARSEL] Bruke plattformkoding (UTF-8 faktisk) for å kopiere filtrerte ressurser, dvs.
build er plattformavhengig!
[INFO] hopp over ikke eksisterende ressursDirectory/Users/zak/_work/LearnBuildScripts/LearnMaven/
helloworld/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin: 3.1: testCompile (standard-testCompile) @ helloworld ---
[INFO] Endringer oppdaget - kompilering av modulen på nytt!
[ADVARSEL] Filkoding er ikke angitt ved bruk av plattformkoding UTF-8, dvs.
plattformavhengig!
[INFO] Kompilere 1 kildefil til/Users/zak/_work/LearnBuildScripts/LearnMaven
/helloworld/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin: 2.12.4: test (standardtest) @ helloworld ---
[INFO] Surefire rapportkatalog:/Users/zak/_work/LearnBuildScripts/LearnMaven
/helloworld/target/
surefire-rapporter
-------------------------------------------------- -----
T E S T S
-------------------------------------------------- -----
Kjører com.companyname.helloworld.AppTest
Testkjøring: 1, Feil: 0, Feil: 0, Hoppet over: 0, Forløpt tid: 0,014 sek
Resultater:
Testkjøring: 1, Feil: 0, Feil: 0, Hoppet over: 0
[INFO]
[INFO] --- maven-jar-plugin: 2.4: jar (standard-jar) @ helloworld ---
[INFO] Byggekrukke:/Users/zak/_work/LearnBuildScripts/LearnMaven/helloworld/target/
helloworld-1.0-SNAPSHOT.jar
[INFO] ----------------------------------------------- -------------------------
[INFO] BYGGESUKSESS
[INFO] ----------------------------------------------- -------------------------
[INFO] Total tid: 5.624 s
[INFO] Ferdig: 2018-01-27T00: 11: 10-08: 00
[INFO] Endelig minne: 16M/114M
[INFO] ----------------------------------------------- -------------------------
Du kan kjøre jar -filen slik:
$ java -cp target/helloworld-1.0-SNAPSHOT.krukkemed.selskapsnavn.Hei Verden.AppHei Verden!
Krukkefilen legges i målmappen.
Gradle
Gradle kombinerer kraften til Ant og Maven. Den første versjonen av Gradle ble utgitt i 2012. Den har sett rask adopsjon. Google bruker det for øyeblikket til Android OS.
I stedet for XML bruker Gradle Groovy -språket. Som et resultat er byggeskript i Gradle lettere å skrive og lese. Det brukte opprinnelig Ivy for avhengighetsbehandling, men det bruker sin egen avhengighetsmotor nå.
Fordeler
- Gir standardisering mens du forblir fleksibel
- Lett å lese og skrive bygge skript
- Bedre til å håndtere flere versjoner av avhengigheter
- Kan håndtere flere programmeringsspråk og teknologier
- Aktivt fellesskap som hjelper til med å utvikle verktøyet
- Gradle DSL (Domain-Specific Language) gjør det til en enkel konfigurasjonsstruktur
- Gradle gir ytelsesforbedringer ved å bruke trinnvis bygge cache og Gradle Daemon
Ulemper
- IDE -integrasjon er ikke like bra som Maven
Gradle eksempel
Du kan installere Gradle fra her . Når du har konfigurert Gradle i stien din, kan du sjekke det ved å:
$ gradle--versjon-------------------------------------------------- ----------
Gradle4.5
-------------------------------------------------- ----------
Byggetid:2018-01-24 17: 04:52UTC
Revisjon: 77d0ec90636f43669dc794ca17ef80dd65457bec
Groovy: 2.4.12
Maur: Apache maur(TM)versjon 1.9.9 kompilert februar2 2017
JVM: 1.8.0_74(Oracle Corporation25,74-b02)
OS: Mac OS X 10.11.6 x86_64
Deretter oppretter du følgende katalogstruktur:
Hei Verden| -bygge.gradle
``-src
| -hoved-
``-java
``-Hei Verden
``-Hei Verden.java
For helloworld.java, legg koden fra Ant -eksempelet. Og for build.gradle legg inn følgende kode:
bruk plugin: 'java'versjon= '1.0'
depoter{
mavenCentral()
}
avhengigheter{
testKompiler gruppe: 'junit', Navn: 'junit', versjon: '4.12'
}
Du kan bruke gradle -oppgaver - alle kommandoer for å se på alle tilgjengelige kommandoer. Gradle henter automatisk pluginene du angir i build.gradle -filen og viser deg de ekstra oppgavene som er tilgjengelige på grunn av plugins.
Du kan få bygget ved å kjøre:
$ gradle krukkeBYGGE VELLYKKET på 1s
2handlingsrike oppgaver:2henrettet
Du kan kjøre glasset ditt slik:
$ java -cp build/libs/helloworld-1.0.krukkeHei VerdenHei Verden!
Krukkefilen legges i build/libs -mappen.
Konklusjon
Blant byggeverktøyene kan Ant være nyttig for mindre prosjekter mens Maven er bedre for å sikre at alle utviklere følger de samme reglene. Gradle er det siste verktøyet som gir mest fleksibilitet.
Referanser:
- 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