Välja rätt byggverktyg: Ant vs Maven vs Gradle
Under mjukvaruutveckling måste utvecklare bygga om samma kod om och om igen. De försöker ofta använda bash-skript eller andra skriptspråk för att automatisera uppgiften. Det finns dock byggverktyg tillgängliga som är mer lämpliga för byggautomation. De dominerande byggverktygen är:
- Apache Ant med Ivy
- Maven
- Gradle
Låt oss undersöka verktygen för att ta reda på mer.
Apache Ant med Ivy
Apache Ant är ett Java-baserat kommandoradsverktyg som använder XML-filer för att definiera byggskript. Det används främst för Java-byggnader men det kan också användas för C / C ++ -utveckling. Inbyggda uppgifter ger sätt att sammanställa, montera, testa och köra programapplikationer. Användare kan också skapa sina egna "antlibs" för att förbättra funktionaliteten hos Ant. Apache Ivy är ett beroendeshanteringsverktyg som enkelt integreras med Ant för att ge ett mer robust ekosystem. Ant började utvecklas 2000.
Fördelar
- Bättre kontroll över den totala byggprocessen
- Flexibel nog att arbeta med alla arbetsprocesser
Nackdelar
- XML-baserade byggfiler kan bli stora och ohållbara
- Massor av tid och resurser är nödvändiga för att underhålla byggskripten
- IDE-integration är svår att uppnå
Ant with Ivy Exempel
Du kan installera den senaste Ant här. Du måste ladda ner zip, expandera och placera bin-mappen i din väg. Du kan använda följande kommando för att se om Ant är korrekt installerat:
$ ant -versionApache Ant (TM) version 1.10.1 sammanställd den 2 februari 2017
När du har installerat Ant kan du ladda ner den senaste Ivy-burken och lägga den i lib-mappen i Ant-katalogen.
När du har installerat Ant skapar du mappar helloworld och helloworld / src. Inuti src-mappen, sätt helloworld.java-fil med koden:
/ **************************Skriver ut "Hello World!"
*************************** /
public class helloworld
public static void main (String [] args)
Systemet.ut.println ("Hello World!");
Skapa nu en build i mappen helloworld.xml-fil med följande kod:
Och i samma helloworld-mapp, skapa murgrönan.xml-fil med följande kod:
Katalogstrukturen ska se ut så här:
Hej världen| - bygga.xml
| - murgröna.xml
'- src
'-- Hej världen.java
Nu kan du köra build med kommandot:
$ myra burkEn framgångsrik byggnad bör ge utdata så här:
$ myra burkBuildfile: / Users / zak / _work / LearnBuildScripts / LearnANT / helloworld / build.xml
lösa:
[murgröna: hämta] :: Apache Ivy 2.4.0 - 20141213170938 :: http: // ant.apache.org / ivy / ::
[murgröna: hämta] :: laddningsinställningar :: url = jar: fil: / Användare / zak / BuildTools / ANT / apache
-ant-1.10.1 / lib / ivy-2.4.0.burk!/ org / apache / ivy / core / settings / ivysettings.xml
[ivy: retrieve] :: lösa beroenden :: org.apache # helloworld; [e-postskyddad]
Macbook Air.lokal
[murgröna: hämta] confs: [standard]
[murgröna: hämta] hittade junit # junit; 4.12 offentligt
[ivy: retrieve] hittade org.hamcrest # hamcrest-core; 1.3 offentligt
[murgröna: hämta] :: upplösningsrapport :: lösa 397ms :: artefakter dl 15ms
---------------------------------------------------------------------
| | moduler || artefakter |
| conf | nummer | sök | dwnlded | utvisad || nummer | dwnlded |
---------------------------------------------------------------------
| standard | 2 | 0 | 0 | 0 || 4 | 0 |
---------------------------------------------------------------------
[murgröna: hämta] :: hämtning :: org.apache # helloworld
[murgröna: hämta] confs: [standard]
[ivy: retrieve] 0 artefakter kopierade, 4 redan hämtade (0kB / 39ms)
sammanställa:
[mkdir] Skapad dir: / Användare / zak / _work / LearnBuildScripts / LearnANT / helloworld / build /
klasser
[javac] / Användare / zak / _work / LearnBuildScripts / LearnANT / helloworld / build.xml: 22: varning:
'includeeantruntime' var inte inställt, som standard att bygga.sysclasspath = sista; satt till falskt
för repeterbara byggnader
[javac] Sammanställning av 1 källfil till / Användare / zak / _work / LearnBuildScripts / LearnANT /
helloworld / build / klasser
burk:
[mkdir] Skapad dir: / Användare / zak / _work / LearnBuildScripts / LearnANT / helloworld / build / bin
[jar] Building jar: / Användare / zak / _work / LearnBuildScripts / LearnANT / helloworld / build / bin /
Hej världen.burk
BYGG FRAMGÅNGT
Total tid: 6 sekunder
Du kan prova jar-filen så här:
$ java -cp build / bin / helloworld.burk helloworldHej världen!
Vi har definierat den jar-fil som ska läggas i mappen build / bin. Mapparna skapas under byggnaden. Ant jar-kommandot anropar jar-målet i byggnaden.xml.
Maven
Maven utvecklades för att lösa problemen med Ant-baserade skript. Det behöll XML-filerna men tog en annan inställning till organisationen. I Ant måste utvecklare skapa alla uppgifter. Maven minskar uppgiftsskapandet genom att implementera starkare standarder för att organisera kod. Som ett resultat är det lättare att komma igång med standardprojekt.
Det introducerade också nedladdningar av beroende som underlättade utvecklingen. Innan Ivy in Ant infördes, var användarna tvungna att hantera beroenden lokalt. Maven antog först beroendeshanteringsfilosofin.
Mavens strikta standarder gör det dock svårt att skriva anpassade build-skript. Verktyget är enkelt att arbeta med så länge som projektet följer de strikta standarderna.
Fördelar
- Automatiska nedladdningar av beroende
- Alla beroenden registreras automatiskt i källkontrollen som en del av Maven-skript
- Standardiserar och förenklar byggprocessen
- Integreras enkelt med IDE och CI / CD-system
Nackdelar
- Inte flexibelt för att skapa anpassade arbetsflöden
- Brant inlärningskurva och processen är svår för nybörjare att förstå
- Tidsödande för att lösa byggproblem och nya biblioteksintegrationer
- Inte bra med flera versioner av samma beroende
Maven Exempel
Du kan ladda ner den senaste Maven härifrån. Du kan kontrollera installationen så här:
$ mvn --versionApache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T00: 58: 13-07: 00)
Maven hem: / Användare / zak / BuildTools / Maven / apache-maven-3.5.2
Java-version: 1.8.0_74, leverantör: Oracle Corporation
Java-hem: / Library / Java / JavaVirtualMachines / jdk1.8.0_74.jdk / Innehåll / Hem / jre
Standardinställning: sv_US, plattformskodning: UTF-8
OS-namn: "mac os x", version: "10.11.6 ", arch:" x86_64 ", family:" mac "
Skapa en helloworld-mapp och skapa ett projekt med följande kommando:
$ mvn arketyp: generera -DroupId = com.Företagsnamn.helloworld -DartifactId = helloworld-DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false
Det ska skapa mappstrukturen och generera utdata som ser ut så här:
[INFO] Skannar efter projekt ..[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin: 3.0.0: generera (standard-cli)> generera-källor
@ fristående-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:3.0.0:generate (default-cli) < generate-sources
@ fristående-pom <<<
[INFO]
[INFO]
[INFO] --- maven-archetype-plugin: 3.0.0: generera (standard-cli) @ fristående-pom ---
[INFO] Genererar projekt i batch-läge
[INFO] ----------------------------------------------------------------------------
[INFO] Använd följande parametrar för att skapa projekt från Old (1.x) Arketyp:
maven-archetype-quickstart: 1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Värde: / Användare / zak / _work / LearnBuildScripts / LearnMaven
[INFO] Parameter: paket, Värde: com.Företagsnamn.Hej världen
[INFO] Parameter: groupId, Värde: com.Företagsnamn.Hej världen
[INFO] Parameter: artifactId, Värde: helloworld
[INFO] Parameter: packageName, Value: com.Företagsnamn.Hej världen
[INFO] Parameter: version, Värde: 1.0-STILLBILD
[INFO] -projekt skapat från Old (1.x) Arketyp i dir: / Användare / zak / _work /
LearnBuildScripts / LearnMaven / helloworld
[INFO] ------------------------------------------------------------------------
[INFO] BYGG FRAMGÅNG
[INFO] ------------------------------------------------------------------------
[INFO] Total tid: 8.602 s
[INFO] Avslutad: 2018-01-27T00: 05: 37-08: 00
[INFO] Slutligt minne: 15M / 152M
[INFO] ------------------------------------------------------------------------
Mappstrukturen ska se ut så här:
Hej världen| - pom.xml
'- src
| - huvud
| '- java
| '- com
| '-- Företagsnamn
| '-- Hej världen
| '-- App.java
'- test
'- java
'- com
'-- Företagsnamn
'-- Hej världen
'- AppTest.java
Pom.xml innehåller byggkonfigurationerna. Inuti pom.xml koden ser ut så här:
_0.xsd ">
Du kan skapa jar-filen med följande kommando:
$ mvn-paket[INFO] Skannar efter projekt ..
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Bygga helloworld 1.0-STILLBILD
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin: 2.6: resurser (standardresurser) @ helloworld ---
[VARNING] Använda plattformskodning (UTF-8 faktiskt) för att kopiera filtrerade resurser, dvs.e.
build är plattformberoende!
[INFO] hoppa över icke existerande resursDirectory / Användare / zak / _work / LearnBuildScripts / LearnMaven /
helloworld / src / main / resources
[INFO]
[INFO] --- maven-compiler-plugin: 3.1: kompilera (standardkompilera) @ helloworld ---
[INFO] Upptäckta ändringar - kompilera om modulen!
[VARNING] Filkodning har inte ställts in, med plattformskodning UTF-8, i.e. bygga är
plattformsberoende!
[INFO] Sammanställning av 1 källfil till / Användare / zak / _work / LearnBuildScripts / LearnMaven /
helloworld / mål / klasser
[INFO]
[INFO] --- maven-resources-plugin: 2.6: testResources (standard-testResources) @
Hej världen ---
[VARNING] Använda plattformskodning (UTF-8 faktiskt) för att kopiera filtrerade resurser, dvs.e.
build är plattformberoende!
[INFO] hoppa över icke existerande resursDirectory / Användare / zak / _work / LearnBuildScripts / LearnMaven /
helloworld / src / test / resurser
[INFO]
[INFO] --- maven-compiler-plugin: 3.1: testCompile (standard-testCompile) @ helloworld ---
[INFO] Upptäckta ändringar - kompilera om modulen!
[VARNING] Filkodning har inte ställts in, med plattformskodning UTF-8, i.e. bygga är
plattformsberoende!
[INFO] Sammanställning av en källfil till / Användare / zak / _work / LearnBuildScripts / LearnMaven
/ helloworld / target / test-klasser
[INFO]
[INFO] --- maven-surefire-plugin: 2.12.4: test (standardtest) @ helloworld ---
[INFO] Surefire-rapportkatalog: / Användare / zak / _work / LearnBuildScripts / LearnMaven
/ helloworld / target /
säkerhetsrapporter
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.Företagsnamn.Hej världen.AppTest
Testkörningar: 1, misslyckanden: 0, fel: 0, hoppade över: 0, förfluten tid: 0.014 sek
Resultat:
Testkörningar: 1, misslyckanden: 0, fel: 0, hoppade över: 0
[INFO]
[INFO] --- maven-jar-plugin: 2.4: jar (standard-jar) @ helloworld ---
[INFO] Byggkruka: / Användare / zak / _work / LearnBuildScripts / LearnMaven / helloworld / target /
helloworld-1.0-STILLBILD.burk
[INFO] ------------------------------------------------------------------------
[INFO] BYGG FRAMGÅNG
[INFO] ------------------------------------------------------------------------
[INFO] Total tid: 5.624 s
[INFO] Slutförd: 2018-01-27T00: 11: 10-08: 00
[INFO] Slutligt minne: 16M / 114M
[INFO] ------------------------------------------------------------------------
Du kan köra jar-filen så här:
$ java -cp target / helloworld-1.0-STILLBILD.jar com.Företagsnamn.Hej världen.AppHej världen!
Jar-filen läggs i målmappen.
Gradle
Gradle kombinerar kraften från Ant och Maven. Den första versionen av Gradle släpptes 2012. Det har sett snabb adoption. Google använder det för närvarande för Android OS.
Istället för XML använder Gradle språket Groovy. Som ett resultat är byggskript i Gradle lättare att skriva och läsa. Den använde ursprungligen Ivy för beroendeshantering, men den använder sin egen beroendemotor nu.
Fördelar
- Ger standardisering samtidigt som den förblir flexibel
- Lätt att läsa och skriva bygga manus
- Bättre att hantera flera versioner av beroenden
- Kunna hantera flera programmeringsspråk och tekniker
- Aktiv gemenskap som hjälper till att utveckla verktyget
- Gradle DSL (Domain-Specific Language) gör det enkelt att konfigurera strukturen
- Gradle erbjuder prestandaförbättringar med hjälp av stegvis bygga cache och Gradle Daemon
Nackdelar
- IDE-integration är inte lika bra som Maven
Gradle Exempel
Du kan installera Gradle härifrån. När du har ställt in Gradle i din väg kan du kontrollera det genom att:
$ gradle --version------------------------------------------------------------
Grad 4.5
------------------------------------------------------------
Byggtid: 2018-01-24 17:04:52 UTC
Revision: 77d0ec90636f43669dc794ca17ef80dd65457bec
Groovy: 2.4.12
Ant: Apache Ant (TM) version 1.9.9 sammanställd den 2 februari 2017
JVM: 1.8.0_74 (Oracle Corporation 25.74-b02)
OS: Mac OS X 10.11.6 x86_64
Skapa sedan följande katalogstruktur:
Hej världen| - bygga.gradle
'- src
| - huvud
'- java
'-- Hej världen
'-- Hej världen.java
För helvärlden.java sätta koden från Ant-exemplet. Och för byggnad.gradle sätt i följande kod:
tillämpa plugin: 'java'version = '1.0 '
arkiv
mavenCentral ()
beroenden
testCompile-grupp: 'junit', namn: 'junit', version: '4.12 '
Du kan använda kommandot “gradle Tasks -all” för att titta på alla tillgängliga kommandon. Gradle plockar automatiskt upp de plugins du anger i byggnaden.gradle-fil och visar de extra uppgifter som finns tillgängliga på grund av plugins.
Du kan få build genom att köra:
$ gradle burkBYGG FRAMGÅNG på 1s
2 åtgärdbara uppgifter: 2 utförda
Du kan köra din burk så här:
$ java -cp build / libs / helloworld-1.0.burk helloworldHej världen!
Jar-filen läggs i mappen build / libs.
Slutsats
Bland byggverktygen kan Ant vara användbart för mindre projekt medan Maven är bättre för att se till att alla utvecklare följer samma regler. Gradle är det senaste verktyget som ger mest flexibilitet.
Referenser:
- http: // ant.apache.org /
- http: // ant.apache.org / murgröna /
- https: // maven.apache.org /
- https: // gradle.org /
- http: // makble.com / gradle-junit-helloworld-exempel
- https: // exempel.javacodegeeks.com / core-java / gradle / gradle-hello-world-tutorial /
- https: // gradle.org / maven-vs-gradle /
- https: // maven.apache.org / guider / komma igång / maven-in-five-minutes.html
- https: // stackoverflow.com / frågor / 20755437 / java-build-tools-ant-vs-maven
- https: // teknologikonversationer.com / 2014/06/18 / byggverktyg /
- https: // www.quora.com / Vad-är-för-och-nackdelar-med-Maven-kontra-Ant-som-bygg-verktyg-för-Java