SlideShare une entreprise Scribd logo
GRADLE
                                  Grégory BOISSINOT
                                       (@gboissinot)
                                        18/05/2011




 ToursJUG - Présentation Gradle                        1
•  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




                          ToursJUG - Présentation Gradle           2
•  Transformation d'une 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^
                                              ....
                             ToursJUG - Présentation Gradle                            3
INTERNET


Change




           Polling

     ENV




                     ToursJUG - Présentation Gradle              4
•  La nature des besoins d'automatisation a changé
    Un build peut faire beaucoup plus de choses que la
    simple création d'une archive Java




•  Les besoins d'automatisation ont augmentés
   significativement ces dernières années

                       ToursJUG - Présentation Gradle    5
1ère génération   2ème génération                   3ème génération
    2000                    2004                           2008

                                                    2008

2001


                                                                       3


                                              2

               1

                   ToursJUG - Présentation Gradle                          6
<!–- 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')
}
                            ToursJUG - Présentation Gradle              7
•  Système de build complet focalisé sur le build des
   applications d'entreprise 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


                        ToursJUG - Présentation Gradle          8
Central       java.net
                            Maven


                       JBoss                                 …
                                      Codehaus

                                                         Artifacts +
                                                         maven meta




                      Ivy
                   Repository
                   Artifacts +
                    ivy meta
                                        Other
                                      Repository
                                           Artifacts +
                                          custom meta


ToursJUG - Présentation Gradle                                         9
•  Spécification du 'quoi' et pas du 'comment'
                             iture
                        Fourn le
                              yc
                        d'un c
                           de vie
                                                                                Même
                                                                                    ntion
apply plugin:'java'    > gradle clean build                                   conve en
                                                                                     av
                       :clean                                                  que M
repositories {         :compileJava
                                                                                   src
  mavenCental()        :processResources
}                      :classes                                       myLib              main
                                                                      .jar
                       :jar
dependencies {                                                                                  java
                       :assemble
  compile              :compileTestJava                                                         resources
   "jdom:jdom:1.1"     :processTestResources
  testCompile          :testClasses
   "junit:junit:4.8"   :test                                                             test
}                      :check
                                                                                                java
                       :build

                       BUILD SUCCESSFUL                                                         resources




                                     ToursJUG - Présentation Gradle                                         10
On ne peut pas anticiper tous les besoins
    Aucun projet n'est réellement pareil!
    Le projet évolue et donc son processus d'intégration évolue aussi




Il est important de fournir au minimum le même niveau de support
pour les anciens projets que les nouveaux projets




                            ToursJUG - Présentation Gradle               11
Écrire un script Gradle consiste à configurer un élément 'Project'



                                                   configurations
build.gradle
                          repositories
                                                                     dependencies




                                   Project                                  ant



                                                                 Eléments
                        task                                     personnalisés


                                           artifacts




                                                 Public
                                                  API
                                ToursJUG - Présentation Gradle                      12
•  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
      d'intégration
    – ....

•  De nombreux points d'extension 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


                       ToursJUG - Présentation Gradle   13
La mise en œuvre de l'API à
                                        travers des tâches de
                                        traitement




    compile   jar     test         custom

                                                 build
              war


Un processus Gradle
est un ensemble de tâches

                    ToursJUG - Présentation Gradle                    14
Possibilité d'écrire du code Java/Groovy sous forme d'unités de
traitement réutilisables

<!-- build.gradle -->                          Gradle
task(boucleTask).doLast{
  for (int i:[1,2,3]){ print i }
}                                               Java/
                                               Groovy

void printMessage(String message){
                                                       > gradle boucleTask
  println "Print " + message                           :boucleTask
}                                                      123
task(distribution).doLast {
    printMessage("Distribution")                       > gradle distribution
}                                                      :distribution
                                                       Print Distribution
task(release)
release.dependsOn(distribution)                        > gradle release
                                                       :distribution
release.doLast{                                        Print Distribution
    println "Print Release"                            :release
}                                                      Print Release

                            ToursJUG - Présentation Gradle                     15
ConventionTask                                          Mise à disposition d'un ensemble
                                                         de tâches prédéfinies
                                                         - réutilisables
                                                         - faciles à étendre
 AbstractCopyTask     SourceTask




AbstractArchiveTask     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')
                                   }

                                     ToursJUG - Présentation Gradle                          16
• Les plugins Gradle

• Insertion dans un environnement agile




                   ToursJUG - Présentation Gradle   17
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

                                  ToursJUG - Présentation Gradle                                         18
Java Configuration
    java                        Object




public 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


                             ToursJUG - Présentation Gradle                           19
Mise à
                          disposition




                                                                globalConfig-1.0.gradle
 <!– build.gradle -->
 task globalConfig {
   ...
 }
                                     Utilisation




<!– build.gradle -->                                                             > gradle config
apply from "http://repomanager/globalConfig-1.0.gradle"                          ...
...

                               ToursJUG - Présentation Gradle                                      20
ToursJUG - Présentation Gradle   21
•  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
         }
     }
 }
                         ToursJUG - Présentation Gradle         22
apply plugin:'java'

processResources.enabled=false
test.onlyIf{
 !project.hasProperty('skipTests')}

task(preJar)                                              > gradle build –PskipTests
jar.dependsOn preJar                                      :compileJava
                                                          :processResources SKIPPED
//Change the source directory                             :classes
sourceSets{                                               :preJar
  main{                                                   :jar
                                                          :assemble
    java.srcDirs file('src/java'),                        :compileTestJava
                 file('src/java2')                        :processTestResources
  }                                                       :testClasses
}                                                         :test SKIPPED
                                                          :check
//Création d'un uberjar                                   :build
jar {
  configurations.compile.each {                           BUILD SUCCESSFUL
      from zipTree (it) }
}
                         ToursJUG - Présentation Gradle                           23
apply plugin:'java'                             > gradle clean build
                                                :clean
sourceSets{                                     :generateTask
                                                . . .
  myGenSourceSet {                              :compileMyGenSourceSetJava
    java {                                      :processMyGenSourceSetResources
      srcDir 'output/generated'                 :myGenSourceSetClasses
    }                                           . . .
  }
}



  Mise à disposition automatique d'un ensemble de tâches de traitement
                    pour le nouveau besoin fonctionnel




                            ToursJUG - Présentation Gradle                        24
> gradle clean build
sourceSets{                                         :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
}
                            ToursJUG - Présentation Gradle                            25
CONFIGURATION PHASE

                                t1         t2   t3                           t1            t2   t3




                                                                                                     EXECUTION PHASE
GRADLE
                                      t4                                              t4




                                                                HOOK
SCRIPT


                                       Project                                         Project                         Engine
                                     Convention 1                                    Convention 2




gradle   –-properties                           gradle.taskGraph.whenReady { taskGraph ->
gradle   –-tasks                                  if (taskGraph.hasTask(':release')){
gradle   –-dependencies                                 status = 'release'
gradle   –-dry-run build                          }
                                                }

                                                // Other hooks
                                                gradle.taskGraph.beforeTask { task -> .. .
                                                gradle.beforeProject { project -> .. .
                                                ...
                                                    ToursJUG - Présentation Gradle                                              26
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()
    }
}




                              ToursJUG - Présentation Gradle                         27
import org.junit.Assert
                                                                   > gradle myzip
task 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())                       >
    }
}




                                  ToursJUG - Présentation Gradle                          28
ToursJUG - Présentation Gradle   29
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")
     }
   }
}




                        ToursJUG - Présentation Gradle         30
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
:antTarget
Hello from Ant
Hello from Gradle

                ToursJUG - Présentation Gradle          31
apply plugin:'java'

repositories {
  mavenCental()
  flatDir(dirs:'destrepo',                                    IVY
          name:'ivyrep’)
}

group='com.zenika.gradledemos'                                  > gradle uploadArchives
version='1.0'
status='release'

uploadArchives {
  repositories {
    add(repositories.ivyrep)
  }
}                                                         Repository
                                                             Ivy
                                                           distant Artifacts +
                                                                       meta Ivy



                         ToursJUG - Présentation Gradle                                   32
apply plugin:'java'
apply plugin:'maven'                                      Maven
                                                           Ant
group='test'                                              Tasks
version='1.0-SNAPSHOT'

uploadArchives {
  repositories {
    mavenDeployer {
      repository(                        > gradle           > gradle
                                           install            uploadArchives
         url: remoteRepo)
    }
  }
}



                            Repository                    Repository
                              Maven                         Maven
                              Local Artifacts +            distant Artifacts +
                                            meta Maven
                                                                      meta Maven


                         ToursJUG - Présentation Gradle                            33
• Gestion avancée d'un multi projet

• Utilisation d'un cache

• Exécution parallèle des tests

• Build daemon


                    ToursJUG - Présentation Gradle   34
// settings.gradle                                                   shared
include 'api',
        'shared',
        'services:webservices'
                                                            webservices       api
// root build.gradle
subprojects {                                  api > gradle buildNeeded
  apply plugin: 'java'                         :shared:jar
}                                              :api:jar
project(':api') {                              :api:test
  dependencies {                               :shared:test
    compile project(':shared')
  }
}                                              api > gradle buildDependents
                                               :shared:jar
                                               :api:jar
// webservices/build.gradle
apply plugin:'war'                             :api:test
                                               :webservices:war
dependencies {
                                               :webservices:test
  compile
    project(':shared'),
    project(':api'),                           api > gradle jar –-no-rebuild
   'commons-io:commons-io:1.2'                 api:jar
}
                           ToursJUG - Présentation Gradle                           35
1.  Le script Gradle est compilé uniquement en cas de
    changement


2.  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



                       ToursJUG - Présentation Gradle     36
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
}
                          ToursJUG - Présentation Gradle                  37
EXECUTION
                                                         Process 1                                              Process 6
                   TEST    TEST    TEST    TEST    TEST                  TEST        TEST    TEST    TEST    TEST
                  CLASS   CLASS   CLASS   CLASS   CLASS                 CLASS       CLASS   CLASS   CLASS   CLASS
PARALLELISATION




                                                         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
                                                                           }




                                                   ToursJUG - Présentation Gradle                                      38
•  Utilisation d'un 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 l'intégration de Gradle avec Gradle UI et les
   IDE (Eclipse, IDEA, ...)


                         ToursJUG - Présentation Gradle          39
IDE                           Maturité
NetBeans
Eclipse                       +
IntelliJ                      ++



           ToursJUG - Présentation Gradle   40
ToursJUG - Présentation Gradle   41
gmock

                                                   security
 spock



                                          integration




                                                        4



         ToursJUG - Présentation Gradle                       42
•  Mailing List très active

•  User guide très riche (300 pages)

•  Nombreuses contributions de plugins

•  Le nombre d'articles et de conférences sur le sujet
   augmentent




                              ToursJUG - Présentation Gradle   43
•  Fourniture de consulting et de formation




                        ToursJUG - Présentation Gradle   44
ToursJUG - Présentation Gradle   45
•  Introduction de modèles de JVM basés sur la nature des
   applications

•  Amélioration du DSL du graphe des tâches

•  Réutilisation possible des plugins Maven

•  Un livre en préparation

•  Une communauté plus large




                         ToursJUG - Présentation Gradle     46
ToursJUG - Présentation Gradle   47
• Essayez-le !

• Utilisez-le !

• Faites du buzz!




                  ToursJUG - Présentation Gradle   48

Contenu connexe

Tendances

Presentation of GWT 2.4 (PDF version)
Presentation of GWT 2.4 (PDF version)Presentation of GWT 2.4 (PDF version)
Presentation of GWT 2.4 (PDF version)
Celinio Fernandes
 
Présentation1
Présentation1Présentation1
Présentation1
Boulkenafet samir
 
Quand java prend de la vitesse, apache maven vous garde sur les rails
Quand java prend de la vitesse, apache maven vous garde sur les railsQuand java prend de la vitesse, apache maven vous garde sur les rails
Quand java prend de la vitesse, apache maven vous garde sur les rails
Arnaud Héritier
 
Soiree Maven 2
Soiree Maven 2Soiree Maven 2
Soiree Maven 2
Laurent RUAUD
 
Presentation of GWT 2.4 (PowerPoint version)
Presentation of GWT 2.4 (PowerPoint version)Presentation of GWT 2.4 (PowerPoint version)
Presentation of GWT 2.4 (PowerPoint version)
Celinio Fernandes
 
Une (simple) présentation de Apache Maven 2
Une (simple) présentation de Apache Maven 2Une (simple) présentation de Apache Maven 2
Une (simple) présentation de Apache Maven 2
teejug
 
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
 
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
Zenika
 
Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011
Sylvain Wallez
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven
Arnaud Héritier
 
JCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueJCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratique
Rossi Oddet
 
GWT Principes & Techniques
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & Techniques
Rachid NID SAID
 
Apache Maven 3
Apache Maven 3Apache Maven 3
Apache Maven 3
Maxime Gréau
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Ippon
 
Maven
MavenMaven
CDI mis en pratique avec Seam Social et Weld OSGI
CDI mis en pratique avec Seam Social et Weld OSGICDI mis en pratique avec Seam Social et Weld OSGI
CDI mis en pratique avec Seam Social et Weld OSGI
Antoine Sabot-Durand
 
Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)
Eric SIBER
 
Support formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec DockerSupport formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec Docker
SmartnSkilled
 

Tendances (20)

Presentation of GWT 2.4 (PDF version)
Presentation of GWT 2.4 (PDF version)Presentation of GWT 2.4 (PDF version)
Presentation of GWT 2.4 (PDF version)
 
Présentation1
Présentation1Présentation1
Présentation1
 
Quand java prend de la vitesse, apache maven vous garde sur les rails
Quand java prend de la vitesse, apache maven vous garde sur les railsQuand java prend de la vitesse, apache maven vous garde sur les rails
Quand java prend de la vitesse, apache maven vous garde sur les rails
 
Soiree Maven 2
Soiree Maven 2Soiree Maven 2
Soiree Maven 2
 
Presentation of GWT 2.4 (PowerPoint version)
Presentation of GWT 2.4 (PowerPoint version)Presentation of GWT 2.4 (PowerPoint version)
Presentation of GWT 2.4 (PowerPoint version)
 
Sonar-Hodson-Maven
Sonar-Hodson-MavenSonar-Hodson-Maven
Sonar-Hodson-Maven
 
Une (simple) présentation de Apache Maven 2
Une (simple) présentation de Apache Maven 2Une (simple) présentation de Apache Maven 2
Une (simple) présentation de Apache Maven 2
 
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)
 
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
 
Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven
 
JCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueJCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratique
 
GWT Principes & Techniques
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & Techniques
 
Apache Maven 3
Apache Maven 3Apache Maven 3
Apache Maven 3
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
 
Maven
MavenMaven
Maven
 
CDI mis en pratique avec Seam Social et Weld OSGI
CDI mis en pratique avec Seam Social et Weld OSGICDI mis en pratique avec Seam Social et Weld OSGI
CDI mis en pratique avec Seam Social et Weld OSGI
 
Springioc
SpringiocSpringioc
Springioc
 
Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)
 
Support formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec DockerSupport formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec Docker
 

En vedette

L’impacte de l’accés obert en la comunicació científica
L’impacte de l’accés obert en la comunicació científicaL’impacte de l’accés obert en la comunicació científica
L’impacte de l’accés obert en la comunicació científica
Ernest Abadal
 
Analyse technique 27 avril 2010
Analyse technique 27 avril  2010Analyse technique 27 avril  2010
Analyse technique 27 avril 2010
Cherradi -
 
Analyse Technique 29 Mars 2010
Analyse Technique 29 Mars 2010Analyse Technique 29 Mars 2010
Analyse Technique 29 Mars 2010
Cherradi -
 
FR - Paramétrage - Gestion des articles
FR - Paramétrage - Gestion des articlesFR - Paramétrage - Gestion des articles
FR - Paramétrage - Gestion des articles
A3C - Expert Comptable à Dunkerque
 
Construccion email marketing
Construccion email marketingConstruccion email marketing
Construccion email marketing
MasterBase®
 
Saint-Louis programme culturel novembre 2014
Saint-Louis  programme culturel novembre 2014Saint-Louis  programme culturel novembre 2014
Saint-Louis programme culturel novembre 2014
Bâle Région Mag
 
Cómo acceder a la plataforma
Cómo acceder a la plataforma Cómo acceder a la plataforma
Cómo acceder a la plataforma
juanjoreverte
 
Faetón y el carro del sol. La Ilíada. César Crespo
Faetón y el carro del sol. La Ilíada.  César CrespoFaetón y el carro del sol. La Ilíada.  César Crespo
Faetón y el carro del sol. La Ilíada. César Crespo
rufasanchez
 
Analyse technique 12 mai 2010
Analyse technique 12 mai 2010Analyse technique 12 mai 2010
Analyse technique 12 mai 2010
Cherradi -
 
Minne Antoine
Minne AntoineMinne Antoine
Minne Antoine
minne
 
Más allá de la Web 2.0: La Web Semántica
Más allá de la Web 2.0: La Web SemánticaMás allá de la Web 2.0: La Web Semántica
Más allá de la Web 2.0: La Web Semántica
Guy Van Peel
 
Ecommerce night - Vip soul - Universidad del Pacífico 15/08/2013
Ecommerce night - Vip soul - Universidad del Pacífico 15/08/2013 Ecommerce night - Vip soul - Universidad del Pacífico 15/08/2013
Ecommerce night - Vip soul - Universidad del Pacífico 15/08/2013
Neo Consulting
 
Juillet2006
Juillet2006Juillet2006
Juillet2006
ecrivains-vendee
 
ou sont vos lcients- pour artisans du btp
ou sont vos lcients- pour artisans du btpou sont vos lcients- pour artisans du btp
ou sont vos lcients- pour artisans du btp
Mira Lavandier
 
Comment aménager un coin bureau?
Comment aménager un coin bureau?Comment aménager un coin bureau?
Comment aménager un coin bureau?
Mira Lavandier
 
Les comportements d’achats multicanaux des internautes
Les comportements d’achats multicanaux des internautesLes comportements d’achats multicanaux des internautes
Les comportements d’achats multicanaux des internautes
Vincent DEMULIERE
 
J6 E-DISTRIBUTION HÔTELS
J6  E-DISTRIBUTION HÔTELSJ6  E-DISTRIBUTION HÔTELS
J6 E-DISTRIBUTION HÔTELS
Salon e-tourisme #VeM
 
Lesson 8 2 proportions
Lesson 8 2 proportionsLesson 8 2 proportions
Lesson 8 2 proportions
mlabuski
 
Tableau noir
Tableau noirTableau noir
Tableau noir
yvanv
 

En vedette (20)

L’impacte de l’accés obert en la comunicació científica
L’impacte de l’accés obert en la comunicació científicaL’impacte de l’accés obert en la comunicació científica
L’impacte de l’accés obert en la comunicació científica
 
Glossaire général
Glossaire généralGlossaire général
Glossaire général
 
Analyse technique 27 avril 2010
Analyse technique 27 avril  2010Analyse technique 27 avril  2010
Analyse technique 27 avril 2010
 
Analyse Technique 29 Mars 2010
Analyse Technique 29 Mars 2010Analyse Technique 29 Mars 2010
Analyse Technique 29 Mars 2010
 
FR - Paramétrage - Gestion des articles
FR - Paramétrage - Gestion des articlesFR - Paramétrage - Gestion des articles
FR - Paramétrage - Gestion des articles
 
Construccion email marketing
Construccion email marketingConstruccion email marketing
Construccion email marketing
 
Saint-Louis programme culturel novembre 2014
Saint-Louis  programme culturel novembre 2014Saint-Louis  programme culturel novembre 2014
Saint-Louis programme culturel novembre 2014
 
Cómo acceder a la plataforma
Cómo acceder a la plataforma Cómo acceder a la plataforma
Cómo acceder a la plataforma
 
Faetón y el carro del sol. La Ilíada. César Crespo
Faetón y el carro del sol. La Ilíada.  César CrespoFaetón y el carro del sol. La Ilíada.  César Crespo
Faetón y el carro del sol. La Ilíada. César Crespo
 
Analyse technique 12 mai 2010
Analyse technique 12 mai 2010Analyse technique 12 mai 2010
Analyse technique 12 mai 2010
 
Minne Antoine
Minne AntoineMinne Antoine
Minne Antoine
 
Más allá de la Web 2.0: La Web Semántica
Más allá de la Web 2.0: La Web SemánticaMás allá de la Web 2.0: La Web Semántica
Más allá de la Web 2.0: La Web Semántica
 
Ecommerce night - Vip soul - Universidad del Pacífico 15/08/2013
Ecommerce night - Vip soul - Universidad del Pacífico 15/08/2013 Ecommerce night - Vip soul - Universidad del Pacífico 15/08/2013
Ecommerce night - Vip soul - Universidad del Pacífico 15/08/2013
 
Juillet2006
Juillet2006Juillet2006
Juillet2006
 
ou sont vos lcients- pour artisans du btp
ou sont vos lcients- pour artisans du btpou sont vos lcients- pour artisans du btp
ou sont vos lcients- pour artisans du btp
 
Comment aménager un coin bureau?
Comment aménager un coin bureau?Comment aménager un coin bureau?
Comment aménager un coin bureau?
 
Les comportements d’achats multicanaux des internautes
Les comportements d’achats multicanaux des internautesLes comportements d’achats multicanaux des internautes
Les comportements d’achats multicanaux des internautes
 
J6 E-DISTRIBUTION HÔTELS
J6  E-DISTRIBUTION HÔTELSJ6  E-DISTRIBUTION HÔTELS
J6 E-DISTRIBUTION HÔTELS
 
Lesson 8 2 proportions
Lesson 8 2 proportionsLesson 8 2 proportions
Lesson 8 2 proportions
 
Tableau noir
Tableau noirTableau noir
Tableau noir
 

Similaire à Gradle_ToursJUG

JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924
Gregory Boissinot
 
.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?
Rui Carvalho
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJS
VISEO
 
Programmation Java
Programmation JavaProgrammation Java
Programmation Java
Mohamed Lahby
 
Nouveautés Java 9-10-11
Nouveautés Java 9-10-11Nouveautés Java 9-10-11
Nouveautés Java 9-10-11
Mahamadou TOURE, Ph.D.
 
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
ArouNa3
 
Présentation de JEE et de son écosysteme
Présentation de JEE et de son écosystemePrésentation de JEE et de son écosysteme
Présentation de JEE et de son écosysteme
Stéphane Traumat
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EE
Ines Ouaz
 
Javavs net
Javavs netJavavs net
Javavs net
Nicolas De Loof
 
JavaEE - Test & Deploy
JavaEE - Test & DeployJavaEE - Test & Deploy
JavaEE - Test & Deploy
Alexis Hassler
 
Maven et industrialisation du logiciel
Maven et industrialisation du logicielMaven et industrialisation du logiciel
Maven et industrialisation du logiciel
ENSET, Université Hassan II Casablanca
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf
Ombotimbe Salifou
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
seydou4devops
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
badrfathallah2
 
JavaScript dans l'usine logicielle
JavaScript dans l'usine logicielleJavaScript dans l'usine logicielle
JavaScript dans l'usine logicielle
jollivetc
 
Gradle
GradleGradle
Gradle
ylemoigne
 
GWT Approfondissement - GTI780 & MTI780 - ETS - A08
GWT Approfondissement - GTI780 & MTI780 - ETS - A08GWT Approfondissement - GTI780 & MTI780 - ETS - A08
GWT Approfondissement - GTI780 & MTI780 - ETS - A08
Claude Coulombe
 
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
Franck SIMON
 
JSF2, Primefaces, Primefaces Mobile
JSF2, Primefaces, Primefaces MobileJSF2, Primefaces, Primefaces Mobile
JSF2, Primefaces, Primefaces Mobile
Sylla Mamoudou
 

Similaire à Gradle_ToursJUG (20)

JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924
 
.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJS
 
Programmation Java
Programmation JavaProgrammation Java
Programmation Java
 
Nouveautés Java 9-10-11
Nouveautés Java 9-10-11Nouveautés Java 9-10-11
Nouveautés Java 9-10-11
 
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
 
Présentation de JEE et de son écosysteme
Présentation de JEE et de son écosystemePrésentation de JEE et de son écosysteme
Présentation de JEE et de son écosysteme
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EE
 
Javavs net
Javavs netJavavs net
Javavs net
 
JavaEE - Test & Deploy
JavaEE - Test & DeployJavaEE - Test & Deploy
JavaEE - Test & Deploy
 
Maven et industrialisation du logiciel
Maven et industrialisation du logicielMaven et industrialisation du logiciel
Maven et industrialisation du logiciel
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 
JavaScript dans l'usine logicielle
JavaScript dans l'usine logicielleJavaScript dans l'usine logicielle
JavaScript dans l'usine logicielle
 
Gradle
GradleGradle
Gradle
 
Osgi ParisJUG 2008-10-14
Osgi ParisJUG 2008-10-14Osgi ParisJUG 2008-10-14
Osgi ParisJUG 2008-10-14
 
GWT Approfondissement - GTI780 & MTI780 - ETS - A08
GWT Approfondissement - GTI780 & MTI780 - ETS - A08GWT Approfondissement - GTI780 & MTI780 - ETS - A08
GWT Approfondissement - GTI780 & MTI780 - ETS - A08
 
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
 
JSF2, Primefaces, Primefaces Mobile
JSF2, Primefaces, Primefaces MobileJSF2, Primefaces, Primefaces Mobile
JSF2, Primefaces, Primefaces Mobile
 

Plus de Gregory Boissinot

Practical Software Architecture DDD
Practical Software Architecture DDDPractical Software Architecture DDD
Practical Software Architecture DDD
Gregory Boissinot
 
DDD Introduction
DDD IntroductionDDD Introduction
DDD Introduction
Gregory Boissinot
 
SOAT Agile Day 2017 DDD
SOAT Agile Day 2017 DDDSOAT Agile Day 2017 DDD
SOAT Agile Day 2017 DDD
Gregory Boissinot
 
DevDay2017 ESGI Essential DDD
DevDay2017 ESGI Essential DDDDevDay2017 ESGI Essential DDD
DevDay2017 ESGI Essential DDD
Gregory Boissinot
 
Beyond Relational Databases
Beyond Relational DatabasesBeyond Relational Databases
Beyond Relational Databases
Gregory Boissinot
 
Paris Redis Meetup Introduction
Paris Redis Meetup IntroductionParis Redis Meetup Introduction
Paris Redis Meetup Introduction
Gregory Boissinot
 
Paris Redis Meetup Starting
Paris Redis Meetup StartingParis Redis Meetup Starting
Paris Redis Meetup Starting
Gregory Boissinot
 
PZ_Microservices101_20150210
PZ_Microservices101_20150210PZ_Microservices101_20150210
PZ_Microservices101_20150210
Gregory Boissinot
 
Spring Integration JUG SummerCamp 2013
Spring Integration JUG SummerCamp 2013Spring Integration JUG SummerCamp 2013
Spring Integration JUG SummerCamp 2013
Gregory Boissinot
 
Jenkins-meetup
Jenkins-meetupJenkins-meetup
Jenkins-meetup
Gregory Boissinot
 
Jenkins_UserMeetup_Paris_201105
Jenkins_UserMeetup_Paris_201105Jenkins_UserMeetup_Paris_201105
Jenkins_UserMeetup_Paris_201105
Gregory Boissinot
 

Plus de Gregory Boissinot (13)

Practical Software Architecture DDD
Practical Software Architecture DDDPractical Software Architecture DDD
Practical Software Architecture DDD
 
DDD Introduction
DDD IntroductionDDD Introduction
DDD Introduction
 
SOAT Agile Day 2017 DDD
SOAT Agile Day 2017 DDDSOAT Agile Day 2017 DDD
SOAT Agile Day 2017 DDD
 
DevDay2017 ESGI Essential DDD
DevDay2017 ESGI Essential DDDDevDay2017 ESGI Essential DDD
DevDay2017 ESGI Essential DDD
 
Beyond Relational Databases
Beyond Relational DatabasesBeyond Relational Databases
Beyond Relational Databases
 
Paris Redis Meetup Introduction
Paris Redis Meetup IntroductionParis Redis Meetup Introduction
Paris Redis Meetup Introduction
 
Paris Redis Meetup Starting
Paris Redis Meetup StartingParis Redis Meetup Starting
Paris Redis Meetup Starting
 
PZ_Microservices101_20150210
PZ_Microservices101_20150210PZ_Microservices101_20150210
PZ_Microservices101_20150210
 
Spring Integration JUG SummerCamp 2013
Spring Integration JUG SummerCamp 2013Spring Integration JUG SummerCamp 2013
Spring Integration JUG SummerCamp 2013
 
Jenkins-meetup
Jenkins-meetupJenkins-meetup
Jenkins-meetup
 
JENKINS_BreizhJUG_20111003
JENKINS_BreizhJUG_20111003JENKINS_BreizhJUG_20111003
JENKINS_BreizhJUG_20111003
 
Jenkins_UserMeetup_Paris_201105
Jenkins_UserMeetup_Paris_201105Jenkins_UserMeetup_Paris_201105
Jenkins_UserMeetup_Paris_201105
 
Gradle_YaJUG
Gradle_YaJUGGradle_YaJUG
Gradle_YaJUG
 

Dernier

Cours d'Intelligence Artificielle et Apprentissage Automatique.pptx
Cours d'Intelligence Artificielle et Apprentissage Automatique.pptxCours d'Intelligence Artificielle et Apprentissage Automatique.pptx
Cours d'Intelligence Artificielle et Apprentissage Automatique.pptx
Jacques KIZA DIMANDJA
 
procede de fabrication mecanique et industriel
procede de fabrication mecanique et industrielprocede de fabrication mecanique et industriel
procede de fabrication mecanique et industriel
saadbellaari
 
Vision de Claude 3.5 SONNET Comment utiliser la vision Utilisez les capacités...
Vision de Claude 3.5 SONNET Comment utiliser la vision Utilisez les capacités...Vision de Claude 3.5 SONNET Comment utiliser la vision Utilisez les capacités...
Vision de Claude 3.5 SONNET Comment utiliser la vision Utilisez les capacités...
Erol GIRAUDY
 
CLAUDE 3.5 SONNET EXPLICATIONS sur les usages
CLAUDE 3.5 SONNET EXPLICATIONS sur les usagesCLAUDE 3.5 SONNET EXPLICATIONS sur les usages
CLAUDE 3.5 SONNET EXPLICATIONS sur les usages
Erol GIRAUDY
 
Tutoriel interactif d’ingénierie rapide d’Anthropic.pdf
Tutoriel interactif d’ingénierie rapide d’Anthropic.pdfTutoriel interactif d’ingénierie rapide d’Anthropic.pdf
Tutoriel interactif d’ingénierie rapide d’Anthropic.pdf
Erol GIRAUDY
 
Transformation Digitale - Initiez-vous à l'informatique et à l'utilisation de...
Transformation Digitale - Initiez-vous à l'informatique et à l'utilisation de...Transformation Digitale - Initiez-vous à l'informatique et à l'utilisation de...
Transformation Digitale - Initiez-vous à l'informatique et à l'utilisation de...
Maalik Jallo
 
Meetup LFUG : Cahier de vacances Liferay
Meetup LFUG : Cahier de vacances LiferayMeetup LFUG : Cahier de vacances Liferay
Meetup LFUG : Cahier de vacances Liferay
Sébastien Le Marchand
 
Introduction à Crossplane (Talk Devoxx 2023)
Introduction à Crossplane (Talk Devoxx 2023)Introduction à Crossplane (Talk Devoxx 2023)
Introduction à Crossplane (Talk Devoxx 2023)
Adrien Blind
 

Dernier (8)

Cours d'Intelligence Artificielle et Apprentissage Automatique.pptx
Cours d'Intelligence Artificielle et Apprentissage Automatique.pptxCours d'Intelligence Artificielle et Apprentissage Automatique.pptx
Cours d'Intelligence Artificielle et Apprentissage Automatique.pptx
 
procede de fabrication mecanique et industriel
procede de fabrication mecanique et industrielprocede de fabrication mecanique et industriel
procede de fabrication mecanique et industriel
 
Vision de Claude 3.5 SONNET Comment utiliser la vision Utilisez les capacités...
Vision de Claude 3.5 SONNET Comment utiliser la vision Utilisez les capacités...Vision de Claude 3.5 SONNET Comment utiliser la vision Utilisez les capacités...
Vision de Claude 3.5 SONNET Comment utiliser la vision Utilisez les capacités...
 
CLAUDE 3.5 SONNET EXPLICATIONS sur les usages
CLAUDE 3.5 SONNET EXPLICATIONS sur les usagesCLAUDE 3.5 SONNET EXPLICATIONS sur les usages
CLAUDE 3.5 SONNET EXPLICATIONS sur les usages
 
Tutoriel interactif d’ingénierie rapide d’Anthropic.pdf
Tutoriel interactif d’ingénierie rapide d’Anthropic.pdfTutoriel interactif d’ingénierie rapide d’Anthropic.pdf
Tutoriel interactif d’ingénierie rapide d’Anthropic.pdf
 
Transformation Digitale - Initiez-vous à l'informatique et à l'utilisation de...
Transformation Digitale - Initiez-vous à l'informatique et à l'utilisation de...Transformation Digitale - Initiez-vous à l'informatique et à l'utilisation de...
Transformation Digitale - Initiez-vous à l'informatique et à l'utilisation de...
 
Meetup LFUG : Cahier de vacances Liferay
Meetup LFUG : Cahier de vacances LiferayMeetup LFUG : Cahier de vacances Liferay
Meetup LFUG : Cahier de vacances Liferay
 
Introduction à Crossplane (Talk Devoxx 2023)
Introduction à Crossplane (Talk Devoxx 2023)Introduction à Crossplane (Talk Devoxx 2023)
Introduction à Crossplane (Talk Devoxx 2023)
 

Gradle_ToursJUG

  • 1. GRADLE Grégory BOISSINOT (@gboissinot) 18/05/2011 ToursJUG - Présentation Gradle 1
  • 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 ToursJUG - Présentation Gradle 2
  • 3. •  Transformation d'une 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^ .... ToursJUG - Présentation Gradle 3
  • 4. INTERNET Change Polling ENV ToursJUG - Présentation Gradle 4
  • 5. •  La nature des besoins d'automatisation a changé Un build peut faire beaucoup plus de choses que la simple création d'une archive Java •  Les besoins d'automatisation ont augmentés significativement ces dernières années ToursJUG - Présentation Gradle 5
  • 6. 1ère génération 2ème génération 3ème génération 2000 2004 2008 2008 2001 3 2 1 ToursJUG - Présentation Gradle 6
  • 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') } ToursJUG - Présentation Gradle 7
  • 8. •  Système de build complet focalisé sur le build des applications d'entreprise 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 ToursJUG - Présentation Gradle 8
  • 9. Central java.net Maven JBoss … Codehaus Artifacts + maven meta Ivy Repository Artifacts + ivy meta Other Repository Artifacts + custom meta ToursJUG - Présentation Gradle 9
  • 10. •  Spécification du 'quoi' et pas du 'comment' iture Fourn le yc d'un c de vie Même ntion apply plugin:'java' > gradle clean build conve en av :clean que M repositories { :compileJava src mavenCental() :processResources } :classes myLib main .jar :jar dependencies { java :assemble compile :compileTestJava resources "jdom:jdom:1.1" :processTestResources testCompile :testClasses "junit:junit:4.8" :test test } :check java :build BUILD SUCCESSFUL resources ToursJUG - Présentation Gradle 10
  • 11. On ne peut pas anticiper tous les besoins  Aucun projet n'est réellement pareil!  Le projet évolue et donc son processus d'intégration évolue aussi Il est important de fournir au minimum le même niveau de support pour les anciens projets que les nouveaux projets ToursJUG - Présentation Gradle 11
  • 12. Écrire un script Gradle consiste à configurer un élément 'Project' configurations build.gradle repositories dependencies Project ant Eléments task personnalisés artifacts Public API ToursJUG - Présentation Gradle 12
  • 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 d'intégration – .... •  De nombreux points d'extension 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 ToursJUG - Présentation Gradle 13
  • 14. La mise en œuvre de l'API à travers des tâches de traitement compile jar test custom build war Un processus Gradle est un ensemble de tâches ToursJUG - Présentation Gradle 14
  • 15. Possibilité d'écrire du code Java/Groovy sous forme d'unités de traitement réutilisables <!-- build.gradle --> Gradle task(boucleTask).doLast{ for (int i:[1,2,3]){ print i } } Java/ Groovy void printMessage(String message){ > gradle boucleTask println "Print " + message :boucleTask } 123 task(distribution).doLast { printMessage("Distribution") > gradle distribution } :distribution Print Distribution task(release) release.dependsOn(distribution) > gradle release :distribution release.doLast{ Print Distribution println "Print Release" :release } Print Release ToursJUG - Présentation Gradle 15
  • 16. ConventionTask Mise à disposition d'un ensemble de tâches prédéfinies - réutilisables - faciles à étendre AbstractCopyTask SourceTask AbstractArchiveTask 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') } ToursJUG - Présentation Gradle 16
  • 17. • Les plugins Gradle • Insertion dans un environnement agile ToursJUG - Présentation Gradle 17
  • 18. 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 ToursJUG - Présentation Gradle 18
  • 19. Java Configuration java Object public 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 ToursJUG - Présentation Gradle 19
  • 20. Mise à disposition globalConfig-1.0.gradle <!– build.gradle --> task globalConfig { ... } Utilisation <!– build.gradle --> > gradle config apply from "http://repomanager/globalConfig-1.0.gradle" ... ... ToursJUG - Présentation Gradle 20
  • 22. •  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 } } } ToursJUG - Présentation Gradle 22
  • 23. apply plugin:'java' processResources.enabled=false test.onlyIf{ !project.hasProperty('skipTests')} task(preJar) > gradle build –PskipTests jar.dependsOn preJar :compileJava :processResources SKIPPED //Change the source directory :classes sourceSets{ :preJar main{ :jar :assemble java.srcDirs file('src/java'), :compileTestJava file('src/java2') :processTestResources } :testClasses } :test SKIPPED :check //Création d'un uberjar :build jar { configurations.compile.each { BUILD SUCCESSFUL from zipTree (it) } } ToursJUG - Présentation Gradle 23
  • 24. apply plugin:'java' > gradle clean build :clean sourceSets{ :generateTask . . . myGenSourceSet { :compileMyGenSourceSetJava java { :processMyGenSourceSetResources srcDir 'output/generated' :myGenSourceSetClasses } . . . } } Mise à disposition automatique d'un ensemble de tâches de traitement pour le nouveau besoin fonctionnel ToursJUG - Présentation Gradle 24
  • 25. > gradle clean build sourceSets{ :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 } ToursJUG - Présentation Gradle 25
  • 26. CONFIGURATION PHASE t1 t2 t3 t1 t2 t3 EXECUTION PHASE GRADLE t4 t4 HOOK SCRIPT Project Project Engine Convention 1 Convention 2 gradle –-properties gradle.taskGraph.whenReady { taskGraph -> gradle –-tasks if (taskGraph.hasTask(':release')){ gradle –-dependencies status = 'release' gradle –-dry-run build } } // Other hooks gradle.taskGraph.beforeTask { task -> .. . gradle.beforeProject { project -> .. . ... ToursJUG - Présentation Gradle 26
  • 27. 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() } } ToursJUG - Présentation Gradle 27
  • 28. import org.junit.Assert > gradle myzip task 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()) > } } ToursJUG - Présentation Gradle 28
  • 30. 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") } } } ToursJUG - Présentation Gradle 30
  • 31. 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 :antTarget Hello from Ant Hello from Gradle ToursJUG - Présentation Gradle 31
  • 32. apply plugin:'java' repositories { mavenCental() flatDir(dirs:'destrepo', IVY name:'ivyrep’) } group='com.zenika.gradledemos' > gradle uploadArchives version='1.0' status='release' uploadArchives { repositories { add(repositories.ivyrep) } } Repository Ivy distant Artifacts + meta Ivy ToursJUG - Présentation Gradle 32
  • 33. apply plugin:'java' apply plugin:'maven' Maven Ant group='test' Tasks version='1.0-SNAPSHOT' uploadArchives { repositories { mavenDeployer { repository( > gradle > gradle install uploadArchives url: remoteRepo) } } } Repository Repository Maven Maven Local Artifacts + distant Artifacts + meta Maven meta Maven ToursJUG - Présentation Gradle 33
  • 34. • Gestion avancée d'un multi projet • Utilisation d'un cache • Exécution parallèle des tests • Build daemon ToursJUG - Présentation Gradle 34
  • 35. // settings.gradle shared include 'api', 'shared', 'services:webservices' webservices api // root build.gradle subprojects { api > gradle buildNeeded apply plugin: 'java' :shared:jar } :api:jar project(':api') { :api:test dependencies { :shared:test compile project(':shared') } } api > gradle buildDependents :shared:jar :api:jar // webservices/build.gradle apply plugin:'war' :api:test :webservices:war dependencies { :webservices:test compile project(':shared'), project(':api'), api > gradle jar –-no-rebuild 'commons-io:commons-io:1.2' api:jar } ToursJUG - Présentation Gradle 35
  • 36. 1.  Le script Gradle est compilé uniquement en cas de changement 2.  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 ToursJUG - Présentation Gradle 36
  • 37. 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 } ToursJUG - Présentation Gradle 37
  • 38. EXECUTION Process 1 Process 6 TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST CLASS CLASS CLASS CLASS CLASS CLASS CLASS CLASS CLASS CLASS PARALLELISATION 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 } ToursJUG - Présentation Gradle 38
  • 39. •  Utilisation d'un 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 l'intégration de Gradle avec Gradle UI et les IDE (Eclipse, IDEA, ...) ToursJUG - Présentation Gradle 39
  • 40. IDE Maturité NetBeans Eclipse + IntelliJ ++ ToursJUG - Présentation Gradle 40
  • 42. gmock security spock integration 4 ToursJUG - Présentation Gradle 42
  • 43. •  Mailing List très active •  User guide très riche (300 pages) •  Nombreuses contributions de plugins •  Le nombre d'articles et de conférences sur le sujet augmentent ToursJUG - Présentation Gradle 43
  • 44. •  Fourniture de consulting et de formation ToursJUG - Présentation Gradle 44
  • 46. •  Introduction de modèles de JVM basés sur la nature des applications •  Amélioration du DSL du graphe des tâches •  Réutilisation possible des plugins Maven •  Un livre en préparation •  Une communauté plus large ToursJUG - Présentation Gradle 46
  • 48. • Essayez-le ! • Utilisez-le ! • Faites du buzz! ToursJUG - Présentation Gradle 48