GRADLE                                   Grégory BOISSINOT                                        (@gboissinot)           ...
•  Consultant et formateur Zenika    – En charge du comité technique Intégration continue•  Contributeur et Committer pour...
•  Transformation dune production humaine (le code   source) en une représentation machine (le binaire)       Fichier     ...
INTERNET Event                          PollingEnvironment              ClearCase                SVN                GIT   ...
•  La nature des besoins dautomatisation a changé    Un build peut faire beaucoup plus de choses que la    simple création...
1ère génération   2ème génération                    3ème génération    2000                    2004                      ...
<!–- ANT -- build.xml --><project>   <target name="retrieceDeps>                               <!–- MAVEN – pom.xml-->    ...
•  Système de build complet focalisé sur le build des   applications dentreprise Java, Web, Groovy, Scala et   OSGI•  Flex...
Central       java.net                            Maven                       JBoss                                 …     ...
•  Spécification du quoi et pas du comment                             iture                        Fourn le              ...
On ne peut pas anticiper tous les besoins    Aucun projet nest réellement pareil!    Le projet évolue et donc son proces...
Écrire un script Gradle consiste à configurer un élément Project                                                  configur...
•  Conçu pour répondre à un maximum de scénarios    – Plusieurs répertoires de sources par projet    – Plusieurs artefacts...
La mise en œuvre de lAPI à                                        travers des tâches de                                   ...
Possibilité décrire du code Java/Groovy sous forme dunités detraitement réutilisables<!-- build.gradle -->                ...
ConventionTask                                         Mise à disposition dun ensemble                                    ...
<!– HelloTask.groovy -->class HelloTask extends DefaultTask {    def message="Default Message"    @TaskAction    public vo...
NantesJUG - Présentation Gradle   18
Chaque plugin- est un ensemble de tâches préconfigurées- expose un objet de configuration (avec des conventions)     Plugi...
Java Configuration    java                        Objectpublic class JavaPluginConvention {   public SouceSetContainer sou...
Mise à                          disposition                                                                globalConfig-1....
NantesJUG - Présentation Gradle   22
•  Possibilité de mettre en place des exclusions globales•  Flexibilité dans la définition des dépôts repositories{   mave...
apply plugin:javaprocessResources.enabled=falsetest.onlyIf{ !project.hasProperty(skipTests)}task(preJar)                  ...
src                                     apply plugin:java           main                                             sourc...
> gradle clean buildsourceSets{                                         :clean myGenSourceSet {                           ...
CONFIGURATION PHASE                                t1         t2   t3                           t1             t2   t3    ...
Soyez informé des événements: TestListener,     BuildListener, TaskActionListener, …class MyTestListener implements TestLi...
Les scripts dinitialisation permettent dinvoquer différents listeners au chargement du script//Script dinitialisationaddLi...
import org.junit.Assert                                                                   > gradle myziptask myzip (type:Z...
NantesJUG - Présentation Gradle   31
task generateTask(dependsOn:preSchemaGen) << {  ant.echo (message:"Generating ...")  ant {     def schemagenTaskPath = pat...
build.xml                  <project>                    <target name="antTarget">                      <echo message="Hell...
apply plugin:javarepositories {  mavenCental()  flatDir(dirs:destrepo,                                     IVY          na...
apply plugin:javaapply plugin:maven                                       Maven                                           ...
• Gestion avancée dun multi projet• Utilisation dun cache• Exécution parallèle des tests• Build daemon                   N...
// settings.gradle                                                    sharedinclude api,        shared,        services:we...
1.  Le script Gradle est compilé uniquement en cas de    changement2.  Détection des changements pour chaque entrée et    ...
class GenerateSchemaType extends DefaultTask {    String depsPath    @InputFiles    SourceDirectorySet inputXsdDirs    @Ou...
EXECUTION                                                         Process 1                                              P...
•  Utilisation dun processus parallèle pour éviter le cout de   lancement             > gradle build             ...      ...
NantesJUG - Présentation Gradle   42
1. Utilisation du plugin code-quality pour les outils de métriques Checkstyle et CodeNarc apply plugin:code-quality2 . Int...
configurations {       pmdConf}dependencies {       pmdConf pmd:pmd:4.2.5}task pmd << {       ant {                taskdef...
IDE                              MaturitéNetBeansEclipse                          +Eclipse STS                      ++Inte...
HUDSON                         JENKINSFonctionnalités:- Installation automatique de Gradle (via URL, Run Script)- Wizard d...
NantesJUG - Présentation Gradle   47
gmock                                                    security spock                                           integrat...
•  Mailing List très active•  User guide très riche (300 pages)•  Nombreuses contributions de plugins•  Le nombre darticle...
•  Conseil et Formation autour du produit                       NantesJUG - Présentation Gradle   50
NantesJUG - Présentation Gradle   51
Points forts                                             Faiblesses•  Mature                                         •  Pa...
Points forts                                             Faiblesses•  onvention over C                                    ...
Points forts                                              Faiblesses. Convention over                                   Sy...
Environment                                                        Instancie                      Processus identifié (tra...
NantesJUG - Présentation Gradle   56
•  Introduction de modèles de JVM basés sur la nature des   applications•  Amélioration du DSL du graphe des tâches•  Amél...
NantesJUG - Présentation Gradle   58
• Essayez-le !• Utilisez-le !• Faites du buzz!                  NantesJUG - Présentation Gradle   59
Prochain SlideShare
Chargement dans…5
×

gradle_nantesjug

570 vues

Publié le

0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
570
Sur SlideShare
0
Issues des intégrations
0
Intégrations
1
Actions
Partages
0
Téléchargements
7
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

gradle_nantesjug

  1. 1. GRADLE Grégory BOISSINOT (@gboissinot) 23/06/2011 NantesJUG - Présentation Gradle 1
  2. 2. •  Consultant et formateur Zenika – En charge du comité technique Intégration continue•  Contributeur et Committer pour Hudson/Jenkins – Intégration des chaînes de build Java (Gradle), C/C++, ADA – Maintenance corrective et évolutive des plugins réalisés – Développement de solutions transverses NantesJUG - Présentation Gradle 2
  3. 3. •  Transformation dune production humaine (le code source) en une représentation machine (le binaire) Fichier JAR Source Fichier Binaire JVM println "Hello World" A;^A^@^Am^A^@^T()Ljava/lang/Object;^C^ for (int i:[1,2,3]){ @^@^@^@^A^@^KHello World^H^@2^A^@- print i org/codehaus/groovy/runtime/callsite/ } CallSite^G^@4^A^@^KcallCurrent^A^@@ (Lgroovy/lang/GroovyObject; Ljava/lang/Object;)Ljava/lang/Object; ^L^@6^@7^K^@5^@8^C^@^@^@^A^L^@^H^ .... NantesJUG - Présentation Gradle 3
  4. 4. INTERNET Event PollingEnvironment ClearCase SVN GIT ... NantesJUG - Présentation Gradle 4
  5. 5. •  La nature des besoins dautomatisation a changé Un build peut faire beaucoup plus de choses que la simple création dune archive Java•  Les besoins dautomatisation ont augmentés significativement ces dernières années NantesJUG - Présentation Gradle 5
  6. 6. 1ère génération 2ème génération 3ème génération 2000 2004 2008 20082001 3 2 1 NantesJUG - Présentation Gradle 6
  7. 7. <!–- ANT -- build.xml --><project> <target name="retrieceDeps> <!–- MAVEN – pom.xml--> ... <?xml version="1.0" encoding="UTF-8"?> </target> <project> <target name="compile" ... <modelVersion>4.0.0</modelVersion></project> <groupId>org.lyonjug</groupId> <artifactId>maven</artifactId><!–- GRADLE– build.gradle --> <version>1.0</version>apply plugin:java <dependencies> <dependency>version=1.0 <groupId>org.apache.wicket</groupId> <artifactId>wicket</artifactId>repositories { <version>1.4.7</version> mavenCental() <scope>compile</scope> flatDir(dirs:lib) </dependency>} </dependencies> </project>dependencies { compile( group:org.apache.wicket, name:wicket, version:1.4.7)} NantesJUG - Présentation Gradle 7
  8. 8. •  Système de build complet focalisé sur le build des applications dentreprise Java, Web, Groovy, Scala et OSGI•  Flexible à la Ant avec les conventions de Maven à la demande•  Support et insertion totale dans des infrastructures Maven et Ant/Ivy existantes•  Modèle de description du build très riche à travers une API Java et une DSL Groovy NantesJUG - Présentation Gradle 8
  9. 9. Central java.net Maven JBoss … Codehaus Artifacts + maven meta Ivy Repository Artifacts + ivy meta Other Repository Artifacts + custom metaNantesJUG - Présentation Gradle 9
  10. 10. •  Spécification du quoi et pas du comment iture Fourn le yc dun c de vie Même ntionapply plugin:java > gradle clean build conve en av :clean que Mrepositories { :compileJava src mavenCentral() :processResources} :classes myLib main .jar :jardependencies { java :assemble compile :compileTestJava resources "jdom:jdom:1.1" :processTestResources testCompile :testClasses "junit:junit:4.8" :test test} :check java :build BUILD SUCCESSFUL resources NantesJUG - Présentation Gradle 10
  11. 11. On ne peut pas anticiper tous les besoins  Aucun projet nest réellement pareil!  Le projet évolue et donc son processus dintégration évolue aussiIl est important de fournir un niveau de support équivalent entre lesanciens projets que les nouveaux projets NantesJUG - Présentation Gradle 11
  12. 12. Écrire un script Gradle consiste à configurer un élément Project configurationsbuild.gradle repositories dependencies Project ant Eléments task personnalisés artifacts Public API NantesJUG - Présentation Gradle 12
  13. 13. •  Conçu pour répondre à un maximum de scénarios – Plusieurs répertoires de sources par projet – Plusieurs artefacts générés par projet – Gestion de classpath distinct pour les tests dintégration – ....•  De nombreux points dextension pour enrichir les éléments existants Possibilité de former un modèle de build (un ensemble de conventions), le tout dans une approche déclarative NantesJUG - Présentation Gradle 13
  14. 14. La mise en œuvre de lAPI à travers des tâches de traitement compile jar test custom build warUn processus Gradleest un ensemble de tâches NantesJUG - Présentation Gradle 14
  15. 15. Possibilité décrire du code Java/Groovy sous forme dunités detraitement réutilisables<!-- build.gradle --> API Gradletask(boucleTask).doLast{ for (int i:[1,2,3]){ print i }} AAPI Java/Groovyvoid printMessage(String message){ > gradle boucleTask println "Print " + message :boucleTask} 123task(distribution).doLast { printMessage("Distribution") > gradle distribution} :distribution Print Distributiontask(release)release.dependsOn(distribution) > gradle release :distributionrelease.doLast{ Print Distribution println "Print Release" :release} Print Release NantesJUG - Présentation Gradle 15
  16. 16. ConventionTask Mise à disposition dun ensemble de tâches prédéfinies AbstractCopyTask SourceTask Facile à Facile à utiliser étendreAbstractArchiveTask Copy Javadoc public class Copy extends AbstractCopyTask { public AbstractCopyTask from(Object... sourcePaths); Zip Tar public AbstractCopyTask into(Object destDir); public AbstractCopyTask include(String... includes); . . . } Jar task mycopy (type:Copy){ description =Copies the resources dir from(file(resources)) into(file(destination)) War include(**/*.txt, **/*.xml) } NantesJUG - Présentation Gradle 16
  17. 17. <!– HelloTask.groovy -->class HelloTask extends DefaultTask { def message="Default Message" @TaskAction public void print(){ > gradle myhello println message :myhello } Default Message} > gradle myhello2 :myhello2<!-- build.gradle --> Task Messagetask(myhello, type:HelloTask)task(myhello2, type:HelloTask){ message="Task Message"} NantesJUG - Présentation Gradle 17
  18. 18. NantesJUG - Présentation Gradle 18
  19. 19. Chaque plugin- est un ensemble de tâches préconfigurées- expose un objet de configuration (avec des conventions) Plugins maven Java Configuration Object eclipse idea Jetty Configuration War Configuration Object Object code-quality war projects-reports java … … jetty osgi … scala ... Project Configuration NantesJUG - Présentation Gradle 19
  20. 20. Java Configuration java Objectpublic class JavaPluginConvention { public SouceSetContainer sourceSets(); public void setSourceCompatibility(Object value); public void setTargetCompatibility(Object value); public Manifest manifest() . . .} <!-- build.gradle --> Facile à apply plugin:java mettre en Simple à place et apprendre facile à sourceCompatibility = 1.6 maintenir targetCompatibility = 1.6 NantesJUG - Présentation Gradle 20
  21. 21. Mise à disposition globalConfig-1.0.gradle <!– build.gradle --> task globalConfig { ... } Utilisation<!– build.gradle --> > gradle configapply from "http://repomanager/globalConfig-1.0.gradle" ...... NantesJUG - Présentation Gradle 21
  22. 22. NantesJUG - Présentation Gradle 22
  23. 23. •  Possibilité de mettre en place des exclusions globales•  Flexibilité dans la définition des dépôts repositories{ mavenCentral() mavenRepo urls:"http://download.java.net/maven/2/" flatDir name:localRepository, dirs: lib }•  Possibilité de définir les dépendances et les déepdances transitives directement dans le script Gradle dependencies { runtime module("org.codehaus.groovy:groovy-all:1.7.5") { dependency("commons-cli:commons-cli:1.0") { transitive = false } } } NantesJUG - Présentation Gradle 23
  24. 24. apply plugin:javaprocessResources.enabled=falsetest.onlyIf{ !project.hasProperty(skipTests)}task(preJar) > gradle build –PskipTestsjar.dependsOn preJar :compileJava :processResources SKIPPED//Change the source directory :classessourceSets{ :preJar main{ :jar :assemble java.srcDirs file(src/java), :compileTestJava file(src/java2) :processTestResources } :testClasses} :test SKIPPED :check//Création dun uberjar :buildjar { configurations.compile.each { BUILD SUCCESSFUL from zipTree (it) }} NantesJUG - Présentation Gradle 24
  25. 25. src apply plugin:java main sourceSets{ ... myGenSourceSet { test java { ... srcDir output/generated } output } generated }Mise à disposition automatique > gradle clean build dun ensemble de tâches de :cleantraitement pour le build de cet :generateTask ensemble de fichiers . . . :compileMyGenSourceSetJava :processMyGenSourceSetResources :myGenSourceSetClasses . . . NantesJUG - Présentation Gradle 25
  26. 26. > gradle clean buildsourceSets{ :clean myGenSourceSet { :generateTask java { :compileMyGenSourceSetJava srcDir output/generated :processMyGenSourceSetResources } :myGenSourceSetClasses :compileJava main { :processResources compileClasspath = :classes configurations.compile . . . + sourceSets.myGenSourceSet.classes runtimeClasspath = classes + configurations.runtime + sourceSets.myGenSourceSet.classes }}jar { from sourceSets.myGenSourceSet.classes} NantesJUG - Présentation Gradle 26
  27. 27. CONFIGURATION PHASE t1 t2 t3 t1 t2 t3 EXECUTION PHASEGRADLE t4 t4 HOOKSCRIPT Project Project Engine Convention 1 Convention 2gradle properties gradle.taskGraph.whenReady { taskGraph ->gradle tasks if (taskGraph.hasTask(:release)){gradle dependencies status = releasegradle –-dry-run build } } // Other hooks gradle.taskGraph.beforeTask { task -> .. . gradle.beforeProject { project -> .. . ... NantesJUG - Présentation Gradle 27
  28. 28. Soyez informé des événements: TestListener, BuildListener, TaskActionListener, …class MyTestListener implements TestListener{ beforeTest void beforeTest(TestDescriptor test) { GRADLE println testStarting: +test.getName() } Test (junit) void afterTest(TestDescriptor test, TestResult result) { println testFinished: +test.getName() afterTest +, result: +result.getResultType() }} NantesJUG - Présentation Gradle 28
  29. 29. Les scripts dinitialisation permettent dinvoquer différents listeners au chargement du script//Script dinitialisationaddListener(new ApplyEclipsePlugin())class ApplyEclipsePlugin extends BuildAdapter { Invoquer par défaut public void projectsEvaluated(Gradle gradle){ si placé dans le gradle.rootProject.allprojects { home de apply plugin:eclipse lutilisateur } }}gradle eclipse –I init.gradle NantesJUG - Présentation Gradle 29
  30. 30. import org.junit.Assert > gradle myziptask myzip (type:Zip) { :myzip from(somedir) include(*.txt) baseName=zipname doLast { Assert.assertEquals(zipname.zip, myzip.archiveName) createZip Assert.assertEquals(file(build/distributions), myzip.destinationDir) Assert.assertTrue( zipname .zip !zipTree(myzip.archivePath).isEmpty()) txtfiles = fileTree(somedir).include(*.txt) check ziptxtfiles=zipTree(myzip.archivePath).matching{ include(*.txt) } Assert.assertEquals ( txtfiles.getFiles().size(), BUILD SUCCESSFUL ziptxtfiles.getFiles().size()) > }} NantesJUG - Présentation Gradle 30
  31. 31. NantesJUG - Présentation Gradle 31
  32. 32. task generateTask(dependsOn:preSchemaGen) << { ant.echo (message:"Generating ...") ant { def schemagenTaskPath = path { fileset(dirs:lib, includes: *.jar) } taskdef ( name: "xjc", classname: "com.sun.tools.xjc.XJCTask", classpath: schemagenTaskPath ) xjc(destdir:generatedSources, package:"com.zenika.lib.model"){ schema(dir:"src/main/resources", includes:"**/*.xsd") } }} NantesJUG - Présentation Gradle 32
  33. 33. build.xml <project> <target name="antTarget"> <echo message="Hello from Ant"/> </target> </project> build.gradle ant.importBuild(build.xml) antTarget.doLast { println(Hello from Gradle) }> gradle antTarget:antTargetHello from AntHello from Gradle NantesJUG - Présentation Gradle 33
  34. 34. apply plugin:javarepositories { mavenCental() flatDir(dirs:destrepo, IVY name:ivyrep’)}group=com.zenika.gradledemos > gradle uploadArchivesversion=1.0status=releaseuploadArchives { repositories { add(repositories.ivyrep) }} Repository Ivy distant Artifacts + meta Ivy NantesJUG - Présentation Gradle 34
  35. 35. apply plugin:javaapply plugin:maven Maven Antgroup=test Tasksversion=1.0-SNAPSHOTuploadArchives { repositories { mavenDeployer { repository( > gradle > gradle install uploadArchives url: remoteRepo) } }} Repository Repository Maven Maven Local Artifacts + distant Artifacts + meta Maven meta Maven NantesJUG - Présentation Gradle 35
  36. 36. • Gestion avancée dun multi projet• Utilisation dun cache• Exécution parallèle des tests• Build daemon NantesJUG - Présentation Gradle 36
  37. 37. // settings.gradle sharedinclude api, shared, services:webservices webservices api// root build.gradlesubprojects { api > gradle buildNeeded apply plugin: java :shared:jar} :api:jarproject(:api) { :api:test dependencies { :shared:test compile project(:shared) }} api > gradle buildDependents :shared:jar :api:jar// webservices/build.gradleapply plugin:war :api:test :webservices:wardependencies { :webservices:test compile project(:shared), project(:api), api > gradle jar –-no-rebuild commons-io:commons-io:1.2 api:jar} NantesJUG - Présentation Gradle 37
  38. 38. 1.  Le script Gradle est compilé uniquement en cas de changement2.  Détection des changements pour chaque entrée et chaque sortie pour la plupart des tâches fournies > gradle myzip :myzip > gradle myzip :myzip UP-TO-DATE > gradle myzip –-cache rebuild :myzip NantesJUG - Présentation Gradle 38
  39. 39. class GenerateSchemaType extends DefaultTask { String depsPath @InputFiles SourceDirectorySet inputXsdDirs @OutputDirectory File outputFile > gradle build :generateTask UP-TO-DATE @TaskAction :compileGeneratedJava UP-TO-DATE void generate() { :processGeneratedResources UP-TO-DATE ant { ...} :generatedClasses UP-TO-DATE } :compileJava UP-TO-DATE} ...task generateTask(type:GenerateSchemaType) { inputXsdDirs = sourceSets.main.resources outputFile = generatedSources depsPath = configurations.jaxb.asPath} NantesJUG - Présentation Gradle 39
  40. 40. EXECUTION Process 1 Process 6 TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST CLASS CLASS CLASS CLASS CLASS CLASS CLASS CLASS CLASS CLASSPARALLELISATION Process 2 Process 7 TEST TEST TEST TEST TEST TEST TEST CLASS CLASS CLASS CLASS CLASS CLASS CLASS Process 3 TEST TEST TEST TEST TEST CLASS CLASS CLASS CLASS CLASS apply plugin:java Process 4 TEST TEST TEST TEST TEST CLASS CLASS CLASS CLASS CLASS test { forkEvery = 5 maxParallelForks = 4 } NantesJUG - Présentation Gradle 40
  41. 41. •  Utilisation dun processus parallèle pour éviter le cout de lancement > gradle build ... Total time: 3s > gradle build –daemon ... Total time: 3s > gradle build ... Total time: 1s•  Va favoriser lintégration de Gradle avec Gradle UI et les IDE (Eclipse, IDEA, ...) NantesJUG - Présentation Gradle 41
  42. 42. NantesJUG - Présentation Gradle 42
  43. 43. 1. Utilisation du plugin code-quality pour les outils de métriques Checkstyle et CodeNarc apply plugin:code-quality2 . Intégration complète via lutilisation des tâches Ant des outils de métriques NantesJUG - Présentation Gradle 43
  44. 44. configurations { pmdConf}dependencies { pmdConf pmd:pmd:4.2.5}task pmd << { ant { taskdef(name:pmd, classname:net.sourceforge.pmd.ant.PMDTask, classpath: configurations.pmdConf.asPath) pmd(shortFilenames:true, failonruleviolation:true, rulesetfiles:conf/pmd-rules.xml) { formatter(type:text, toConsole:true) fileset(dir: "src/main/java") { include(name: **/*.java) } } }} 44 NantesJUG - Présentation Gradle
  45. 45. IDE MaturitéNetBeansEclipse +Eclipse STS ++IntelliJ ++ NantesJUG - Présentation Gradle 45
  46. 46. HUDSON JENKINSFonctionnalités:- Installation automatique de Gradle (via URL, Run Script)- Wizard de configuration- Utilisation possible du Gradle wrapper NantesJUG - Présentation Gradle 46
  47. 47. NantesJUG - Présentation Gradle 47
  48. 48. gmock security spock integration 4 NantesJUG - Présentation Gradle 48
  49. 49. •  Mailing List très active•  User guide très riche (300 pages)•  Nombreuses contributions de plugins•  Le nombre darticles et de conférences sur le sujet augmentent NantesJUG - Présentation Gradle 49
  50. 50. •  Conseil et Formation autour du produit NantesJUG - Présentation Gradle 50
  51. 51. NantesJUG - Présentation Gradle 51
  52. 52. Points forts Faiblesses•  Mature •  Pas de conventions par défaut•  Fiable •  erbeux (syntaxe XML V•  Flexible et extensible lourde)•  ecture et écriture dans un L •  ntégration de Ivy à Ant Irepository Maven souvent trop manuelle•  ontruction automatique Cdes classpath entre vos Menacessous-projets •  Nécessiter de se former à lutilisation du couple Ant/Ivy dans le cadre de la mise en place de fonctionnalités avancées NantesJUG - Présentation Gradle 52
  53. 53. Points forts Faiblesses•  onvention over C •  aible gestion des Fconfiguration dépendances•  ycle de vie C •  Non distinction entre la•  ystème de plugins S version technique et la version commerciale du•  Son écosystème produitdutilisateurs •  rocessus rigide (exemple P dune ossature de build Menaces figée)•  ifficulté dans la Dreproductibilité du build•  ncompatibilité dans la Igestion de versions avecun système extérieur NantesJUG - Présentation Gradle 53
  54. 54. Points forts Faiblesses. Convention over Système de build trèsconfiguration à la récentdemande. Cycle de vie fournit et Menacesfacilement modifiable. Système de plugins . Incertitude sur la. Intégration avec pérennitétoutes lesinfrastructures Ant/Ivy . DSL Groovy peu êtreet Maven existantes modifié. Possibilité de mise enplace dun buildincrémental sur denombreuses étapes deson build NantesJUG - Présentation Gradle 54
  55. 55. Environment Instancie Processus identifié (traçabilité) et répétable DEPLOY TEST BUILD RELEASE INSTALL VALIDATION NantesJUG - Présentation Gradle 55
  56. 56. NantesJUG - Présentation Gradle 56
  57. 57. •  Introduction de modèles de JVM basés sur la nature des applications•  Amélioration du DSL du graphe des tâches•  Amélioration de la gestion de dépendances•  Réutilisation possible des plugins Maven•  Plusieurs livres sur les cas dutilisations en cours déditions (OReilly)•  Une communauté plus large NantesJUG - Présentation Gradle 57
  58. 58. NantesJUG - Présentation Gradle 58
  59. 59. • Essayez-le !• Utilisez-le !• Faites du buzz! NantesJUG - Présentation Gradle 59

×