Formiga contra Maven contra Gradle

Ant Vs Maven Vs Gradle



Durant el desenvolupament de programari, els desenvolupadors han de reconstruir el mateix codi una vegada i una altra. Sovint intenten utilitzar scripts bash o altres llenguatges de scripts per automatitzar la tasca. Tot i això, hi ha eines de compilació disponibles més adequades per a l’automatització de les construccions. Les eines de construcció predominants són:

Investiguem les eines per obtenir més informació.







Formiga Apache amb Ivy

Apache Ant és una eina de línia d’ordres basada en Java que utilitza fitxers XML per definir scripts de construcció. S’utilitza principalment per a versions de Java, però també es pot utilitzar per al desenvolupament de C / C ++. Les tasques integrades proporcionen maneres de compilar, muntar, provar i executar aplicacions de programari. Els usuaris també poden crear els seus propis antlibs per millorar la funcionalitat d'Ant. Apache Ivy és una eina de gestió de dependències que s’integra fàcilment amb Ant per proporcionar un ecosistema més robust. El desenvolupament d'Ant va començar el 2000.



Pros



  • Millor control sobre el procés general de construcció
  • Prou flexible per treballar amb qualsevol procés de treball

Contres





  • Els fitxers de compilació basats en XML poden créixer de manera gran i inassumible
  • Es necessita molt de temps i recursos per mantenir els scripts de compilació
  • La integració IDE és difícil d’aconseguir

Formiga amb Ivy Exemple

Podeu instal·lar la versió més recent de Ant aquí . Heu de descarregar el zip, ampliar i posar la carpeta bin al vostre camí. Podeu utilitzar l'ordre següent per veure si Ant està instal·lat correctament:

$ formiga-versió
Ant Apache(TM)versió 1.10.1 compilada el febrer2 2017

Un cop tingueu instal·lat Ant, podeu descarregar el darrer pot Ivy i posar-lo a la carpeta lib del directori Ant.



Després d'haver instal·lat Ant, creeu carpetes helloworld i helloworld / src. Dins de la carpeta src, poseu el fitxer helloworld.java amb el codi:

/ **************************

Imprimeix 'Hola món!'

*************************** /

públic classeHola món{

públic estàtic buitprincipal( Corda []args) {
Sistema .fora.println('Hola món!');
}

}

Ara, a la carpeta helloworld, creeu un fitxer build.xml amb el codi següent:

xmlns: heura='antlib: org.apache.ivy.ant' nom='Hola món' per defecte='pot'>

nom='src.dir' valor='src'/>
nom='build.dir' valor='construir'/>
nom='classes.dir' valor='$ {build.dir} / classes'/>
nom='am.dir' valor='$ {build.dir} / bin'/>
nom='lib.dir' valor='lib' />
identificador='Lib.path.id'>
a tu='$ {lib.dir}' />
>

nom='resoldre'>
/>
>

nom='net'>
a tu='$ {build.dir}'/>
>

nom='compila' depèn='resoldre'>
a tu='${classes.dir}'/>
srcdir='$ {src.dir}' destdir='${classes.dir}' classpathref='Lib.path.id'/>
>

nom='pot' depèn='compila'>
a tu='$ {bin.dir}'/>
destfile='$ {bin.dir} / $ {ant.project.name} .jar' basedir='${classes.dir}'/>
>

>

I a la mateixa carpeta helloworld, creeu el fitxer ivy.xml amb el codi següent:

versió='2.0'>
organització='org.apache' mòdul='Hola món'/>
>
org='junit' nom='junit' rev='4.12'/>
>
>

L'estructura de directoris hauria de ser així:

Hola món
| - build.xml
| - ivy.xml
`- src
`- helloworld.java

Ara podeu executar la compilació amb l'ordre:

$formigapot

Una compilació amb èxit hauria de proporcionar resultats com aquest:

$ ant pot
Buildfile: /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build.xml

resol:
[heura: recuperar] :: Apache Ivy 2.4.0 - 20141213170938 :: http://ant.apache.org/ivy/ ::
[heura: recuperar] :: carregant paràmetres :: url = jar: file: / Users / zak / BuildTools / ANT / apache
-ant-1.10.1 / lib / ivy-2.4.0.jar! /org/apache/ivy/core/settings/ivysettings.xml
[heura: recuperar] :: resolució de dependències :: org.apache # helloworld; [correu electrònic protegit]
MacBook-Air.local
[heura: recuperar] confs: [per defecte]
[ivy: retrieve] ha trobat junit # junit; 4.12 en públic
[ivy: retrieve] ha trobat org.hamcrest # hamcrest-core; 1,3 en públic
[heura: recuperar] :: informe de resolució :: resolució de 397 ms :: artefactes dl de 15 ms
-------------------------------------------------- -------------------
| | mòduls || artefactes |
| conf | número | cerca | apartat | expulsat || número | inclinat |
-------------------------------------------------- -------------------
| per defecte | 2 | 0 | 0 | 0 || 4 | 0 |
-------------------------------------------------- -------------------
[heura: recuperar] :: recuperació :: org.apache # helloworld
[heura: recuperar] confs: [per defecte]
[heura: recupera] 0 artefactes copiats, 4 ja recuperats (0 kB / 39 ms)

compila:
[mkdir] Director creat: / Users / zak / _work / LearnBuildScripts / LearnANT / helloworld / build /
classes
[javac] /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build.xml:22: advertència:
'includeantruntime' no s'ha definit, per defecte a build.sysclasspath = last; definit com a fals
per a versions repetibles
[javac] Compilació d’un fitxer font a / Users / zak / _work / LearnBuildScripts / LearnANT /
helloworld / build / classes

pot:
[mkdir] Creat dir: / Usuaris / zak / _work / LearnBuildScripts / LearnANT / helloworld / build / bin
[jar] Building jar: / Users / zak / _work / LearnBuildScripts / LearnANT / helloworld / build / bin /
helloworld.jar

CONSTRUIR ÈXIT
Temps total: 6 segons

Podeu provar el fitxer jar així:

$ java -cp build / bin / helloworld.potHola món
Hola món!

Hem definit el fitxer jar que es posarà a la carpeta build / bin. Les carpetes es creen durant la construcció. L'ordre ant jar crida a l'objectiu jar del fitxer build.xml.

Maven

Maven es va desenvolupar per resoldre els problemes amb els scripts basats en Ant. Va conservar els fitxers XML, però va adoptar un enfocament diferent de l’organització. A Ant, els desenvolupadors han de crear totes les tasques. Maven disminueix la creació de tasques implementant estàndards més forts per organitzar el codi. Com a resultat, és més fàcil començar amb projectes estàndard.

També va introduir descàrregues de dependències que van facilitar el desenvolupament. Abans de la introducció d’Ivy a Ant, els usuaris havien de gestionar les dependències localment. Maven va adoptar primer la filosofia de gestió de dependències.

Tot i això, els estàndards estrictes de Mavens dificulten l’escriptura de scripts de construcció personalitzats. L'eina és fàcil de treballar sempre que el projecte segueixi els estàndards estrictes.

Pros

  • Descàrregues automàtiques de dependències
  • Totes les dependències es registren automàticament en el control font com a part dels scripts Maven
  • Estandarditza i simplifica el procés de construcció
  • S'integra fàcilment amb sistemes IDE i CI / CD

Contres

  • No és flexible en crear fluxos de treball personalitzats
  • Per als novells és difícil entendre la corba d’aprenentatge abrupta i el procés
  • Consumeixen molt de temps per resoldre problemes de construcció i noves integracions de biblioteques
  • No és bo amb diverses versions de la mateixa dependència

Exemple Maven

Podeu descarregar la versió més recent de Maven des de aquí . Podeu comprovar la instal·lació així:

$ mvn --versió
Apache Maven 3.5.2(138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T00:58:13-07: 00)
Inici de Maven: /Users/zak/BuildTools/Maven/apache-maven-3.5.2
Versió de Java: 1.8.0_74, proveïdor: Oracle Corporation
Inici de Java: /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/ Continguts / Inici / jre
Configuració regional predeterminada: en_US, codificació de plataforma: UTF-8
Nom del sistema operatiu:'mac os x', versió:'10 .11.6 ', arc:'x86_64', família:'Mac'

Creeu una carpeta helloworld i creeu un projecte amb l'ordre següent:

Arquetip de $ mvn: generate -DgroupId = com.Nom de la companyia.Hola món-DartifactId = món hellow
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=fals

Ha de crear l'estructura de carpetes i generar la sortida que té aquest aspecte:

[INFO] S'està cercant projectes ...
[INFO]
[INFO] ----------------------------------------------- -------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ----------------------------------------------- -------------------------
[INFO]
[INFO] >>> maven-archetype-plugin: 3.0.0: generate (default-cli)> generate-sources
@ 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: generate (default-cli) @ standalone-pom ---
[INFO] Generació de projecte en mode per lots
[INFO] ----------------------------------------------- -----------------------------
[INFO] Utilitzar els paràmetres següents per crear un projecte a partir de l'arquetip antic (1.x):
maven-archetype-quickstart: 1.0
[INFO] ----------------------------------------------- -----------------------------
[INFO] Paràmetre: basedir, Valor: / Users / zak / _work / LearnBuildScripts / LearnMaven
[INFO] Paràmetre: paquet, valor: com.comnomempresa.helloworld
[INFO] Paràmetre: groupId, Value: com.companyname.helloworld
[INFO] Paràmetre: artifactId, Valor: helloworld
[INFO] Paràmetre: packageName, Valor: com.companyname.helloworld
[INFO] Paràmetre: versió, valor: 1.0-SNAPSHOT
Projecte [INFO] creat a partir de l'arquetip Old (1.x) en dir: / Users / zak / _work /
LearnBuildScripts / LearnMaven / helloworld
[INFO] ----------------------------------------------- -------------------------
[INFORMACIÓ] CONSTRUIR ÈXIT
[INFO] ----------------------------------------------- -------------------------
[INFO] Temps total: 8.602 s
[INFO] Finalitzat a: 2018-01-27T00: 05: 37-08: 00
[INFO] Memòria final: 15M / 152M
[INFO] ----------------------------------------------- -------------------------

L'estructura de carpetes hauria de ser així:

Hola món
|- pom.xml
`- src
|- principal
| `-java
| `- amb
| `-- Nom de la companyia
| `-- Hola món
| `- App.java
`-prova
`-java
`- amb
`-- Nom de la companyia
`-- Hola món
`- AppTest.java

El pom.xml conté les configuracions de compilació. Dins del pom.xml, el codi té aquest aspecte:

xmlns='Http://maven.apache.org/POM/4.0.0' xmlns: xsi='http://www.w3.org/2001/
XMLSchema-instance '
xsi: schemaLocation='Http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0
_0.xsd '>
>4.0.0>
>com.comnom d’empresa.helloworld>
>Hola món>
>pot>
>1.0-instantània>
>Hola món>
>http://maven.apache.org>
>
>
>junit>
>junit>
>3.8.1>
>prova>
>
>
>

Podeu generar el fitxer jar mitjançant l'ordre següent:

paquet $ mvn

[INFO] S'està cercant projectes ...
[INFO]
[INFO] ----------------------------------------------- -------------------------
[INFO] Construir Helloworld 1.0-SNAPSHOT
[INFO] ----------------------------------------------- -------------------------
[INFO]
[INFO] --- maven-resources-plugin: 2.6: resources (default-resources) @ helloworld ---
[ADVERTÈNCIA] Ús de codificació de plataforma (UTF-8 en realitat) per copiar recursos filtrats, és a dir,
la construcció depèn de la plataforma.
[INFO] omet el directori de recursos no existents / Usuaris / zak / _work / LearnBuildScripts / LearnMaven /
helloworld / src / main / resources
[INFO]
[INFO] --- maven-compiler-plugin: 3.1: compile (per defecte-compila) @ helloworld ---
[INFO] Canvis detectats: recompilació del mòdul.
[AVÍS] La codificació de fitxers no s'ha definit, mitjançant la codificació de plataforma UTF-8, és a dir, la compilació és
depèn de la plataforma.
[INFO] Compilació d'un fitxer font a / Users / zak / _work / LearnBuildScripts / LearnMaven /
helloworld / target / classes
[INFO]
[INFO] --- maven-resources-plugin: 2.6: testResources (default-testResources) @
Hola món ---
[ADVERTÈNCIA] Ús de codificació de plataforma (UTF-8 en realitat) per copiar recursos filtrats, és a dir,
la construcció depèn de la plataforma.
[INFO] omet el directori de recursos no existents / Usuaris / zak / _work / LearnBuildScripts / LearnMaven /
helloworld / src / test / resources
[INFO]
[INFO] --- maven-compiler-plugin: 3.1: testCompile (default-testCompile) @ helloworld ---
[INFO] Canvis detectats: recompilació del mòdul.
[AVÍS] La codificació de fitxers no s'ha definit, mitjançant la codificació de plataforma UTF-8, és a dir, la compilació és
depèn de la plataforma.
[INFO] Compilació d'un fitxer font a / Users / zak / _work / LearnBuildScripts / LearnMaven
/ helloworld / target / test-classes
[INFO]
[INFO] --- maven-surefire-plugin: 2.12.4: test (test per defecte) @ helloworld ---
[INFO] Directori d'informes Surefire: / Users / zak / _work / LearnBuildScripts / LearnMaven
/ helloworld / target /
informes segurs

-------------------------------------------------- -----
T E S T S
-------------------------------------------------- -----
S'està executant com.companyname.helloworld.AppTest
Proves executades: 1, Fallades: 0, Errors: 0, Saltat: 0, Temps transcorregut: 0,014 seg

Resultats :

Execució de les proves: 1, errors: 0, errors: 0, omès: 0

[INFO]
[INFO] --- maven-jar-plugin: 2.4: jar (per defecte-jar) @ helloworld ---
[INFO] Jar de construcció: / Usuaris / zak / _work / LearnBuildScripts / LearnMaven / helloworld / target /
helloworld-1.0-SNAPSHOT.jar
[INFO] ----------------------------------------------- -------------------------
[INFORMACIÓ] CONSTRUIR ÈXIT
[INFO] ----------------------------------------------- -------------------------
[INFO] Temps total: 5.624 s
[INFO] Finalitzat a: 2018-01-27T00: 11: 10-08: 00
[INFO] Memòria final: 16M / 114M
[INFO] ----------------------------------------------- -------------------------

Podeu executar el fitxer jar així:

$ java -cp target / helloworld-1.0-SNAPSHOT.potamb.Nom de la companyia.Hola món.Aplicació
Hola món!

El fitxer jar es col·loca a la carpeta de destinació.

Gradle

Gradle combina el poder d'Ant i Maven. La primera versió de Gradle es va publicar el 2012. Ha estat adoptada ràpidament. Google l’utilitza actualment per al sistema operatiu Android.

En lloc d’XML, Gradle utilitza el llenguatge Groovy. Com a resultat, els scripts de construcció a Gradle són més fàcils d’escriure i llegir. Inicialment feia servir Ivy per a la gestió de dependències, però ara utilitza el seu propi motor de dependències.

Pros

  • Ofereix estandardització mentre es manté flexible
  • Scripts de compilació fàcils de llegir i escriure
  • Millor en el maneig de diverses versions de dependències
  • Capaç de manejar múltiples llenguatges i tecnologies de programació
  • Comunitat activa que ajuda a desenvolupar l'eina
  • Gradle DSL (Domain-Specific Language) fa que sigui una estructura de configuració senzilla
  • Gradle proporciona millores de rendiment mitjançant increments, compilació de memòria cau i dimoni de Gradle

Contres

  • La integració IDE no és tan bona com Maven

Exemple de Gradle

Podeu instal·lar Gradle des de aquí . Un cop hàgiu configurat Gradle al vostre camí, podeu comprovar-ho mitjançant:

$ gradle--versió

-------------------------------------------------- ----------
Gradle4.5
-------------------------------------------------- ----------

Temps de construcció:2018-01-24 17: 04:52UTC
Revisió: 77d0ec90636f43669dc794ca17ef80dd65457bec

Groovy: 2.4.12
Formiga: Formiga Apatxe(TM)versió 1.9.9 compilada el febrer2 2017
JVM: 1.8.0_74(Oracle Corporation25.74-b02)
Sistema operatiu: Mac OS X 10.11.6 x86_64

A continuació, creeu l'estructura de directoris següent:

Hola món
| -construir.gradle
`-src
| -principal
`-java
`-Hola món
`-Hola món.java

Per a helloworld.java, poseu el codi de l'exemple Ant. I per a build.gradle poseu el codi següent:

aplica el connector: 'java'

versió= '1.0'

repositoris{
mavenCentral()
}

dependències{
grup de provaCompila: 'junit', nom: 'junit', versió: '4.12'
}

Podeu utilitzar tasques gradle –tota ordre per veure totes les ordres disponibles. Gradle recull automàticament els connectors que especifiqueu al fitxer build.gradle i us mostra les tasques addicionals disponibles a causa dels connectors.

Podeu obtenir la compilació executant:

$ gradle pot

CONSTRUIR ÈXIT en 1 s
2tasques accionables:2executat

Podeu fer funcionar el pot així:

$ java -cp build / libs / helloworld-1.0.potHola món
Hola món!

El fitxer jar es col·loca a la carpeta build / libs.

Conclusió

Entre les eines de construcció, Ant pot ser útil per a projectes més petits, mentre que Maven és millor per assegurar-se que tots els desenvolupadors compleixin les mateixes regles. Gradle és l’última eina que proporciona més flexibilitat.

Referències: