Izbira pravega orodja za gradnjo: Ant vs Maven vs Gradle
Med razvojem programske opreme morajo razvijalci vedno znova obnavljati isto kodo. Za avtomatizacijo naloge pogosto poskušajo uporabiti bash skripte ali druge skriptne jezike. Na voljo pa so orodja za gradnjo, ki so primernejša za avtomatizacijo gradnje. Prevladujoča orodja za gradnjo so:
- Apaški mrav z bršljanom
- Maven
- Gradle
Preučimo orodja, če želimo izvedeti več.
Apaški mrav z bršljanom
Apache Ant je orodje ukazne vrstice, ki temelji na Javi in uporablja datoteke XML za definiranje skriptov gradnje. Uporablja se pretežno za gradnje Java, lahko pa se uporablja tudi za razvoj C / C ++. Vgrajene naloge ponujajo načine za prevajanje, sestavljanje, preizkušanje in zagon programskih aplikacij. Uporabniki lahko ustvarijo tudi lastne "antlibs", da izboljšajo funkcionalnost Ant. Apache Ivy je orodje za upravljanje odvisnosti, ki se zlahka poveže z Antom in tako zagotovi močnejši ekosistem. Razvoj Ant se je začel leta 2000.
Prednosti
- Boljši nadzor nad celotnim postopkom gradnje
- Dovolj prilagodljiv za delo s katerim koli delovnim procesom
Slabosti
- Datoteke za gradnjo, ki temeljijo na XML, se lahko povečajo in jih ni mogoče vzdrževati
- Za vzdrževanje skriptov gradnje je potrebnih veliko časa in virov
- Integracijo IDE je težko doseči
Primer mravlje z bršljanom
Od tu lahko namestite najnovejšega Ant. Prenesti morate zip, razširiti in postaviti mapo bin na svojo pot. Če želite preveriti, ali je Ant pravilno nameščen, lahko uporabite naslednji ukaz:
$ ant -verzijaApache Ant (TM) različica 1.10.1, sestavljeno 2. februarja 2017
Ko namestite Ant, lahko prenesete najnovejši Ivy jar in ga shranite v mapo lib v imeniku Ant.
Ko namestite Ant, ustvarite mape helloworld in helloworld / src. V mapo src vstavite helloworld.java datoteka s kodo:
/ **************************Natisne "Hello World!"
*************************** /
javni razred helloworld
public static void main (String [] args)
Sistem.ven.println ("Pozdravljeni, svet!");
Zdaj v mapi helloworld ustvarite zgradbo.xml z naslednjo kodo:
In v isti mapi helloworld ustvarite bršljan.xml z naslednjo kodo:
Struktura imenika bi morala izgledati tako:
Pozdravljen, svet| - graditi.xml
| - bršljan.xml
'- src
'-- Pozdravljen, svet.java
Zdaj lahko gradite z ukazom:
$ kozarec mravljeUspešna gradnja bi morala zagotoviti takšne rezultate:
$ kozarec mravljeBuildfile: / Users / zak / _work / LearnBuildScripts / LearnANT / helloworld / build.xml
razreši:
[ivy: retrieve] :: Apache Ivy 2.4.0 - 20141213170938 :: http: // ant.apache.org / bršljan / ::
[ivy: retrieve] :: nastavitve nalaganja :: url = jar: datoteka: / Users / zak / BuildTools / ANT / apache
-mravlja-1.10.1 / lib / bršljan-2.4.0.kozarec!/ org / apache / ivy / core / settings / ivysettings.xml
[ivy: retrieve] :: reševanje odvisnosti :: org.apache # helloworld; [e-pošta zaščitena]
MacBook-Air.lokalno
[ivy: retrieve] confs: [privzeto]
[bršljan: pridobi] najden junit # junit; 4.12 v javnosti
[bršljan: pridobi] najdeno org.hamcrest # hamcrest-core; 1.3 v javnosti
[bršljan: pridobi] :: poročilo o ločljivosti :: razreši 397ms :: artefakti dl 15ms
---------------------------------------------------------------------
| | moduli || predmeti |
| conf | številka | iskanje | dwnlded | deložiran || številka | dwnlded |
---------------------------------------------------------------------
| privzeto | 2 | 0 | 0 | 0 || 4 | 0 |
---------------------------------------------------------------------
[ivy: retrieve] :: retrieving :: org.apache # helloworld
[ivy: retrieve] confs: [privzeto]
[ivy: retrieve] 0 kopiranih artefaktov, 4 že pridobljenih (0kB / 39ms)
pripravi:
[mkdir] Ustvaren direktorij: / Users / zak / _work / LearnBuildScripts / LearnANT / helloworld / build /
razredih
[javac] / Users / zak / _work / LearnBuildScripts / LearnANT / helloworld / build.xml: 22: opozorilo:
'includeantruntime' ni bil nastavljen, privzeto za izdelavo.sysclasspath = zadnji; nastavljeno na false
za ponovljive gradnje
[javac] Prevajanje 1 izvorne datoteke v / Users / zak / _work / LearnBuildScripts / LearnANT /
helloworld / build / classes
kozarec:
[mkdir] Ustvarjen direktorij: / Users / zak / _work / LearnBuildScripts / LearnANT / helloworld / build / bin
[jar] Zgradba jar: / Users / zak / _work / LearnBuildScripts / LearnANT / helloworld / build / bin /
Pozdravljen, svet.kozarec
ZGRADI USPEŠNO
Skupni čas: 6 sekund
Datoteko jar lahko preizkusite tako:
$ java -cp build / bin / helloworld.kozarec helloworldPozdravljen, svet!
Določili smo datoteko jar, ki jo bomo shranili v mapo build / bin. Mape se ustvarijo med gradnjo. Ukaz ant jar pokliče tar jar v gradnji.xml.
Maven
Maven je bil razvit za reševanje težav, ki jih povzroča skriptiranje na osnovi Ant. Hranil je datoteke XML, vendar je imel drugačen pristop k organizaciji. V programu Ant morajo razvijalci ustvariti vse naloge. Maven zmanjša ustvarjanje nalog z izvajanjem močnejših standardov za organiziranje kode. Posledično je lažje začeti s standardnimi projekti.
Uvedel je tudi prenose odvisnosti, ki so olajšali razvoj. Pred uvedbo Ivy v Ant so morali uporabniki odvisnosti upravljati lokalno. Maven je najprej sprejel filozofijo upravljanja odvisnosti.
Vendar Mavensovi strogi standardi otežujejo pisanje skriptov za izdelavo po meri. Z orodjem je enostavno delati, če projekt sledi strogim standardom.
Prednosti
- Samodejni prenosi odvisnosti
- Vse odvisnosti se samodejno zabeležijo v nadzoru vira kot del Mavenovih skriptov
- Standardizira in poenostavi postopek izdelave
- Preprosto se integrira z IDE-ji in sistemi CI / CD
Slabosti
- Ni prilagodljiv pri ustvarjanju delovnih tokov po meri
- Novinci težko razumejo strmo učno krivuljo in postopek
- Zamudno reševanje težav z gradnjo in nove integracije knjižnic
- Ni dobro z več različicami iste odvisnosti
Primer Maven
Najnovejši Maven lahko prenesete od tukaj. Namestitev lahko preverite takole:
$ mvn - različicaApache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T00: 58: 13-07: 00)
Domača stran Maven: / Users / zak / BuildTools / Maven / apache-maven-3.5.2
Različica Java: 1.8.0_74, prodajalec: Oracle Corporation
Domača stran Java: / Library / Java / JavaVirtualMachines / jdk1.8.0_74.jdk / Vsebina / Domov / jre
Privzeti jezik: en_US, kodiranje platforme: UTF-8
Ime OS: "mac os x", različica: "10.11.6 ", lok:" x86_64 ", družina:" mac "
Ustvarite mapo helloworld in ustvarite projekt z naslednjim ukazom:
$ mvn arhetip: generiraj -DgroupId = com.ime podjetja.helloworld -DartifactId = helloworld-DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false
Ustvariti mora strukturo map in ustvariti rezultat, ki je videti takole:
[INFO] Iskanje projektov…[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Gradbeni projekt Maven Stub (brez POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin: 3.0.0: generiraj (privzeto-kli)> generiraj-vire
@ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:3.0.0:generate (default-cli) < generate-sources
@ samostojno-pom <<<
[INFO]
[INFO]
[INFO] --- maven-archetype-plugin: 3.0.0: generiraj (privzeto-cli) @ standalone-pom ---
[INFO] Ustvarjanje projekta v paketnem načinu
[INFO] ----------------------------------------------------------------------------
[INFO] Uporaba naslednjih parametrov za ustvarjanje projekta iz stare (1.x) Arhetip:
maven-arhetype-quickstart: 1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Vrednost: / Users / zak / _work / LearnBuildScripts / LearnMaven
[INFO] Parameter: paket, vrednost: com.ime podjetja.Pozdravljen, svet
[INFO] Parameter: groupId, vrednost: com.ime podjetja.Pozdravljen, svet
[INFO] Parameter: artifactId, vrednost: helloworld
[INFO] Parameter: packageName, vrednost: com.ime podjetja.Pozdravljen, svet
[INFO] Parameter: različica, vrednost: 1.0-SNAPSHOT
Projekt [INFO], ustvarjen iz Old (1.x) Arhetip v režiji: / Users / zak / _work /
LearnBuildScripts / LearnMaven / helloworld
[INFO] ------------------------------------------------------------------------
[INFO] ZGRADI USPEH
[INFO] ------------------------------------------------------------------------
[INFO] Skupni čas: 8.602 s
[INFO] Končano ob: 2018-01-27T00: 05: 37-08: 00
[INFO] Končni pomnilnik: 15M / 152M
[INFO] ------------------------------------------------------------------------
Struktura map bi morala izgledati tako:
Pozdravljen, svet| - pom.xml
'- src
| - glavni
| '- java
| '- com
| '-- ime podjetja
| '-- Pozdravljen, svet
| '- App.java
'- test
'- java
'- com
'-- ime podjetja
'-- Pozdravljen, svet
'- AppTest.java
Pom.xml vsebuje konfiguracije gradnje. Znotraj pom.xml koda izgleda takole:
_0.xsd ">
Datoteko jar lahko ustvarite z naslednjim ukazom:
$ mvn paket[INFO] Iskanje projektov…
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Zgradba helloworld 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin: 2.6: viri (privzeti viri) @ helloworld ---
[OPOZORILO] Uporaba kodiranja platforme (dejansko UTF-8) za kopiranje filtriranih virov, tj.e.
build je odvisen od platforme!
[INFO] preskoči neobstoječi resourceDirectory / Users / zak / _work / LearnBuildScripts / LearnMaven /
helloworld / src / main / resources
[INFO]
[INFO] --- maven-compiler-plugin: 3.1: prevajanje (privzeto-prevajanje) @ helloworld ---
[INFO] Zaznane spremembe - ponovno sestavljanje modula!
[OPOZORILO] Kodiranje datotek ni nastavljeno s pomočjo kodiranja platforme UTF-8, tj.e. build je
odvisno od platforme!
[INFO] Sestavljanje 1 izvorne datoteke v / Users / zak / _work / LearnBuildScripts / LearnMaven /
helloworld / target / classes
[INFO]
[INFO] --- maven-resources-plugin: 2.6: testResources (privzeto-testResources) @
Pozdravljen, svet ---
[OPOZORILO] Uporaba kodiranja platforme (dejansko UTF-8) za kopiranje filtriranih virov, tj.e.
build je odvisen od platforme!
[INFO] preskoči neobstoječi resourceDirectory / Users / zak / _work / LearnBuildScripts / LearnMaven /
helloworld / src / test / resources
[INFO]
[INFO] --- maven-compiler-plugin: 3.1: testCompile (privzeto-testCompile) @ helloworld ---
[INFO] Zaznane spremembe - ponovno sestavljanje modula!
[OPOZORILO] Kodiranje datotek ni nastavljeno s pomočjo kodiranja platforme UTF-8, tj.e. build je
odvisno od platforme!
[INFO] Prevajanje 1 izvorne datoteke v / Users / zak / _work / LearnBuildScripts / LearnMaven
/ helloworld / target / test-classes
[INFO]
[INFO] --- maven-surefire-plugin: 2.12.4: test (privzeti test) @ helloworld ---
[INFO] Imenik poročil Surefire: / Users / zak / _work / LearnBuildScripts / LearnMaven
/ helloworld / target /
zanesljiva poročila
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Teče com.ime podjetja.Pozdravljen, svet.AppTest
Izvedeni testi: 1, napake: 0, napake: 0, preskočeni: 0, pretečeni čas: 0.014 sek
Rezultati:
Izvedenih preskusov: 1, napak: 0, napak: 0, preskočenih: 0
[INFO]
[INFO] --- maven-jar-plugin: 2.4: jar (privzeti kozarec) @ helloworld ---
[INFO] Zgradba jar: / Users / zak / _work / LearnBuildScripts / LearnMaven / helloworld / target /
helloworld-1.0-SNAPSHOT.kozarec
[INFO] ------------------------------------------------------------------------
[INFO] ZGRADI USPEH
[INFO] ------------------------------------------------------------------------
[INFO] Skupni čas: 5.624 s
[INFO] Končano ob: 2018-01-27T00: 11: 10-08: 00
[INFO] Končni pomnilnik: 16M / 114M
[INFO] ------------------------------------------------------------------------
Datoteko jar lahko zaženete tako:
$ java -cp target / helloworld-1.0-SNAPSHOT.kozarec com.ime podjetja.Pozdravljen, svet.AppPozdravljen, svet!
Datoteka jar se shrani v ciljno mapo.
Gradle
Gradle združuje moč Ant in Maven. Prva različica Gradle je izšla leta 2012. Hitro je bilo sprejeto. Google ga trenutno uporablja za Android OS.
Namesto XML Gradle uporablja jezik Groovy. Posledično je gradbene skripte v Gradleu lažje pisati in brati. Sprva je uporabljal Ivy za upravljanje odvisnosti, zdaj pa uporablja svoj mehanizem odvisnosti.
Prednosti
- Zagotavlja standardizacijo in hkrati ostane prožen
- Enostavno branje in pisanje skriptov za gradnjo
- Bolje obvladati več različic odvisnosti
- Sposoben obvladati več programskih jezikov in tehnologij
- Aktivna skupnost, ki pomaga razvijati orodje
- Gradle DSL (Domain-Specific Language) omogoča preprosto konfiguracijsko strukturo
- Gradle omogoča izboljšanje zmogljivosti z uporabo postopoma, predpomnilnika gradnje in Gradle Daemon
Slabosti
- Integracija IDE ni tako dobra kot Maven
Primer Gradle
Gradle lahko namestite od tukaj. Ko na svoji poti nastavite Gradle, ga lahko preverite tako:
$ gradle --verzija------------------------------------------------------------
Gradle 4.5
------------------------------------------------------------
Čas izdelave: 2018-01-24 17:04:52 UTC
Revizija: 77d0ec90636f43669dc794ca17ef80dd65457bec
Groovy: 2.4.12
Ant: Apache Ant (TM) različica 1.9.9, sestavljeno 2. februarja 2017
JVM: 1.8.0_74 (Oracle Corporation 25.74-b02)
OS: Mac OS X 10.11.6 x86_64
Nato ustvarite naslednjo strukturo imenika:
Pozdravljen, svet| - graditi.gradle
'- src
| - glavni
'- java
'-- Pozdravljen, svet
'-- Pozdravljen, svet.java
Za helloworld.java je postavila kodo iz primera Ant. In za gradnjo.gradle vnesite naslednjo kodo:
uporabi vtičnik: 'java'version = '1.0 '
repozitoriji
mavenCentral ()
odvisnosti
testCompile group: 'junit', name: 'junit', version: '4.12 '
Za ogled vseh ukazov, ki so na voljo, lahko uporabite ukaz “gradle tasks -all”. Gradle samodejno prevzame vtičnike, ki ste jih določili v gradnji.gradle in vam pokaže dodatna opravila, ki so na voljo zaradi vtičnikov.
Zgradbo lahko dobite tako, da zaženete:
$ gradle kozarecZGRADI USPEŠNO v 1s
2 delujoči nalogi: 2 izvedeni
Svoj kozarec lahko zaženete tako:
$ java -cp build / libs / helloworld-1.0.kozarec helloworldPozdravljen, svet!
Datoteka jar se shrani v mapo build / libs.
Zaključek
Med orodji za gradnjo je Ant lahko koristen za manjše projekte, medtem ko je Maven boljši, če poskrbi, da vsi razvijalci upoštevajo ista pravila. Gradle je najnovejše orodje, ki zagotavlja največ prilagodljivosti.
Reference:
- http: // ant.apache.org /
- http: // ant.apache.org / bršljan /
- https: // maven.apache.org /
- https: // gradle.org /
- http: // makble.com / gradle-junit-helloworld-example
- https: // primeri.javacodegeeks.com / core-java / gradle / gradle-hello-world-tutorial /
- https: // gradle.org / maven-vs-gradle /
- https: // maven.apache.org / vodniki / začetek / maven-v-petih minutah.html
- https: // stackoverflow.com / questions / 20755437 / java-build-tools-ant-vs-maven
- https: // technologyconversations.com / 2014/06/18 / build-tools /
- https: // www.quora.com / Kaj-so-prednosti-in-slabosti-Maven-versus-Ant-kot-gradbena-orodja-za-Javo