SlideShare una empresa de Scribd logo
1 de 21
Descargar para leer sin conexión
• Yann Le Moigne
• Indépendant
• Développeur Java depuis plus de 10 ans
• @LeMoigneY
Historique des outils de build Java
Apache Ant
Sortie en 2000
Description XML
<project name="MyProject" default="dist" basedir=".">

<description>

simple example build file

</description>

<property name="src" location="src"/>

<property name="build" location="build"/>

<property name="dist" location="dist"/>



<target name="init">

<mkdir dir="${build}"/>

</target>



<target name="compile" depends="init"

description="compile the source " >

<javac srcdir="${src}" destdir="${build}"/>

</target>



<target name="dist" depends="compile"

description="generate the distribution" >

<mkdir dir="${dist}/lib"/>

<jar jarfile="${dist}/lib/MyProject.jar"
basedir="${build}"/>

</target>



<target name="clean"

description="clean up" >

<delete dir="${build}"/>

<delete dir="${dist}"/>

</target>

</project>
Problèmes
Aucune convention officielle
- Sur la structure projet
- Sur les phases a executer lors du build
- Comment gérer les dépendances (et leur transitivité)
XML difficile a lire, surtout avec des ID/References dans tous les sens.
Consécutivement difficulté de maintenance
Difficile d’appréhender un build complexe fait par un autre
Apache Maven
Sortie en 2004
Description XML
Basé sur des conventions
« Standardisant »
Structure projet Phase de build Dépendances
validate
compile
test
package
integration-test
verify
install
deploy
<project 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/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>



<groupId>com.mycompany.app</groupId>

<artifactId>my-app</artifactId>

<version>1.0-SNAPSHOT</version>

<packaging>jar</packaging>



<name>Maven Quick Start Archetype</name>

<url>http://maven.apache.org</url>



<dependencies>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.8.2</version>

<scope>test</scope>

</dependency>

</dependencies>

</project>
Problèmes
Convention seulement
Pour tous besoin non couvert, il faut écrire un plugin
Donc gérer un projet à part…
Pour chaque besoin soit :
- il y a un plugin
- il y a une option
- il n’y pas de solution
Le XML est toujours aussi verveux et peu lisible
Gradle
Sortie en 2012
Description DSL Groovy
Basé sur des conventions
Structure projet Dépendances
custom/layout
apply plugin: 'java'



repositories {

jcenter()

}



dependencies {

compile 'org.slf4j:slf4j-api:1.7.7'



testCompile 'junit:junit:4.11'

}
Avantages
DSL Lisible
Convention
Customization
Customization
DSL
Customization : Ajout d’un sourceset
sourceSets {

integration {

java.srcDir 'src/integration/java'

resources.srcDir 'src/integration/resources'

compileClasspath += [configurations.compile]

}

}
Qui a besoin de dépendance spécifique
configurations {

integration

}



sourceSets {

integration {

java.srcDir 'src/integration/java'

resources.srcDir 'src/integration/resources'

compileClasspath += [configurations.compile, configurations.integration]

}

}
dependencies {
integration ‘my.integration:testing-lib:1.2.3’

}
Customization
task generateInfoJson {

File infoJsonFile = project.file("src/main/webapp/info.json")



doLast {

def builder = new JsonBuilder()

builder {

serverHost "localhost"

ports {

management 9999

remoting 4447

http 8080

}

version project.version

}



builder.writeTo(new PrintWriter(infoJsonFile)).close()

}

}

tasks.jar.dependsOn generateInfoJson
Custom task : Besoin de générer un fichier json
{

"host": "localhost",

"ports":{

"management": 9999,

"remoting": 4447,

"http": 8080

},

"version": "3.3-SNAPSHOT"

}
La tache s’écrit en groovy dans le fichier de build
Tache incrémentale
task generateInfoJson {

File infoJsonFile = project.file("src/main/webapp/info.json")



inputs.property("version", project.version)

outputs.file infoJsonFile



doLast {

def builder = new JsonBuilder()

builder {

serverHost "localhost"

ports {

management 9999

remoting 4447

http 8080

}

version project.version

}



builder.writeTo(new PrintWriter(infoJsonFile)).close()

}

}

tasks.jar.dependsOn generateInfoJson
Intégration IDE
apply plugin: 'idea' apply plugin: 'eclipse'
Customization (encore)
idea {

module {

downloadJavadoc = true

downloadSources = true

scopes.PROVIDED.plus += [configurations.provided]

excludeDirs += [file('bin')]

}

}
Et en vrac
Parallélisation
Gradle Daemon
Gradle wrapper
Et plus encore :
Java
Groovy
Scala
Antlr
Android
Et en incubation :
assembler
C
CPP
Objective-C
Objective-CPP
Inconvénients par rapport à Ant
Moins standardisant
Moins de plugins disponible
Heu… …
Inconvénients par rapport à Maven
Questions ?

Más contenido relacionado

La actualidad más candente

Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootDNG Consulting
 
Utilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expérienceUtilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expériencelouschwartz
 
Présentation jQuery pour débutant
Présentation jQuery pour débutantPrésentation jQuery pour débutant
Présentation jQuery pour débutantStanislas Chollet
 
Introduction à Angular JS
Introduction à Angular JSIntroduction à Angular JS
Introduction à Angular JSAntoine Rey
 
Réu technodejs
Réu technodejsRéu technodejs
Réu technodejsnaholyr
 
Installer et configurer MariaDB
Installer et configurer MariaDBInstaller et configurer MariaDB
Installer et configurer MariaDBlemugfr
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonyVincent Composieux
 
Configuration Management avec Drupal 8
Configuration Management avec Drupal 8Configuration Management avec Drupal 8
Configuration Management avec Drupal 8Aurelien Navarre
 
Jquery - introduction au langage
Jquery - introduction au langageJquery - introduction au langage
Jquery - introduction au langageStrasWeb
 

La actualidad más candente (9)

Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring Boot
 
Utilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expérienceUtilisation de ZK avec Java - Retour d’expérience
Utilisation de ZK avec Java - Retour d’expérience
 
Présentation jQuery pour débutant
Présentation jQuery pour débutantPrésentation jQuery pour débutant
Présentation jQuery pour débutant
 
Introduction à Angular JS
Introduction à Angular JSIntroduction à Angular JS
Introduction à Angular JS
 
Réu technodejs
Réu technodejsRéu technodejs
Réu technodejs
 
Installer et configurer MariaDB
Installer et configurer MariaDBInstaller et configurer MariaDB
Installer et configurer MariaDB
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
 
Configuration Management avec Drupal 8
Configuration Management avec Drupal 8Configuration Management avec Drupal 8
Configuration Management avec Drupal 8
 
Jquery - introduction au langage
Jquery - introduction au langageJquery - introduction au langage
Jquery - introduction au langage
 

Destacado

Lo que conseguimos con demasiada facilidad nunca es objeto de gran estimación
Lo que conseguimos con demasiada facilidad nunca es objeto de gran estimaciónLo que conseguimos con demasiada facilidad nunca es objeto de gran estimación
Lo que conseguimos con demasiada facilidad nunca es objeto de gran estimaciónDr Guillermo Cobos Z.
 
La floride Habitée par des Espèces Envahissantes Qui Pourraient Effrayer les ...
La floride Habitée par des Espèces Envahissantes Qui Pourraient Effrayer les ...La floride Habitée par des Espèces Envahissantes Qui Pourraient Effrayer les ...
La floride Habitée par des Espèces Envahissantes Qui Pourraient Effrayer les ...enchantinggover30
 
National G
National GNational G
National GStrujen
 
Dossier de sponsoring Ch'tites roadeuses
Dossier de sponsoring Ch'tites roadeusesDossier de sponsoring Ch'tites roadeuses
Dossier de sponsoring Ch'tites roadeusesGwendolyne Fouache
 
CUESTIONO MI REALIDAD Y PROYECTO TRANSFORMACION EN MI ENTORNO
CUESTIONO MI REALIDAD Y PROYECTO TRANSFORMACION EN MI ENTORNOCUESTIONO MI REALIDAD Y PROYECTO TRANSFORMACION EN MI ENTORNO
CUESTIONO MI REALIDAD Y PROYECTO TRANSFORMACION EN MI ENTORNOIngdeayala_19
 
Echos2Pros-2013-2014.compressed
Echos2Pros-2013-2014.compressedEchos2Pros-2013-2014.compressed
Echos2Pros-2013-2014.compressedSantiago Giraldo
 
EAS Gruppo 3
EAS Gruppo 3EAS Gruppo 3
EAS Gruppo 3seppy84
 
1 s2.0-s1297958914001519-main
1 s2.0-s1297958914001519-main1 s2.0-s1297958914001519-main
1 s2.0-s1297958914001519-main鋒博 蔡
 

Destacado (20)

Parábola de los impuestos
Parábola de los impuestosParábola de los impuestos
Parábola de los impuestos
 
Lo que conseguimos con demasiada facilidad nunca es objeto de gran estimación
Lo que conseguimos con demasiada facilidad nunca es objeto de gran estimaciónLo que conseguimos con demasiada facilidad nunca es objeto de gran estimación
Lo que conseguimos con demasiada facilidad nunca es objeto de gran estimación
 
La floride Habitée par des Espèces Envahissantes Qui Pourraient Effrayer les ...
La floride Habitée par des Espèces Envahissantes Qui Pourraient Effrayer les ...La floride Habitée par des Espèces Envahissantes Qui Pourraient Effrayer les ...
La floride Habitée par des Espèces Envahissantes Qui Pourraient Effrayer les ...
 
Dossier de production
Dossier de production Dossier de production
Dossier de production
 
the-socio
the-sociothe-socio
the-socio
 
El cambio m sosa
El cambio m sosaEl cambio m sosa
El cambio m sosa
 
Parábola de los impuestos
Parábola de los impuestosParábola de los impuestos
Parábola de los impuestos
 
Programme de 16 jours
Programme de 16 joursProgramme de 16 jours
Programme de 16 jours
 
Restaurant
RestaurantRestaurant
Restaurant
 
National G
National GNational G
National G
 
Dossier de sponsoring Ch'tites roadeuses
Dossier de sponsoring Ch'tites roadeusesDossier de sponsoring Ch'tites roadeuses
Dossier de sponsoring Ch'tites roadeuses
 
CUESTIONO MI REALIDAD Y PROYECTO TRANSFORMACION EN MI ENTORNO
CUESTIONO MI REALIDAD Y PROYECTO TRANSFORMACION EN MI ENTORNOCUESTIONO MI REALIDAD Y PROYECTO TRANSFORMACION EN MI ENTORNO
CUESTIONO MI REALIDAD Y PROYECTO TRANSFORMACION EN MI ENTORNO
 
Echos2Pros-2013-2014.compressed
Echos2Pros-2013-2014.compressedEchos2Pros-2013-2014.compressed
Echos2Pros-2013-2014.compressed
 
Somos esclavos de nuestros hábitos
Somos esclavos de nuestros hábitosSomos esclavos de nuestros hábitos
Somos esclavos de nuestros hábitos
 
Qingdao
QingdaoQingdao
Qingdao
 
E-learning
E-learningE-learning
E-learning
 
El hábito de quejarse
El hábito de quejarseEl hábito de quejarse
El hábito de quejarse
 
EAS Gruppo 3
EAS Gruppo 3EAS Gruppo 3
EAS Gruppo 3
 
9242540579 chap8 fre
 9242540579 chap8 fre 9242540579 chap8 fre
9242540579 chap8 fre
 
1 s2.0-s1297958914001519-main
1 s2.0-s1297958914001519-main1 s2.0-s1297958914001519-main
1 s2.0-s1297958914001519-main
 

Similar a Gradle

Présentation Gradle au LyonJUG par Grégory Boissinot - Zenika
Présentation Gradle au LyonJUG par Grégory Boissinot - ZenikaPrésentation Gradle au LyonJUG par Grégory Boissinot - Zenika
Présentation Gradle au LyonJUG par Grégory Boissinot - ZenikaZenika
 
Java dans Windows Azure, l'exemple de JOnAS
Java dans Windows Azure, l'exemple de JOnASJava dans Windows Azure, l'exemple de JOnAS
Java dans Windows Azure, l'exemple de JOnASGuillaume Sauthier
 
Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Sylvain Wallez
 
Apache flink - prise en main rapide
Apache flink - prise en main rapideApache flink - prise en main rapide
Apache flink - prise en main rapideBilal Baltagi
 
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)hibnico
 
Automatisez vos tâches répétitives avec Grunt (Blend 2013)
Automatisez vos tâches répétitives avec Grunt (Blend 2013)Automatisez vos tâches répétitives avec Grunt (Blend 2013)
Automatisez vos tâches répétitives avec Grunt (Blend 2013)Corinne Schillinger
 
SLIDES-625.1.1-IDL-4-build tools maven.pdf
SLIDES-625.1.1-IDL-4-build tools maven.pdfSLIDES-625.1.1-IDL-4-build tools maven.pdf
SLIDES-625.1.1-IDL-4-build tools maven.pdfArouNa3
 
Java dans Windows Azure: l'exemple de Jonas
Java dans Windows Azure: l'exemple de JonasJava dans Windows Azure: l'exemple de Jonas
Java dans Windows Azure: l'exemple de JonasMicrosoft
 
Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de donnéesFranck SIMON
 
A la découverte de vue.js
A la découverte de vue.jsA la découverte de vue.js
A la découverte de vue.jsBruno Bonnin
 

Similar a Gradle (20)

Présentation Gradle au LyonJUG par Grégory Boissinot - Zenika
Présentation Gradle au LyonJUG par Grégory Boissinot - ZenikaPrésentation Gradle au LyonJUG par Grégory Boissinot - Zenika
Présentation Gradle au LyonJUG par Grégory Boissinot - Zenika
 
Gradle_LyonJUG
Gradle_LyonJUGGradle_LyonJUG
Gradle_LyonJUG
 
Java dans Windows Azure, l'exemple de JOnAS
Java dans Windows Azure, l'exemple de JOnASJava dans Windows Azure, l'exemple de JOnAS
Java dans Windows Azure, l'exemple de JOnAS
 
Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011
 
Gradle_Paris2010
Gradle_Paris2010Gradle_Paris2010
Gradle_Paris2010
 
Maven
MavenMaven
Maven
 
Apache flink - prise en main rapide
Apache flink - prise en main rapideApache flink - prise en main rapide
Apache flink - prise en main rapide
 
Gradle_NormandyJUG
Gradle_NormandyJUGGradle_NormandyJUG
Gradle_NormandyJUG
 
Gradle_BordeauxJUG
Gradle_BordeauxJUGGradle_BordeauxJUG
Gradle_BordeauxJUG
 
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
 
Springioc
SpringiocSpringioc
Springioc
 
Gradle_ToursJUG
Gradle_ToursJUGGradle_ToursJUG
Gradle_ToursJUG
 
gradle_nantesjug
gradle_nantesjuggradle_nantesjug
gradle_nantesjug
 
Automatisez vos tâches répétitives avec Grunt (Blend 2013)
Automatisez vos tâches répétitives avec Grunt (Blend 2013)Automatisez vos tâches répétitives avec Grunt (Blend 2013)
Automatisez vos tâches répétitives avec Grunt (Blend 2013)
 
SLIDES-625.1.1-IDL-4-build tools maven.pdf
SLIDES-625.1.1-IDL-4-build tools maven.pdfSLIDES-625.1.1-IDL-4-build tools maven.pdf
SLIDES-625.1.1-IDL-4-build tools maven.pdf
 
Java dans Windows Azure: l'exemple de Jonas
Java dans Windows Azure: l'exemple de JonasJava dans Windows Azure: l'exemple de Jonas
Java dans Windows Azure: l'exemple de Jonas
 
Backbonejs presentation
Backbonejs presentationBackbonejs presentation
Backbonejs presentation
 
Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de données
 
Gradle_BreizJUG
Gradle_BreizJUGGradle_BreizJUG
Gradle_BreizJUG
 
A la découverte de vue.js
A la découverte de vue.jsA la découverte de vue.js
A la découverte de vue.js
 

Gradle

  • 1. • Yann Le Moigne • Indépendant • Développeur Java depuis plus de 10 ans • @LeMoigneY
  • 2. Historique des outils de build Java
  • 3. Apache Ant Sortie en 2000 Description XML
  • 4. <project name="MyProject" default="dist" basedir=".">
 <description>
 simple example build file
 </description>
 <property name="src" location="src"/>
 <property name="build" location="build"/>
 <property name="dist" location="dist"/>
 
 <target name="init">
 <mkdir dir="${build}"/>
 </target>
 
 <target name="compile" depends="init"
 description="compile the source " >
 <javac srcdir="${src}" destdir="${build}"/>
 </target>
 
 <target name="dist" depends="compile"
 description="generate the distribution" >
 <mkdir dir="${dist}/lib"/>
 <jar jarfile="${dist}/lib/MyProject.jar" basedir="${build}"/>
 </target>
 
 <target name="clean"
 description="clean up" >
 <delete dir="${build}"/>
 <delete dir="${dist}"/>
 </target>
 </project>
  • 5. Problèmes Aucune convention officielle - Sur la structure projet - Sur les phases a executer lors du build - Comment gérer les dépendances (et leur transitivité) XML difficile a lire, surtout avec des ID/References dans tous les sens. Consécutivement difficulté de maintenance Difficile d’appréhender un build complexe fait par un autre
  • 6. Apache Maven Sortie en 2004 Description XML Basé sur des conventions « Standardisant » Structure projet Phase de build Dépendances validate compile test package integration-test verify install deploy
  • 8. Problèmes Convention seulement Pour tous besoin non couvert, il faut écrire un plugin Donc gérer un projet à part… Pour chaque besoin soit : - il y a un plugin - il y a une option - il n’y pas de solution Le XML est toujours aussi verveux et peu lisible
  • 9. Gradle Sortie en 2012 Description DSL Groovy Basé sur des conventions Structure projet Dépendances custom/layout
  • 10. apply plugin: 'java'
 
 repositories {
 jcenter()
 }
 
 dependencies {
 compile 'org.slf4j:slf4j-api:1.7.7'
 
 testCompile 'junit:junit:4.11'
 }
  • 13. Customization : Ajout d’un sourceset sourceSets {
 integration {
 java.srcDir 'src/integration/java'
 resources.srcDir 'src/integration/resources'
 compileClasspath += [configurations.compile]
 }
 } Qui a besoin de dépendance spécifique configurations {
 integration
 }
 
 sourceSets {
 integration {
 java.srcDir 'src/integration/java'
 resources.srcDir 'src/integration/resources'
 compileClasspath += [configurations.compile, configurations.integration]
 }
 } dependencies { integration ‘my.integration:testing-lib:1.2.3’
 }
  • 15. task generateInfoJson {
 File infoJsonFile = project.file("src/main/webapp/info.json")
 
 doLast {
 def builder = new JsonBuilder()
 builder {
 serverHost "localhost"
 ports {
 management 9999
 remoting 4447
 http 8080
 }
 version project.version
 }
 
 builder.writeTo(new PrintWriter(infoJsonFile)).close()
 }
 }
 tasks.jar.dependsOn generateInfoJson Custom task : Besoin de générer un fichier json {
 "host": "localhost",
 "ports":{
 "management": 9999,
 "remoting": 4447,
 "http": 8080
 },
 "version": "3.3-SNAPSHOT"
 } La tache s’écrit en groovy dans le fichier de build
  • 16. Tache incrémentale task generateInfoJson {
 File infoJsonFile = project.file("src/main/webapp/info.json")
 
 inputs.property("version", project.version)
 outputs.file infoJsonFile
 
 doLast {
 def builder = new JsonBuilder()
 builder {
 serverHost "localhost"
 ports {
 management 9999
 remoting 4447
 http 8080
 }
 version project.version
 }
 
 builder.writeTo(new PrintWriter(infoJsonFile)).close()
 }
 }
 tasks.jar.dependsOn generateInfoJson
  • 17. Intégration IDE apply plugin: 'idea' apply plugin: 'eclipse' Customization (encore) idea {
 module {
 downloadJavadoc = true
 downloadSources = true
 scopes.PROVIDED.plus += [configurations.provided]
 excludeDirs += [file('bin')]
 }
 }
  • 18. Et en vrac Parallélisation Gradle Daemon Gradle wrapper
  • 19. Et plus encore : Java Groovy Scala Antlr Android Et en incubation : assembler C CPP Objective-C Objective-CPP
  • 20. Inconvénients par rapport à Ant Moins standardisant Moins de plugins disponible Heu… … Inconvénients par rapport à Maven