Valg af det rigtige buildværktøj: Ant vs Maven vs Gradle
Under softwareudvikling skal udviklere genopbygge den samme kode igen og igen. De prøver ofte at bruge bash-scripts eller andre scripting-sprog til at automatisere opgaven. Der er dog tilgængelige build-værktøjer, der er mere passende til build-automatisering. De dominerende byggeværktøjer er:
- Apache Ant med Ivy
- Maven
- Gradle
Lad os undersøge værktøjerne for at finde ud af mere.
Apache Ant med Ivy
Apache Ant er et Java-baseret kommandolinjeværktøj, der bruger XML-filer til at definere build-scripts. Det bruges overvejende til Java-builds, men det kan også bruges til C / C ++ -udvikling. Indbyggede opgaver giver måder at kompilere, samle, teste og køre softwareapplikationer. Brugere kan også oprette deres egne "antlibs" for at forbedre Ant funktionalitet. Apache Ivy er et afhængighedsstyringsværktøj, der let integreres med Ant for at give et mere robust økosystem. Udviklingen af Ant startede i 2000.
Fordele
- Bedre kontrol over den samlede byggeproces
- Fleksibel nok til at arbejde med enhver arbejdsproces
Ulemper
- XML-baserede build-filer kan vokse sig store og uvedligeholdelige
- Masser af tid og ressourcer er nødvendige for at vedligeholde build-scripts
- IDE-integration er vanskelig at opnå
Ant med Ivy Eksempel
Du kan installere den nyeste Ant herfra. Du skal downloade zip, udvide og placere bin-mappen i din sti. Du kan bruge følgende kommando til at se, om Ant er installeret korrekt:
$ ant -versionApache Ant (TM) version 1.10.1 udarbejdet den 2. februar 2017
Når du har installeret Ant, kan du downloade den nyeste Ivy jar og lægge den i lib-mappen i Ant-biblioteket.
Når du har installeret Ant, skal du oprette mapper helloworld og helloworld / src. Inde i src-mappen skal du sætte helloworld.java-fil med koden:
/ **************************Udskriver "Hello World!"
*************************** /
offentlig klasse helloworld
offentlig statisk ugyldig hoved (String [] args)
System.ud.println ("Hello World!");
Nu skal du oprette en build i helloworld-mappen.xml-fil med følgende kode:
Og i den samme helloworld-mappe skal du oprette vedbend.xml-fil med følgende kode:
Katalogstrukturen skal se sådan ud:
Hej Verden| - build.xml
| - vedbend.xml
'- src
'-- Hej Verden.java
Nu kan du køre build med kommandoen:
$ myre krukkeEn vellykket build skal levere output som dette:
$ myre krukkeBuildfile: / Brugere / zak / _work / LearnBuildScripts / LearnANT / helloworld / build.xml
beslutte:
[vedbend: hente] :: Apache Ivy 2.4.0 - 20141213170938 :: http: // ant.apache.org / ivy / ::
[vedbend: hente] :: indstillinger for indlæsning :: url = jar: fil: / Brugere / zak / BuildTools / ANT / apache
-ant-1.10.1 / lib / ivy-2.4.0.krukke!/ org / apache / ivy / core / settings / ivysettings.xml
[ivy: retrieve] :: løsning af afhængigheder :: org.apache # helloworld; [email protected]
MacBook-Air.lokal
[vedbend: hente] confs: [standard]
[vedbend: hente] fundet junit # junit; 4.12 offentligt
[vedbend: hente] fundet org.hamcrest # hamcrest-core; 1.3 offentligt
[vedbend: hente] :: opløsningsrapport :: løse 397ms :: artefakter dl 15ms
---------------------------------------------------------------------
| | moduler || artefakter |
| conf | nummer | søg | dwnlded | fordrevet || nummer | trukket |
---------------------------------------------------------------------
| standard | 2 | 0 | 0 | 0 || 4 | 0 |
---------------------------------------------------------------------
[vedbend: hente] :: hentning :: org.apache # helloworld
[vedbend: hente] confs: [standard]
[vedbend: hent] 0 kopierede artefakter, 4 allerede hentet (0kB / 39ms)
udarbejde:
[mkdir] Oprettet dir: / Brugere / zak / _work / LearnBuildScripts / LearnANT / helloworld / build /
klasser
[javac] / Brugere / zak / _work / LearnBuildScripts / LearnANT / helloworld / build.xml: 22: advarsel:
'includeeantruntime' var ikke indstillet, som standard at bygge.sysclasspath = sidste; indstillet til falsk
til gentagelige bygninger
[javac] Kompilering af 1 kildefil til / Brugere / zak / _work / LearnBuildScripts / LearnANT /
helloworld / build / klasser
krukke:
[mkdir] Oprettet dir: / Brugere / zak / _work / LearnBuildScripts / LearnANT / helloworld / build / bin
[jar] Bygningskrukke: / Brugere / zak / _work / LearnBuildScripts / LearnANT / helloworld / build / bin /
Hej Verden.krukke
BYGG FRA
Samlet tid: 6 sekunder
Du kan prøve jar-filen på denne måde:
$ java -cp build / bin / helloworld.krukke helloworldHej Verden!
Vi har defineret jar-filen, der skal placeres i build / bin-mappen. Mapperne oprettes under build. Ant jar-kommandoen kalder jar-målet i buildet.xml.
Maven
Maven blev udviklet til at løse problemerne med Ant-baseret scripting. Det opbevarede XML-filerne, men tog en anden tilgang til organisationen. I Ant skal udviklere oprette alle opgaverne. Maven mindsker opgaveoprettelsen ved at implementere stærkere standarder for organisering af kode. Som et resultat er det lettere at komme i gang med standardprojekter.
Det introducerede også afhængighedsdownloads, som gjorde udviklingen lettere. Før introduktionen af Ivy i Ant måtte brugerne administrere afhængigheder lokalt. Maven vedtog først afhængighedsstyringsfilosofien.
Mavens strenge standarder gør det imidlertid vanskeligt at skrive specialbyggede scripts. Værktøjet er let at arbejde med, så længe projektet følger de strenge standarder.
Fordele
- Automatiske afhængighedsdownloads
- Alle afhængigheder registreres automatisk i kildekontrol som en del af Maven-scripts
- Standardiserer og forenkler byggeprocessen
- Integreres let med IDE'er og CI / CD-systemer
Ulemper
- Ikke fleksibel til oprettelse af brugerdefinerede arbejdsgange
- Stejl indlæringskurve og processen er vanskelig for nybegyndere at forstå
- Tidskrævende at løse byggeproblemer og nye biblioteksintegrationer
- Ikke godt med flere versioner af samme afhængighed
Maven Eksempel
Du kan downloade den nyeste Maven herfra. Du kan kontrollere installationen sådan:
$ mvn --versionApache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T00: 58: 13-07: 00)
Maven hjem: / Brugere / zak / BuildTools / Maven / apache-maven-3.5.2
Java-version: 1.8.0_74, leverandør: Oracle Corporation
Java-hjem: / Bibliotek / Java / JavaVirtualMachines / jdk1.8.0_74.jdk / Indhold / Hjem / jre
Standard locale: da_US, platformskodning: UTF-8
OS-navn: "mac os x", version: "10.11.6 ", bue:" x86_64 ", familie:" mac "
Opret en helloworld-mappe, og generer et projekt med følgende kommando:
$ mvn arketype: generer -DroupId = com.firmanavn.helloworld -DartifactId = helloworld-DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false
Det skal oprette mappestrukturen og generere det output, der ser sådan ud:
[INFO] Scanner efter projekter ..[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin: 3.0.0: generer (standard-cli)> generer-kilder
@ 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: generer (standard-cli) @ standalone-pom ---
[INFO] Genererer projekt i batch-tilstand
[INFO] ----------------------------------------------------------------------------
[INFO] Brug af følgende parametre til oprettelse af projekt fra Old (1.x) Arketype:
maven-archetype-quickstart: 1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Værdi: / Brugere / zak / _work / LearnBuildScripts / LearnMaven
[INFO] Parameter: pakke, Værdi: com.firmanavn.Hej Verden
[INFO] Parameter: groupId, Værdi: com.firmanavn.Hej Verden
[INFO] Parameter: artifactId, Værdi: helloworld
[INFO] Parameter: packageName, Value: com.firmanavn.Hej Verden
[INFO] Parameter: version, Værdi: 1.0-SNAPSHOT
[INFO] -projekt oprettet fra Old (1.x) Arketype i dir: / Brugere / zak / _work /
LearnBuildScripts / LearnMaven / helloworld
[INFO] ------------------------------------------------------------------------
[INFO] BYGG SUCCES
[INFO] ------------------------------------------------------------------------
[INFO] Samlet tid: 8.602 s
[INFO] Færdiggjort: 2018-01-27T00: 05: 37-08: 00
[INFO] Endelig hukommelse: 15M / 152M
[INFO] ------------------------------------------------------------------------
Mappestrukturen skal se sådan ud:
Hej Verden| - pom.xml
'- src
| - hoved
| '- java
| '- com
| '-- firmanavn
| '-- Hej Verden
| '- App.java
'- test
'- java
'- com
'-- firmanavn
'-- Hej Verden
'- AppTest.java
Pom.xml indeholder buildkonfigurationerne. Inde i pom.xml koden ser sådan ud:
_0.xsd ">
Du kan generere jar-filen ved hjælp af følgende kommando:
$ mvn-pakke[INFO] Scanner efter projekter ..
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Bygning af helloworld 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin: 2.6: ressourcer (standardressourcer) @ helloworld ---
[ADVARSEL] Brug af platformskodning (UTF-8 faktisk) til at kopiere filtrerede ressourcer, dvs.e.
build er platformafhængig!
[INFO] spring over ikke eksisterende resourceDirectory / Brugere / zak / _work / LearnBuildScripts / LearnMaven /
helloworld / src / main / ressourcer
[INFO]
[INFO] --- maven-compiler-plugin: 3.1: kompilér (standardkompilering) @ helloworld ---
[INFO] Opdagede ændringer - kompilering af modulet igen!
[ADVARSEL] Filkodning er ikke indstillet ved hjælp af platformskodning UTF-8, i.e. bygge er
platformafhængig!
[INFO] Kompilering af 1 kildefil til / Brugere / zak / _work / LearnBuildScripts / LearnMaven /
helloworld / mål / klasser
[INFO]
[INFO] --- maven-resources-plugin: 2.6: testResources (standard-testResources) @
Hej Verden ---
[ADVARSEL] Brug af platformskodning (UTF-8 faktisk) til at kopiere filtrerede ressourcer, dvs.e.
build er platformafhængig!
[INFO] spring over ikke eksisterende resourceDirectory / Brugere / zak / _work / LearnBuildScripts / LearnMaven /
helloworld / src / test / ressourcer
[INFO]
[INFO] --- maven-compiler-plugin: 3.1: testCompile (standard-testCompile) @ helloworld ---
[INFO] Opdagede ændringer - kompilering af modulet igen!
[ADVARSEL] Filkodning er ikke indstillet ved hjælp af platformskodning UTF-8, i.e. bygge er
platformafhængig!
[INFO] Kompilering af 1 kildefil til / Brugere / zak / _work / LearnBuildScripts / LearnMaven
/ helloworld / target / test-klasser
[INFO]
[INFO] --- maven-surefire-plugin: 2.12.4: test (standardtest) @ helloworld ---
[INFO] Surefire-rapportmappe: / Brugere / zak / _work / LearnBuildScripts / LearnMaven
/ helloworld / mål /
sikkerhedsrapporter
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Kører com.firmanavn.Hej Verden.AppTest
Testkørsel: 1, Fejl: 0, Fejl: 0, Springet over: 0, Forløbet tid: 0.014 sek
Resultater:
Testkørsel: 1, Fejl: 0, Fejl: 0, Springet over: 0
[INFO]
[INFO] --- maven-jar-plugin: 2.4: jar (standard-jar) @ helloworld ---
[INFO] Bygningskrukke: / Brugere / zak / _work / LearnBuildScripts / LearnMaven / helloworld / target /
helloworld-1.0-SNAPSHOT.krukke
[INFO] ------------------------------------------------------------------------
[INFO] BYGG SUCCES
[INFO] ------------------------------------------------------------------------
[INFO] Samlet tid: 5.624 s
[INFO] Færdiggjort: 2018-01-27T00: 11: 10-08: 00
[INFO] Endelig hukommelse: 16M / 114M
[INFO] ------------------------------------------------------------------------
Du kan køre jar-filen sådan:
$ java -cp target / helloworld-1.0-SNAPSHOT.jar com.firmanavn.Hej Verden.AppHej Verden!
Jar-filen placeres i målmappen.
Gradle
Gradle kombinerer kraften fra Ant og Maven. Den første version af Gradle blev udgivet i 2012. Det har set hurtig vedtagelse. Google bruger det i øjeblikket til Android OS.
I stedet for XML bruger Gradle Groovy-sproget. Som et resultat er build-scripts i Gradle lettere at skrive og læse. Det brugte oprindeligt Ivy til afhængighedsstyring, men det bruger sin egen afhængighedsmotor nu.
Fordele
- Giver standardisering, mens du forbliver fleksibel
- Let at læse og skrive build-scripts
- Bedre til at håndtere flere versioner af afhængigheder
- Kan håndtere flere programmeringssprog og teknologier
- Aktivt samfund, der hjælper med at udvikle værktøjet
- Gradle DSL (Domain-Specific Language) gør det enkel konfigurationsstruktur
- Gradle giver forbedringer af ydeevnen ved hjælp af trinvis build cache og Gradle Daemon
Ulemper
- IDE-integration er ikke så god som Maven
Gradleeksempel
Du kan installere Gradle herfra. Når du har konfigureret Gradle på din vej, kan du kontrollere det ved at:
$ gradle --version------------------------------------------------------------
Grad 4.5
------------------------------------------------------------
Byggetid: 2018-01-24 17:04:52 UTC
Revision: 77d0ec90636f43669dc794ca17ef80dd65457bec
Groovy: 2.4.12
Ant: Apache Ant (TM) version 1.9.9 udarbejdet den 2. februar 2017
JVM: 1.8.0_74 (Oracle Corporation 25.74-b02)
Styresystem: Mac OS X 10.11.6 x86_64
Opret derefter følgende bibliotekstruktur:
Hej Verden| - build.gradle
'- src
| - hoved
'- java
'-- Hej Verden
'-- Hej Verden.java
For helloworld.java satte koden fra Ant-eksemplet. Og til opbygning.gradle sæt i følgende kode:
anvend plugin: 'java'version = '1.0 '
opbevaringssteder
mavenCentral ()
afhængigheder
testCompile gruppe: 'junit', navn: 'junit', version: '4.12 '
Du kan bruge kommandoen “gradle Tasks -all” til at se på alle tilgængelige kommandoer. Gradle henter automatisk de plugins, du angiver i buildet.gradle-fil og viser dig de ekstra opgaver, der er tilgængelige på grund af plugins.
Du kan få build ved at køre:
$ gradle krukkeBYG LIGTIG i 1s
2 handlinger, der kan handles: 2 udføres
Du kan køre din krukke sådan:
$ java -cp build / libs / helloworld-1.0.krukke helloworldHej Verden!
Jar-filen placeres i build / libs-mappen.
Konklusion
Blandt byggeværktøjerne kan Ant være nyttigt til mindre projekter, mens Maven er bedre til at sikre, at alle udviklere følger de samme regler. Gradle er det nyeste værktøj, der giver mest fleksibilitet.
Referencer:
- http: // ant.apache.org /
- http: // ant.apache.org / vedbend /
- https: // maven.apache.org /
- https: // gradle.org /
- http: // makble.com / gradle-junit-helloworld-eksempel
- https: // eksempler.javacodegeeks.com / core-java / gradle / gradle-hello-world-tutorial /
- https: // gradle.org / maven-vs-gradle /
- https: // maven.apache.org / guider / at komme i gang / maven-in-five-minutes.html
- https: // stackoverflow.com / spørgsmål / 20755437 / java-build-tools-ant-vs-maven
- https: // teknologikonversationer.com / 2014/06/18 / build-tools /
- https: // www.quora.com / Hvad er fordelene og ulemperne ved Maven-versus-Ant-som-bygningsværktøjer-til-Java