Scegliere lo strumento di build giusto: Ant vs Maven vs Gradle
Durante lo sviluppo del software, gli sviluppatori devono ricostruire lo stesso codice più e più volte. Spesso cercano di usare script bash o altri linguaggi di scripting per automatizzare l'attività. Tuttavia, ci sono strumenti di build disponibili più appropriati per l'automazione della costruzione. Gli strumenti di build predominanti sono:
- Apache Ant con Ivy
- Esperto di
- Gradle
Investiamo gli strumenti per saperne di più.
Apache Ant con Ivy
Apache Ant è uno strumento di riga di comando basato su Java che utilizza i file XML per definire gli script build. È prevalentemente usato per le build Java ma può essere utilizzato anche per lo sviluppo di C/C ++. Le attività integrate forniscono modi per compilare, assemblare, testare ed eseguire applicazioni software. Gli utenti possono anche creare le proprie "antlib" per migliorare la funzionalità di Ant. Apache Ivy è uno strumento di gestione delle dipendenze che si integra facilmente con ANT per fornire un ecosistema più robusto. Lo sviluppo di Ant è iniziato nel 2000.
Professionisti
- Migliore controllo sul processo di build complessivo
- Abbastanza flessibile da lavorare con qualsiasi processo di lavoro
Contro
- I file di build basati su XML possono diventare grandi e impigliabili
- Molto tempo e risorse sono necessari per mantenere gli script di costruzione
- L'integrazione IDE è difficile da raggiungere
Formica con edera esempio
Puoi installare l'ultima formica da qui. Devi scaricare la zip, espandere e mettere la cartella del bidone sul tuo percorso. È possibile utilizzare il seguente comando per vedere se l'ant è installata correttamente:
$ ant -version
Apache Ant (TM) versione 1.10.1 compilato il 2 febbraio 2017
Una volta installato Ant, puoi scaricare l'ultimo vaso Ivy e inserirlo nella cartella LIB all'interno della directory di Ant.
Dopo aver installato Ant, crea cartelle Helloworld e Helloworld/SRC. All'interno della cartella SRC, metti Helloworld.file java con il codice:
/**************************
Stampa "Ciao mondo!"
***************************/
Classe pubblica HelloWorld
public static void main (string [] args)
Sistema.fuori.println ("Hello World!");
Ora nella cartella Helloworld crea una build.File XML con il seguente codice:
E nella stessa cartella Helloworld, crea l'edera.File XML con il seguente codice:
La struttura della directory dovrebbe apparire così:
Ciao mondo
|- Build.XML
|- Ivy.XML
'- src
'-- Ciao mondo.Giava
Ora puoi eseguire la build con il comando:
Jar barattolo da $ ant
Una build di successo dovrebbe fornire output come questo:
Jar barattolo da $ ant
Buildfile:/utenti/zak/_work/learnbuildscripts/apprendente/eroworld/build.XML
risolvere:
[Ivy: Recupera] :: Apache Ivy 2.4.0 - 20141213170938 :: http: // ant.Apache.org/ ivy/ ::
[Ivy: Recupera] :: Impostazioni di caricamento :: url = jar: file:/utenti/zak/buildtools/ant/apache
-Ant-1.10.1/lib/Ivy-2.4.0.vaso!/org/apache/edey/core/impostazioni/ivysettings.XML
[Ivy: Recupera] :: Risoluzione Dipendenze :: Org.Apache#Helloworld; Working@Zakirs-
MacBook-Air.Locale
[Ivy: Recupera] Confs: [Default]
[Ivy: Recove] trovato Junit#Junit; 4.12 in pubblico
[Ivy: Recupera] trovata org.Hamcrest#Hamcrest-core; 1.3 in pubblico
[Ivy: Recupera] :: Risoluzione della risoluzione :: Resolve 397MS :: Artifacts DL 15ms
---------------------------------------------------------------------
| | moduli || artifatti |
| conf | numero | Cerca | dwnlded | sfratto || Numero | Dwnlded |
---------------------------------------------------------------------
| Predefinito | 2 | 0 | 0 | 0 || 4 | 0 |
---------------------------------------------------------------------
[Ivy: recupero] :: recupero :: org.Apache#Helloworld
[Ivy: Recupera] Confs: [Default]
[Ivy: recupero] 0 artefatti copiati, 4 già recuperati (0kb/39ms)
compilare:
[mkdir] ha creato dir:/utenti/zak/_work/learnbuildscripts/apprendimento/elhoworld/build/
classi
[Javac]/Users/Zak/_Work/LearnBuildScripts/Learnant/Helloworld/Build.XML: 22: AVVERTENZA:
'IncludeanTruntime "non era impostato, inadempiente alla costruzione.sysclasspath = ultimo; Impostare su False
per build ripetibili
[javac] compilando 1 file di origine a/utenti/zak/_work/apprendimentoScript/apprendente/
Helloworld/Build/Classes
vaso:
[mkdir] ha creato dir:/utenti/zak/_work/learnbuildscripts/apprendente/elhoworld/build/bin
[Jar] Building Jar:/Users/Zak/_Work/LearnBuildScripts/Learnant/Helloworld/Build/Bin/Bin/
Ciao mondo.vaso
Costruisci successo
Tempo totale: 6 secondi
Puoi provare il file jar in questo modo:
$ java -cp build/bin/helloworld.Jar Helloworld
Ciao mondo!
Abbiamo definito il file jar da inserire nella cartella build/bin. Le cartelle vengono create durante la build. Il comando del barattolo di Ant chiama il bersaglio del barattolo nella build.XML.
Esperto di
Maven è stato sviluppato per risolvere i problemi affrontati dagli script basati su ANT. Ha mantenuto i file XML ma ha adottato un approccio diverso all'organizzazione. In Ant, gli sviluppatori devono creare tutte le attività. Maven riduce la creazione di attività implementando standard più forti per l'organizzazione del codice. Di conseguenza, è più facile iniziare con progetti standard.
Ha anche introdotto download di dipendenze che hanno reso più semplice lo sviluppo. Prima dell'introduzione di Ivy in Ant, gli utenti dovevano gestire le dipendenze a livello locale. Maven ha adottato prima la filosofia di gestione delle dipendenze.
Tuttavia, gli standard rigorosi di Mavens rendono difficile scrivere script di build personalizzati. Lo strumento è facile da lavorare fintanto che il progetto segue gli standard rigorosi.
Professionisti
- Download di dipendenza automatica
- Tutte le dipendenze vengono registrate automaticamente nel controllo della fonte come parte degli script Maven
- Standardizza e semplifica il processo di build
- Si integra facilmente con IDE e sistemi CI/CD
Contro
- Non flessibile nella creazione di flussi di lavoro personalizzati
- Ripida curva di apprendimento e il processo è difficile da capire per i principianti
- Che richiede tempo per risolvere problemi di costruzione e nuove integrazioni di biblioteca
- Non va bene con più versioni della stessa dipendenza
Esempio Maven
Puoi scaricare l'ultimo Maven da qui. Puoi controllare l'installazione in questo modo:
$ MVN -Version
Apache Maven 3.5.2 (138EDD61FD100EC658BFA2D307C43B76940A5D7D; 2017-10-18T00: 58: 13-07: 00)
Maven Home:/Users/Zak/BuildTools/Maven/Apache-Maven-3.5.2
Versione java: 1.8.0_74, venditore: Oracle Corporation
Java Home:/Library/Java/Javavirtualmachines/JDK1.8.0_74.JDK/Contenuto/Home/JRE
Locono predefinito: EN_US, codifica della piattaforma: UTF-8
Nome del sistema operativo: "Mac OS X", versione: "10.11.6 ", arco:" x86_64 ", famiglia:" Mac "
Crea una cartella Helloworld e genera un progetto con il seguente comando:
$ MVN Archetipo: Genera -dGroupid = com.Nome della ditta.HelloWorld -DartifactId = HelloWorld
-DarcheTypeECheAfactId = maven-archetype-quickstart -dinteractiveMode = false
Dovrebbe creare la struttura delle cartelle e generare l'output che assomiglia a questo:
[Info] Scansione per i progetti ..
[INFORMAZIONI]
[INFORMAZIONI] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (no POM) 1
[INFORMAZIONI] ------------------------------------------------------------------------
[INFORMAZIONI]
[Info] >>> maven-archetype-plugin: 3.0.0: genera (default-cli)> genera-sources
@ Standalone-Pom >>>
[INFORMAZIONI]
[INFORMAZIONI] <<< maven-archetype-plugin:3.0.0:generate (default-cli) < generate-sources
@ Standalone-Pom <<<
[INFORMAZIONI]
[INFORMAZIONI]
[Info] --- Maven-archetype-plugin: 3.0.0: Genera (Default-Cli) @ Standalone-Pom ---
[Info] Generazione del progetto in modalità batch
[INFORMAZIONI] ----------------------------------------------------------------------------
[Info] Utilizzo dei seguenti parametri per la creazione di un progetto da vecchio (1.x) Archetipo:
Maven-Archetype-Quickstart: 1.0
[INFORMAZIONI] ----------------------------------------------------------------------------
[Info] Parametro: Basator, Valore:/Users/Zak/_Work/LearnBuildScripts/LearnMaven
[Info] parametro: pacchetto, valore: com.Nome della ditta.Ciao mondo
[Info] parametro: groupid, valore: com.Nome della ditta.Ciao mondo
[Info] parametro: artifactid, valore: helloworld
[Info] parametro: packagename, valore: com.Nome della ditta.Ciao mondo
[Info] parametro: versione, valore: 1.0-snapshot
[Info] progetto creato da vecchio (1.x) Archetipo in Dir:/Users/Zak/_Work/
LearnBuildScripts/LearnMaven/Helloworld
[INFORMAZIONI] ------------------------------------------------------------------------
[Info] Costruisci il successo
[INFORMAZIONI] ------------------------------------------------------------------------
[INFO] Tempo totale: 8.602 s
[INFO] Finito a: 2018-01-27T00: 05: 37-08: 00
[Info] Memoria finale: 15m/152m
[INFORMAZIONI] ------------------------------------------------------------------------
La struttura delle cartelle dovrebbe apparire così:
Ciao mondo
|- pom.XML
'- src
|- Main
| '- Java
| '- com
| '-- Nome della ditta
| '-- Ciao mondo
| '- App.Giava
'-- test
'- Java
'- com
'-- Nome della ditta
'-- Ciao mondo
'- Apptest.Giava
Il pom.XML contiene le configurazioni di build. All'interno del pom.XML Il codice sembra questo:
XSI: schemalocation = "http: // maven.Apache.org/pom/4.0.0 http: // maven.Apache.org/maven-v4_0
_0.XSD ">
4.0.0
com.Nome della ditta.Ciao mondo
Ciao mondo
vaso
1.0-snapshot
Ciao mondo
http: // maven.Apache.org
Junit
Junit
3.8.1
test
È possibile generare il file jar usando il seguente comando:
Pacchetto $ MVN
[Info] Scansione per i progetti ..
[INFORMAZIONI]
[INFORMAZIONI] ------------------------------------------------------------------------
[Info] Building Helloworld 1.0-snapshot
[INFORMAZIONI] ------------------------------------------------------------------------
[INFORMAZIONI]
[Info] --- Maven-Resources-Plugin: 2.6: Risorse (predefinite-risorse) @ helloworld ---
[ATTENZIONE] Utilizzo della codifica della piattaforma (UTF-8 in realtà) per copiare le risorse filtrate, i.e.
build dipende dalla piattaforma!
[INFO] Skip non esistente Resourcedirectory/Users/Zak/_Work/LearnBuildScripts/LearnMaven/
Helloworld/Src/Main/Resources
[INFORMAZIONI]
[INFO] --- Maven-Compiler-Plugin: 3.1: Compile (Default-Concile) @ Helloworld ---
[Info] Modifiche rilevate - Ricompilando il modulo!
[Avviso] La codifica dei file non è stata impostata, utilizzando la codifica della piattaforma UTF-8, i.e. La costruzione è
Piattaforma dipendente!
[INFO] Compilazione 1 File di origine a/Users/Zak/_Work/LearnBuildScripts/LearnMaven/
Helloworld/Target/Classes
[INFORMAZIONI]
[Info] --- Maven-Resources-Plugin: 2.6: TestResources (default-testresources) @
Ciao mondo ---
[ATTENZIONE] Utilizzo della codifica della piattaforma (UTF-8 in realtà) per copiare le risorse filtrate, i.e.
build dipende dalla piattaforma!
[INFO] Skip non esistente Resourcedirectory/Users/Zak/_Work/LearnBuildScripts/LearnMaven/
Helloworld/Src/Test/Resources
[INFORMAZIONI]
[INFO] --- Maven-Compiler-Plugin: 3.1: TestCompile (Default-TestCompile) @ Helloworld ---
[Info] Modifiche rilevate - Ricompilando il modulo!
[Avviso] La codifica dei file non è stata impostata, utilizzando la codifica della piattaforma UTF-8, i.e. La costruzione è
Piattaforma dipendente!
[INFO] Compilazione 1 File di origine a/Users/Zak/_Work/LearnBuildScripts/LearnMaven
/Helloworld/Target/Test-Classe
[INFORMAZIONI]
[INFO] --- Maven-Surefire-Plugin: 2.12.4: test (test predefinito) @ helloworld ---
;
/helloworld/target/
Rapporti infallibili
-------------------------------------------------------
T e s t s
-------------------------------------------------------
In esecuzione com.Nome della ditta.Ciao mondo.Aptest
Test Esegui: 1, Failuti: 0, Errori: 0, Skiped: 0, Time Exed: 0.014 sec
Risultati:
Test Esegui: 1, Failuti: 0, Errori: 0, Skippured: 0
[INFORMAZIONI]
[Info] --- Maven-jar-plugin: 2.4: Jar (Default-Jar) @ Helloworld ---
[Info] Costruire Jar:/Users/Zak/_Work/LearnBuildScripts/LearnMaven/Helloworld/Target/
Helloworld-1.0-snapshot.vaso
[INFORMAZIONI] ------------------------------------------------------------------------
[Info] Costruisci il successo
[INFORMAZIONI] ------------------------------------------------------------------------
[INFO] Tempo totale: 5.624 s
[Info] Finito a: 2018-01-27T00: 11: 10-08: 00
[Info] Memoria finale: 16m/114m
[INFORMAZIONI] ------------------------------------------------------------------------
Puoi eseguire il file jar in questo modo:
$ java -CP Target/Helloworld -1.0-snapshot.Jar com.Nome della ditta.Ciao mondo.App
Ciao mondo!
Il file jar viene inserito nella cartella target.
Gradle
Gradle combina il potere di Ant e Maven. La prima versione di Gradle è stata rilasciata nel 2012. Ha visto una rapida adozione. Google lo sta attualmente utilizzando per Android OS.
Invece di XML, Gradle usa il linguaggio groovy. Di conseguenza, la costruzione di script a Gradle è più facile da scrivere e leggere. Inizialmente utilizzava Ivy per la gestione delle dipendenze, ma ora sta usando il proprio motore di dipendenza.
Professionisti
- Fornisce standardizzazione rimanendo flessibile
- Facile da leggere e scrivere Script Build
- Meglio nel gestire più versioni di dipendenze
- In grado di gestire più linguaggi di programmazione e tecnologie
- Community attiva che aiuta a sviluppare lo strumento
- Gradle DSL (linguaggio specifico del dominio) lo rende una semplice struttura di configurazione
- Gradle fornisce miglioramenti delle prestazioni utilizzando in modo incrementale, build cache e il demone gradle
Contro
- IDE Integrazione non è buona come Maven
Esempio gradle
Puoi installare Gradle da qui. Una volta impostato Gradle nel tuo percorso, puoi controllarlo da:
$ gradle -version
------------------------------------------------------------
Gradle 4.5
------------------------------------------------------------
Tempo di costruzione: 2018-01-24 17:04:52 UTC
Revisione: 77D0EC90636F43669DC794CA17EF80DD65457BEC
Groovy: 2.4.12
Ant: Apache Ant (TM) versione 1.9.9 Compilato il 2 febbraio 2017
JVM: 1.8.0_74 (Oracle Corporation 25.74-B02)
OS: Mac OS X 10.11.6 x86_64
Quindi, crea la seguente struttura di directory:
Ciao mondo
|- Build.Gradle
'- src
|- Main
'- Java
'-- Ciao mondo
'-- Ciao mondo.Giava
Per l'inoleo.Java ha messo il codice dall'esempio di Ant. E per la costruzione.Gradle ha inserito il seguente codice:
Applica Plugin: "Java"
versione = '1.0 '
repository
mavencentral ()
dipendenze
Gruppo TestCompile: "Junit", Nome: "Junit", versione: "4.12 '
È possibile utilizzare il comando "Gradle Tasks -all" per guardare tutti i comandi disponibili. Gradle raccoglie automaticamente i plugin specificati nella build.File gradle e mostra le attività extra disponibili a causa dei plugin.
Puoi ottenere la build eseguendo:
$ gradle jar
Costruisci successo in 1s
2 Attività fruibili: 2 eseguite
Puoi eseguire il tuo barattolo in questo modo:
$ java -cp build/libs/helloworld -1.0.Jar Helloworld
Ciao mondo!
Il file jar viene inserito nella cartella build/libs.
Conclusione
Tra gli strumenti di build, Ant può essere utile per progetti più piccoli mentre Maven è meglio per assicurarsi che tutti gli sviluppatori seguano le stesse regole. Gradle è lo strumento più recente che fornisce la massima flessibilità.
Riferimenti:
- http: // ant.Apache.org/
- http: // ant.Apache.org/ivy/
- https: // maven.Apache.org/
- https: // gradle.org/
- http: // makble.com/gradle-junit-Helloworld-Example
- https: // esempi.Javacodegeeks.com/core-java/gradle/gradle-hello-world-tutorial/
- https: // gradle.org/maven-vs-gradle/
- https: // maven.Apache.Org/Guide/Ottieni avviato/Maven-in-Five-Minutes.html
- https: // stackoverflow.com/Domande/20755437/Java-Build-Tools-Vs-Maven
- https: // tecnologyconversations.com/2014/06/18/build-tools/
- https: // www.Quora.com/what-are-the-pros-and-to-maven-ven-contro-ant-come-building-tools-for-java