Scegliere lo strumento di costruzione 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 utilizzare script bash o altri linguaggi di scripting per automatizzare l'attività. Tuttavia, sono disponibili strumenti di compilazione più appropriati per l'automazione della compilazione. Gli strumenti di costruzione predominanti sono:
- Formica Apache con Ivy
- Esperto di
- Gradle
Indaghiamo gli strumenti per saperne di più.
Formica Apache con Ivy
Apache Ant è uno strumento da riga di comando basato su Java che utilizza file XML per definire script di compilazione build. Viene utilizzato principalmente per le build Java, ma può essere utilizzato anche per lo sviluppo C/C++. Le attività integrate forniscono modi per compilare, assemblare, testare ed eseguire applicazioni software. Gli utenti possono anche creare i propri "antilibs" 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 sull'intero processo di costruzione
- Abbastanza flessibile per lavorare con qualsiasi processo di lavoro
Contro
- I file di build basati su XML possono diventare grandi e non mantenibili
- Sono necessari molto tempo e risorse per mantenere gli script di build
- L'integrazione IDE è difficile da raggiungere
Formica con Ivy Esempio
Puoi installare l'ultima Ant da qui. Devi scaricare lo zip, espandere e inserire la cartella bin nel tuo percorso. Puoi usare il seguente comando per vedere se Ant è installato correttamente:
$ ant -versionApache Ant(TM) versione 1.10.1 compilato il 2 febbraio 2017
Una volta installato Ant, puoi scaricare l'ultimo jar Ivy e metterlo nella cartella lib all'interno della directory Ant Ant.
Dopo aver installato Ant, crea le cartelle helloworld e helloworld/src. All'interno della cartella src, metti helloworld.java con il codice:
/*************************Stampa "Hello World!"
*************************/
classe pubblica ciaomondo
public static void main(String[] args)
Sistema.su.println("Ciao mondo!");
Ora nella cartella helloworld crea una build.xml con il seguente codice:
E nella stessa cartella Helloworld, crea l'edera.xml con il seguente codice:
La struttura della directory dovrebbe assomigliare a questa:
Ciao mondo|-- build.xml
|-- edera.xml
'-- src
'-- Ciao mondo.Giava
Ora puoi eseguire la build con il comando:
barattolo di $ formicaUna build di successo dovrebbe fornire un output come questo:
barattolo di $ formicaBuildfile: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build.xml
risolvere:
[ivy:recuperare] :: Apache Ivy 2.4.0 - 20141213170938 :: http://ant.apache.org/ivy/ ::
[ivy:retrieve] :: impostazioni di caricamento :: url = jar:file:/Users/zak/BuildTools/ANT/apache
-ant-1.10.1/lib/ivy-2.4.0.vaso!/org/apache/ivy/core/settings/ivysettings.xml
[ivy:recupero] :: risoluzione delle dipendenze :: org.apache#helloworld;[email protected]
MacBook Air.Locale
[ivy:recupera] confs: [predefinito]
[ivy:retrieve] trovato junit#junit;4.12 in pubblico
[ivy:retrieve] trovato org.hamcrest#hamcrest-core;1.3 in pubblico
[ivy:recupero] :: rapporto risoluzione :: risoluzione 397 ms :: artefatti dl 15 ms
---------------------------------------------------------------------
| | moduli || artefatti |
| conf | numero| cerca|dwnlded|sfrattato|| numero|dwnlded|
---------------------------------------------------------------------
| predefinito | 2 | 0 | 0 | 0 || 4 | 0 |
---------------------------------------------------------------------
[ivy:recupero] :: recupero :: org.apache#helloworld
[ivy:recupera] confs: [predefinito]
[ivy:retrieve] 0 artefatti copiati, 4 già recuperati (0kB/39ms)
compilare:
[mkdir] Dir creata: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/
classi
[javac] /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build.xml:22: avviso:
'includeantruntime' non è stato impostato, per impostazione predefinita è build.sysclasspath=ultimo; impostato su falso
per build ripetibili
[javac] Compilazione di 1 file sorgente in /Users/zak/_work/LearnBuildScripts/LearnANT/
ciaomondo/costruisci/classi
vaso:
[mkdir] Dir creata: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/bin
[jar] Vaso di costruzione: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/bin/
Ciao mondo.vaso
COSTRUISCI CON SUCCESSO
Tempo totale: 6 secondi
Puoi provare il file jar in questo modo:
$ java -cp build/bin/helloworld.vaso ciaomondoCiao mondo!
Abbiamo definito il file jar da inserire nella cartella build/bin. Le cartelle vengono create durante la build. Il comando ant jar chiama il target jar nella build.xml.
Esperto di
Maven è stato sviluppato per risolvere i problemi affrontati con lo scripting basato 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ù rigorosi per l'organizzazione del codice. Di conseguenza, è più facile iniziare con progetti standard.
Ha anche introdotto i download delle dipendenze che hanno reso più facile lo sviluppo. Prima dell'introduzione di Ivy in Ant, gli utenti dovevano gestire le dipendenze localmente. 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 usare purché il progetto segua gli standard rigorosi.
Professionisti
- Download automatici delle dipendenze
- Tutte le dipendenze vengono registrate automaticamente nel controllo del codice sorgente come parte degli script Maven
- Standardizza e semplifica il processo di costruzione
- Si integra facilmente con IDE e sistemi CI/CD
Contro
- Non flessibile nella creazione di flussi di lavoro personalizzati
- Curva di apprendimento ripida e il processo è difficile da capire per i principianti
- Richiede tempo per risolvere problemi di compilazione e nuove integrazioni di librerie
- Non va bene con più versioni della stessa dipendenza
Esempio di Maven
Puoi scaricare l'ultima versione di Maven da qui. Puoi controllare l'installazione in questo modo:
$ mvn --versionApache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T00:58:13-07:00)
Pagina iniziale di Maven: /Utenti/zak/BuildTools/Maven/apache-maven-3.5.2
Versione Java: 1.8.0_74, fornitore: Oracle Corporation
Home Java: /Libreria/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contenuto/Home/jre
Locale predefinito: en_US, codifica 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.ciaomondo -DartifactId=ciaomondo-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Dovrebbe creare la struttura delle cartelle e generare l'output simile a questo:
[INFO] Ricerca progetti..[INFORMAZIONI]
[INFORMAZIONI] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (senza POM) 1
[INFORMAZIONI] ------------------------------------------------------------------------
[INFORMAZIONI]
[INFO] >>> plug-in archetipo maven:3.0.0:generate (default-cli) > generate-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:generate (default-cli) @ standalone-pom ---
[INFO] Generazione progetto in modalità batch
[INFORMAZIONI] ----------------------------------------------------------------------------
[INFO] Utilizzo dei seguenti parametri per creare un progetto da Old (1.x) Archetipo:
maven-archetype-quickstart:1.0
[INFORMAZIONI] ----------------------------------------------------------------------------
[INFO] Parametro: basedir, 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: ID artefatto, Valore: helloworld
[INFO] Parametro: nomepacchetto, valore: com.Nome della ditta.Ciao mondo
[INFO] Parametro: versione, Valore: 1.0-SNAPSHOT
[INFO] progetto creato da Old (1.x) Archetipo nella directory: /Users/zak/_work/
LearnBuildScripts/LearnMaven/helloworld
[INFORMAZIONI] ------------------------------------------------------------------------
[INFO] COSTRUISCI SUCCESSO
[INFORMAZIONI] ------------------------------------------------------------------------
[INFO] Tempo totale: 8.602 secondi
[INFO] Finito il: 2018-01-27T00:05:37-08:00
[INFO] Memoria finale: 15M/152M
[INFORMAZIONI] ------------------------------------------------------------------------
La struttura delle cartelle dovrebbe assomigliare a questa:
Ciao mondo|-- pom.xml
'-- src
|-- principale
| '-- java
| '--com
| '-- Nome della ditta
| '-- Ciao mondo
| '-- App.Giava
'-- prova
'-- java
'--com
'-- Nome della ditta
'-- Ciao mondo
'-- AppTest.Giava
il pom.xml contiene le configurazioni di build. All'interno del pom.xml il codice è simile a questo:
_0.xsd">
Puoi generare il file jar usando il seguente comando:
$ pacchetto mvn[INFO] Ricerca progetti..
[INFORMAZIONI]
[INFORMAZIONI] ------------------------------------------------------------------------
[INFO] Costruire Helloworld 1.0-SNAPSHOT
[INFORMAZIONI] ------------------------------------------------------------------------
[INFORMAZIONI]
[INFO] --- maven-resources-plugin:2.6:risorse (risorse predefinite) @ helloworld ---
[ATTENZIONE] Utilizzo della codifica della piattaforma (in realtà UTF-8) per copiare le risorse filtrate, i.e.
la build dipende dalla piattaforma!
[INFO] salta la directory di risorse non esistente /Users/zak/_work/LearnBuildScripts/LearnMaven/
ciaomondo/src/main/resources
[INFORMAZIONI]
[INFO] --- maven-compilatore-plugin:3.1: compila (compilazione predefinita) @ helloworld ---
[INFO] Modifiche rilevate - ricompilazione del modulo!
[AVVERTENZA] La codifica del file non è stata impostata, utilizzando la codifica della piattaforma UTF-8, i.e. costruire è
dipendente dalla piattaforma!
[INFO] Compilazione di 1 file sorgente in /Users/zak/_work/LearnBuildScripts/LearnMaven/
ciaomondo/target/classi
[INFORMAZIONI]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @
Ciao mondo ---
[ATTENZIONE] Utilizzo della codifica della piattaforma (in realtà UTF-8) per copiare le risorse filtrate, i.e.
la build dipende dalla piattaforma!
[INFO] salta la directory di risorse non esistenti /Users/zak/_work/LearnBuildScripts/LearnMaven/
ciaomondo/src/test/resources
[INFORMAZIONI]
[INFO] --- maven-compilatore-plugin:3.1:testCompile (default-testCompile) @ helloworld ---
[INFO] Modifiche rilevate - ricompilazione del modulo!
[AVVERTENZA] La codifica del file non è stata impostata, utilizzando la codifica della piattaforma UTF-8, i.e. costruire è
dipendente dalla piattaforma!
[INFO] Compilazione di 1 file sorgente in /Users/zak/_work/LearnBuildScripts/LearnMaven
/helloworld/target/classi-di-prova
[INFORMAZIONI]
[INFO] --- plug-in maven-surefire:2.12.4:test (test predefinito) @ helloworld ---
[INFO] Directory dei rapporti Surefire: /Users/zak/_work/LearnBuildScripts/LearnMaven
/ciaomondo/target/
rapporti sicuri
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Correre come.Nome della ditta.Ciao mondo.AppTest
Test eseguiti: 1, Errori: 0, Errori: 0, Salti: 0, Tempo trascorso: 0.014 sec
Risultati:
Test eseguiti: 1, Errori: 0, Errori: 0, Salti: 0
[INFORMAZIONI]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ helloworld ---
[INFO] Vaso di costruzione: /Users/zak/_work/LearnBuildScripts/LearnMaven/helloworld/target/
ciaomondo-1.0-SNAPSHOT.vaso
[INFORMAZIONI] ------------------------------------------------------------------------
[INFO] COSTRUISCI SUCCESSO
[INFORMAZIONI] ------------------------------------------------------------------------
[INFO] Tempo totale: 5.624 secondi
[INFO] Finito il: 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.vaso come.Nome della ditta.Ciao mondo.AppCiao mondo!
Il file jar viene messo nella cartella di destinazione.
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 il sistema operativo Android.
Invece di XML, Gradle usa il linguaggio Groovy. Di conseguenza, gli script di compilazione in Gradle sono più facili da scrivere e leggere. Inizialmente utilizzava Ivy per la gestione delle dipendenze, ma ora utilizza il proprio motore di dipendenza.
Professionisti
- Fornisce standardizzazione pur rimanendo flessibile
- Script di compilazione facili da leggere e scrivere
- Migliore nella gestione di più versioni di dipendenze
- In grado di gestire più linguaggi e tecnologie di programmazione
- Comunità attiva che aiuta a sviluppare lo strumento
- Gradle DSL (Domain-Specific Language) semplifica la struttura di configurazione
- Gradle fornisce miglioramenti delle prestazioni utilizzando in modo incrementale, build cache e Gradle Daemon
Contro
- L'integrazione IDE non è buona come Maven
Esempio Gradle
Puoi installare Gradle da qui. Una volta impostato Gradle nel tuo percorso, puoi verificarlo:
$ gradle --version------------------------------------------------------------
Grado 4.5
------------------------------------------------------------
Tempo di costruzione: 24/01/2018 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)
Sistema operativo: Mac OS X 10.11.6x86_64
Quindi, crea la seguente struttura di directory:
Ciao mondo|-- build.grado
'-- src
|-- principale
'-- java
'-- Ciao mondo
'-- Ciao mondo.Giava
Per l'aldilà.java ha messo il codice dall'esempio di Ant. E per costruire.gradle ha inserito il seguente codice:
applica il plugin: 'java'versione = '1.0'
repository
mavenCentral()
dipendenze
testCompile gruppo: 'junit', nome: 'junit', versione: '4.12'
Puoi usare il comando "gradle task -all" per guardare tutti i comandi disponibili. Gradle preleva automaticamente i plugin che specifichi nella build.gradle e ti mostra le attività extra disponibili grazie ai plugin.
Puoi ottenere la build eseguendo:
barattolo $gradleCOSTRUISCI CON SUCCESSO in 1s
2 attività eseguibili: 2 eseguite
Puoi eseguire il tuo barattolo in questo modo:
$ java -cp build/libs/helloworld-1.0.vaso ciaomondoCiao mondo!
Il file jar viene messo nella cartella build/libs.
Conclusione
Tra gli strumenti di compilazione, Ant può essere utile per progetti più piccoli mentre Maven è migliore per assicurarsi che tutti gli sviluppatori seguano le stesse regole. Gradle è l'ultimo strumento che offre la massima flessibilità.
Riferimenti:
- http://ant.apache.org/
- http://ant.apache.org/edera/
- 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/per-iniziare/maven-in-cinque-minuti.html
- https://stackoverflow.com/questions/20755437/java-build-tools-ant-vs-maven
- https://tecnologiaconversazioni.com/2014/06/18/strumenti-di-costruzione/
- https://www.quora.com/Quali-sono-i-pro-e-contro-di-Maven-contro-Ant-come-strumenti-di-costruzione-per-Java