SlideShare uma empresa Scribd logo
1 de 70
Gradle
Build Automation Evolved




           1
Quem somos nozes?




        2
Marcelo Emanoel


Consultor na TriadWorks
@marceloemanoel




                3
Yuri Adams


Estagiário da TriadWorks
@yuriadams




                 4
TriadWorks

Consultoria

Treinamentos

Mentoring




               5
Automatização

Se a tarefa é repetitiva, AUTOMATIZE!
Aumenta a qualidade do projeto
Aumenta a produtividade do time



                 6
Cenário Atual




      7
Cenário Atual

Ferramentas mais comuns:
 ANT
 MAVEN
 ANT + IVY


                8
Pontos Positivos:
    Ant + Ivy
Controle total do build
Flexibilidade
Dependências entre Targets
Muitas targets existentes
Gerenciamento de dependências

                9
10
Pontos Fracos:
     Ant + Ivy

Ausência de Convenções
Extremamente verboso
Mais imperativo que descritivo



               11
Pontos Positivos:
     Maven
Convenções invés de Configurações
Layout Padrão
Sistema de Plugins
Builds Multi Módulos
Gerenciamento de dependências

                12
13
Pontos fracos:
      Maven

Convenções extremamente inflexíveis
Integração obrigatória no ciclo de build
Faz download da internet



                14
15
Foco em pontos positivos das demais
opções
DSL de Projeto
Voltado para projetos baseados na JVM
Utiliza Groovy

                 16
Flexibilidade do Ant
Gerenciamento de dependências estilo
Ivy
Convenções inteligentes do Maven
Velocidade e Hashing do Git
Poder da Metaprogramação do Groovy

                17
SEM XML!
   18
19
Gradle
Convenções, mas sempre com a
possibilidade de configuração
Gerenciamento de Dependências
Integração com Ant e Maven
Plugins
Build multi projetos

                  20
Gradle
Flexibilidade
Declarativo
DSL




                  21
Convenções




    22
23
Convenções




    24
Gerenciamento de
                        Dependências
apply plugin: “java”                                                      <?xml version=”1.0” encoding=”UTF-8”?>
repositories {                                                            <ivy-module version=”2.0”>
   mavenCentral()                                                            <info organisation=”br.com.teste.ivy”
}                                                                                   module=”teste-ivy”/>
dependencies {                                                               <configurations>
   compile “br.com.caelum:vraptor:3.4.1”                                        <conf name=”runtime”/>
   testCompile “junit:junit:4.10”                                               <conf name=”test”/>
}                                                                            </configurations>
                                                                             <dependencies>
                                                                                <dependency
<project xmlns=”http://maven.apache.org/POM/4.0.0”
                                                                                      org=”br.com.caelum”
         xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
                                                                                      name=”vraptor”
         xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0
                                                                                      rev=”3.4.1”
                             http://maven.apache.org/maven-v4_0_0.xsd”>
                                                                                      conf=”runtime->default”
                                                                                />!
   <modelVersion>4.0.0</modelVersion>
                                                                             </dependencies>
   <groupId>GRUPO</groupId>
                                                                          </ivy-module>
   <artifactId>ATERFATO</artifactId>
   <packaging>war</packaging>
   <name>Nome</name>
   <version>0.0.1-SNAPSHOT</version>

   <dependencies>
      <dependency>
         <groupId>br.com.caelum</groupId>
         <artifactId>vraptor<artifactId>
         <version>3.4.1</version>
      <dependency>
   </dependencies>
                                                         25
</project>
Gerenciamento de
    Dependências
Compatibilidade com repositórios do
Maven e Ivy
Arquivos em disco
Cache



                 26
Gerenciamento de
           Dependências

Repositório Central do   repositories {
                           mavenCentral()
       Maven:            }



  Outro Repositório      repositories {
                           mavenRepo url: “http://maven.ow2.org/maven2/”
      Maven:             }


                         repositories {
                           flatDir name: “repositorioEmDisco”, dirs: “lib”
Repositório em Disco:      flatDir dirs: [“WEB-INF/lib”, “outroDiretorio”]
                         }



                           27
Gerenciamento de
          Dependências
               dependencies {
                 compile(group:”br.com.caelum”,
Repositório:              name:”vraptor”, version:”3.4.1”)
                 providedCompile “javax.servlet:servlet-api:2.5”
               }

               dependencies {

 Diretório:      compile fileTree(dir:“${webAppDirName}/WEB-INF/lib”,
                                  include:”*.jar”)
               }


               dependencies {
                 springModules.each {
  Código:        }
                    compile “org.springframework:${it}:3.1.0.RELEASE”

               }




                                28
Gradle Tasks
Menor unidade de trabalho executada
pelo build
São objetos
Possuem tipos
Fazem parte de um Grafo Direcionado
Acíclico

                29
(
30
Grafo Direcionado
       Acíclico

Para qualquer vértice v, não há uma
ligação dirigida começando e terminando
em v




                 31
Grafo Direcionado
     Acíclico
        32
)
33
Gradle tasks
task simpleTask << {
  println “I am a simple task”
}



task simpleTask

simpleTask << {
  println “Am I what?”
}

simpleTask << {
  println “I am a simple Task”
}




                  34
Gradle tasks
                       Depends On

task dependencyTask << {
  println “I’m a dependency”
}

task dependentTask {           task dependentTask {
  dependsOn “dependencyTask”     dependsOn << dependencyTask
}                              }

task dependentTask {           task dependentTask {
  dependsOn dependencyTask       loadTask.dependsOn dependencyTask
}                              }




                               35
Gradle tasks
                       Depends On
task dependencyTask << {
  println “I’m a dependency”
}

task dependentTask(dependsOn: dependencyTask) {
  doFirst {
task loadTask(dependsOn: dependsTask)
     println “first”
  }
  doLast {
     println “last”
  }
}




                               36
Gradle tasks
                     Depends On
                        Gradle
task dependencyTask << {
  println “I’m a dependency”
}
task dependentTask(dependsOn: dependencyTask)




                          ANT
<target name=”dependencyTarget”>
  <echo>everybody depends on me to print anything</echo>
</target>

<target name=”dependentTarget” depends=”dependencyTarget”>
</target>




                            37
Gradle tasks
                                    Task Types
                 Gradle                                          ANT
apply plugin: “java”                           <target name=”jar” depends=”compile”>
                                                 <delete file=”hello.jar”/>
task myJarTask(type: Jar) {                      <delete file=”MANIFEST.MF”/>
  manifest {                                     <manifest file=”MANIFEST.MF”>
     attributes(BuiltBy: “firstValue”,              <attribute name=”Built-By”
                MainClass: “howTo.Hello”)                      value=”${user.name}”/>
  }                                                 <attribute name=”Main-Class”
  archiveName: “hello.jar”                                     value=”howto.Hello”/>
  destinationDir = file(“${buildDir}/jars”)      </manifest>
  from sourceSets.main.classes
}                                                <jar destfile=”hello.jar”
                                                      basedir=”.”
                                                      includes=”**/*.class”
                                                      manifest=”MANIFEST.MF”
                                                 />
                                               </target>



                                              38
Gradle tasks
                            Task Types
        Gradle                                     ANT
apply plugin: “java”             <target name=”jar” depends=”compile”>
apply plugin: “application”        <delete file=”hello.jar”/>
mainClassName = “howto.Hello”      <delete file=”MANIFEST.MF”/>
                                   <manifest file=”MANIFEST.MF”>
                                      <attribute name=”Built-By”
                                                 value=”${user.name}”/>
                                      <attribute name=”Main-Class”
                                                 value=”howto.Hello”/>
                                   </manifest>

                                   <jar destfile=”hello.jar”
                                        basedir=”.”
                                        includes=”**/*.class”
                                        manifest=”MANIFEST.MF”
                                   />
                                 </target>



                                39
Plugins

Funcionalidades que interessam
Adicionam novas Tasks, domain Objects,
conventions e extendem os objetos do
core e de outros plugins
Implementam a interface Plugin


                 40
41
Aplicação de Plugins

São aplicados através do método apply
da classe Project
Somente uma vez



                  42
Aplicação de Plugins

  apply plugin: “java”
  apply plugin: org.gradle.api.plugins.JavaPlugin
  apply plugin: JavaPlugin




                        43
Exemplos de Plugins
incluídos na API padrão
 Java               Maven

 War                EAR

 Jetty              Checkstyle

 Application        Sonar

 Groovy             Scala

 Eclipse            Antlr


               44
Outros Plugins
Android                   Tomcat

AndroidAnnotations        MacAppBundle

Artifactory               Templates

Cobertura                 UbuntuPackager

Clojure                   JSLint

Gwt


                     45
Integração com o Ant

Integração total
Objeto “
       ant” exposto
Possível importar um Build completo ou
tasks individualmente
Targets como cidadãos de 1ª classe


                   46
Integração com o Ant
Targets da API padrão funcionam sem
nenhuma firula
Targets externos são facilmente
integrados
Targets passam a ser tratados como
Tasks do Gradle


                 47
Executando Targets Ant
       no Gradle
  task antEcho << {
    ant.echo(message:”this is gradle calling an Ant target”)
  }


      task antEcho << {
        ant.echo ”this is gradle calling an Ant target”
      }


       :antEcho
       [ant:echo] this is gradle calling an Ant target

       BUILD SUCCESSFUL




                              48
Executando Targets Ant
           no Gradle
configurations {
  pmd
}
dependencies {
  pmd “pmd:pmd:4.2.5”
}

task check << {
  ant.taskdef(name:”pmd”,
              classname:”net.sourceforge.pmd.ant.PMDTask”,
              classpath: configurations.pmd.asPath)

    ant.pmd(shortFilenames: “true”,
            failonruleviolation: “true”,
            rulesetfiles: file(“pmd-rules.xml”).toURI().toString()) {
                     formatter(type:”text”, toConsole:”true”)
                     fileset(dir:”src”)
           })
}




                                      49
Importando um Build
     completo

     ant.importBuild “build.xml”




                 50
Dependências entre
          Target e Tasks
<target name=”antEcho”>
  <echo>This is Ant</echo>
</target>

task hello(dependsOn:antEcho) << {
   println “and this is Gradle”
}

                    > gradle hello
                    :antEcho
                    [ant:echo] This is Ant
                    and this is Gradle

                    BUILD SUCCESSFUL




                                       51
GradleWrapper

Permite a utilização do Gradle sem que
pra isso seja preciso instalar o Gradle na
máquina
Pensado para utilização em ser vidores
de integração contínua


                  52
GradleWrapper
task generateWrapper(type:Wrapper) {
  gradleVersion=”1.0-rc-3”
}


                    > gradle generateWrapper
                    :generateWrapper

                    BUILD SUCCESSFUL

projeto/
  gradlew
  gradlew.bat
  gradle/wrapper/
     gradle-wrapper.jar
     gradle-wrapper.properties




                                       53
54
https://github.com/marceloemanoel/
        vraptor-js-controller
        > ./gradlew check jar




                  55
56
Mas, eu não gosto de
 usar o terminal...




         57
Mas, eu não gosto de
 usar o terminal...




         57
Spring STS Gradle
     Support
        58
Spring STS Gradle
       Support
Import Wizard
Gerenciamento de Dependências
(Semi-)Automatizado
Extensão do Eclipse para Execução de
Tasks do Gradle


                 59
Documentação
Building and Testing with Gradle (http://
gradleware.com/registered-access?content=books/
building-and-testing/)
User Guide (http://gradle.org/docs/current/
userguide/userguide_single.html)
DSL Reference (http://gradle.org/docs/current/dsl/
index.html)
Tutoriais (http://gradle.org/docs/current/
userguide/tutorials.html)

                      60
Suporte

Forum (http://forums.gradle.org/gradle)
Gradleware (http://gradle.org/
gradleware)



                 61
Quem já usa?




     62
Quem já usa?




     62
Quem já usa?




     62
Mais informações




       63
Mais informações




http://gradle.org
        63
Estamos
contratando
     64
65
BUILD SUCCESSFUL

                   66

Mais conteúdo relacionado

Mais procurados

A arquitetura modular do Java 9
A arquitetura modular do Java 9A arquitetura modular do Java 9
A arquitetura modular do Java 9Helder da Rocha
 
Apresentação maven
Apresentação mavenApresentação maven
Apresentação mavenAndré Justi
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Helder da Rocha
 
GlassFish e Maven: Java EE sem dor!
GlassFish e Maven: Java EE sem dor!GlassFish e Maven: Java EE sem dor!
GlassFish e Maven: Java EE sem dor!Bruno Borges
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsEduardo Mendes
 
GlassFish, Maven, Cloud e Java EE
GlassFish, Maven, Cloud e Java EEGlassFish, Maven, Cloud e Java EE
GlassFish, Maven, Cloud e Java EEBruno Borges
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Helder da Rocha
 
Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Helder da Rocha
 
Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Felipe Mamud
 
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETslides_teltools
 
Resumo Anotacoes Certificacao SCWCD 5
Resumo Anotacoes Certificacao SCWCD 5Resumo Anotacoes Certificacao SCWCD 5
Resumo Anotacoes Certificacao SCWCD 5Gilberto Holms
 
Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1Eduardo Mendes
 

Mais procurados (20)

A arquitetura modular do Java 9
A arquitetura modular do Java 9A arquitetura modular do Java 9
A arquitetura modular do Java 9
 
Jboss tutorial
Jboss tutorialJboss tutorial
Jboss tutorial
 
Introdução ao maven
Introdução ao mavenIntrodução ao maven
Introdução ao maven
 
Apresentação maven
Apresentação mavenApresentação maven
Apresentação maven
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)
 
GlassFish e Maven: Java EE sem dor!
GlassFish e Maven: Java EE sem dor!GlassFish e Maven: Java EE sem dor!
GlassFish e Maven: Java EE sem dor!
 
Aula maven
Aula   mavenAula   maven
Aula maven
 
Apache Ant
Apache AntApache Ant
Apache Ant
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
 
GlassFish, Maven, Cloud e Java EE
GlassFish, Maven, Cloud e Java EEGlassFish, Maven, Cloud e Java EE
GlassFish, Maven, Cloud e Java EE
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
 
Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7
 
Java www
Java wwwJava www
Java www
 
Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?
 
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NET
 
Java 9, 10, 11
Java 9, 10, 11Java 9, 10, 11
Java 9, 10, 11
 
Apresentacao de Introdução ao Apache Maven
Apresentacao de Introdução ao Apache MavenApresentacao de Introdução ao Apache Maven
Apresentacao de Introdução ao Apache Maven
 
Aula1
Aula1Aula1
Aula1
 
Resumo Anotacoes Certificacao SCWCD 5
Resumo Anotacoes Certificacao SCWCD 5Resumo Anotacoes Certificacao SCWCD 5
Resumo Anotacoes Certificacao SCWCD 5
 
Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1
 

Semelhante a Build Automation Evolved

Quick intro to Apache Maven
Quick intro to Apache MavenQuick intro to Apache Maven
Quick intro to Apache MavenInformantTalks
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntDenis L Presciliano
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntDenis L Presciliano
 
TechDay - Sistemas WEB em Java - Rogério N. Jr.
TechDay - Sistemas WEB em Java - Rogério N. Jr.TechDay - Sistemas WEB em Java - Rogério N. Jr.
TechDay - Sistemas WEB em Java - Rogério N. Jr.Rogério Napoleão Jr.
 
Ambiente de Desenvolvimento Java usando Ant
Ambiente de Desenvolvimento Java usando AntAmbiente de Desenvolvimento Java usando Ant
Ambiente de Desenvolvimento Java usando AntDenis L Presciliano
 
Projetos Java com Maven
Projetos Java com MavenProjetos Java com Maven
Projetos Java com MavenEdgar Dantas
 
Organizandoacasa 120316203302-phpapp02
Organizandoacasa 120316203302-phpapp02Organizandoacasa 120316203302-phpapp02
Organizandoacasa 120316203302-phpapp02Fernanda Prezotto
 
Maven e Nexus. O que são essas ferramentas?
Maven e Nexus. O que são essas ferramentas?Maven e Nexus. O que são essas ferramentas?
Maven e Nexus. O que são essas ferramentas?Jocsa Rosendo
 
Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebElenilson Vieira
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?Rafael Benevides
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysDr. Spock
 
Tutorial WebSocket em Java
Tutorial WebSocket em JavaTutorial WebSocket em Java
Tutorial WebSocket em Javalucascsoliveira
 

Semelhante a Build Automation Evolved (20)

Quick intro to Apache Maven
Quick intro to Apache MavenQuick intro to Apache Maven
Quick intro to Apache Maven
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
Java 08
Java 08Java 08
Java 08
 
Introdução ao Apache Ant
Introdução ao Apache AntIntrodução ao Apache Ant
Introdução ao Apache Ant
 
TechDay - Sistemas WEB em Java - Rogério N. Jr.
TechDay - Sistemas WEB em Java - Rogério N. Jr.TechDay - Sistemas WEB em Java - Rogério N. Jr.
TechDay - Sistemas WEB em Java - Rogério N. Jr.
 
Maven
MavenMaven
Maven
 
Ambiente de Desenvolvimento Java usando Ant
Ambiente de Desenvolvimento Java usando AntAmbiente de Desenvolvimento Java usando Ant
Ambiente de Desenvolvimento Java usando Ant
 
Projetos Java com Maven
Projetos Java com MavenProjetos Java com Maven
Projetos Java com Maven
 
Organizando a casa
Organizando a casaOrganizando a casa
Organizando a casa
 
Organizandoacasa 120316203302-phpapp02
Organizandoacasa 120316203302-phpapp02Organizandoacasa 120316203302-phpapp02
Organizandoacasa 120316203302-phpapp02
 
Maven e Nexus. O que são essas ferramentas?
Maven e Nexus. O que são essas ferramentas?Maven e Nexus. O que são essas ferramentas?
Maven e Nexus. O que são essas ferramentas?
 
Jboss7
Jboss7Jboss7
Jboss7
 
Sistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias WebSistema S2DG e Tecnologias Web
Sistema S2DG e Tecnologias Web
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToys
 
Maverick v1.0
Maverick v1.0Maverick v1.0
Maverick v1.0
 
Hibernate conceitos
Hibernate conceitosHibernate conceitos
Hibernate conceitos
 
Framework web 01 - Aula UTFPR 2018
Framework web 01 - Aula UTFPR 2018Framework web 01 - Aula UTFPR 2018
Framework web 01 - Aula UTFPR 2018
 
Tutorial WebSocket em Java
Tutorial WebSocket em JavaTutorial WebSocket em Java
Tutorial WebSocket em Java
 

Build Automation Evolved

  • 3. Marcelo Emanoel Consultor na TriadWorks @marceloemanoel 3
  • 4. Yuri Adams Estagiário da TriadWorks @yuriadams 4
  • 6. Automatização Se a tarefa é repetitiva, AUTOMATIZE! Aumenta a qualidade do projeto Aumenta a produtividade do time 6
  • 8. Cenário Atual Ferramentas mais comuns: ANT MAVEN ANT + IVY 8
  • 9. Pontos Positivos: Ant + Ivy Controle total do build Flexibilidade Dependências entre Targets Muitas targets existentes Gerenciamento de dependências 9
  • 10. 10
  • 11. Pontos Fracos: Ant + Ivy Ausência de Convenções Extremamente verboso Mais imperativo que descritivo 11
  • 12. Pontos Positivos: Maven Convenções invés de Configurações Layout Padrão Sistema de Plugins Builds Multi Módulos Gerenciamento de dependências 12
  • 13. 13
  • 14. Pontos fracos: Maven Convenções extremamente inflexíveis Integração obrigatória no ciclo de build Faz download da internet 14
  • 15. 15
  • 16. Foco em pontos positivos das demais opções DSL de Projeto Voltado para projetos baseados na JVM Utiliza Groovy 16
  • 17. Flexibilidade do Ant Gerenciamento de dependências estilo Ivy Convenções inteligentes do Maven Velocidade e Hashing do Git Poder da Metaprogramação do Groovy 17
  • 18. SEM XML! 18
  • 19. 19
  • 20. Gradle Convenções, mas sempre com a possibilidade de configuração Gerenciamento de Dependências Integração com Ant e Maven Plugins Build multi projetos 20
  • 23. 23
  • 25. Gerenciamento de Dependências apply plugin: “java” <?xml version=”1.0” encoding=”UTF-8”?> repositories { <ivy-module version=”2.0”> mavenCentral() <info organisation=”br.com.teste.ivy” } module=”teste-ivy”/> dependencies { <configurations> compile “br.com.caelum:vraptor:3.4.1” <conf name=”runtime”/> testCompile “junit:junit:4.10” <conf name=”test”/> } </configurations> <dependencies> <dependency <project xmlns=”http://maven.apache.org/POM/4.0.0” org=”br.com.caelum” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” name=”vraptor” xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0 rev=”3.4.1” http://maven.apache.org/maven-v4_0_0.xsd”> conf=”runtime->default” />! <modelVersion>4.0.0</modelVersion> </dependencies> <groupId>GRUPO</groupId> </ivy-module> <artifactId>ATERFATO</artifactId> <packaging>war</packaging> <name>Nome</name> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>br.com.caelum</groupId> <artifactId>vraptor<artifactId> <version>3.4.1</version> <dependency> </dependencies> 25 </project>
  • 26. Gerenciamento de Dependências Compatibilidade com repositórios do Maven e Ivy Arquivos em disco Cache 26
  • 27. Gerenciamento de Dependências Repositório Central do repositories { mavenCentral() Maven: } Outro Repositório repositories { mavenRepo url: “http://maven.ow2.org/maven2/” Maven: } repositories { flatDir name: “repositorioEmDisco”, dirs: “lib” Repositório em Disco: flatDir dirs: [“WEB-INF/lib”, “outroDiretorio”] } 27
  • 28. Gerenciamento de Dependências dependencies { compile(group:”br.com.caelum”, Repositório: name:”vraptor”, version:”3.4.1”) providedCompile “javax.servlet:servlet-api:2.5” } dependencies { Diretório: compile fileTree(dir:“${webAppDirName}/WEB-INF/lib”, include:”*.jar”) } dependencies { springModules.each { Código: } compile “org.springframework:${it}:3.1.0.RELEASE” } 28
  • 29. Gradle Tasks Menor unidade de trabalho executada pelo build São objetos Possuem tipos Fazem parte de um Grafo Direcionado Acíclico 29
  • 30. ( 30
  • 31. Grafo Direcionado Acíclico Para qualquer vértice v, não há uma ligação dirigida começando e terminando em v 31
  • 32. Grafo Direcionado Acíclico 32
  • 33. ) 33
  • 34. Gradle tasks task simpleTask << { println “I am a simple task” } task simpleTask simpleTask << { println “Am I what?” } simpleTask << { println “I am a simple Task” } 34
  • 35. Gradle tasks Depends On task dependencyTask << { println “I’m a dependency” } task dependentTask { task dependentTask { dependsOn “dependencyTask” dependsOn << dependencyTask } } task dependentTask { task dependentTask { dependsOn dependencyTask loadTask.dependsOn dependencyTask } } 35
  • 36. Gradle tasks Depends On task dependencyTask << { println “I’m a dependency” } task dependentTask(dependsOn: dependencyTask) { doFirst { task loadTask(dependsOn: dependsTask) println “first” } doLast { println “last” } } 36
  • 37. Gradle tasks Depends On Gradle task dependencyTask << { println “I’m a dependency” } task dependentTask(dependsOn: dependencyTask) ANT <target name=”dependencyTarget”> <echo>everybody depends on me to print anything</echo> </target> <target name=”dependentTarget” depends=”dependencyTarget”> </target> 37
  • 38. Gradle tasks Task Types Gradle ANT apply plugin: “java” <target name=”jar” depends=”compile”> <delete file=”hello.jar”/> task myJarTask(type: Jar) { <delete file=”MANIFEST.MF”/> manifest { <manifest file=”MANIFEST.MF”> attributes(BuiltBy: “firstValue”, <attribute name=”Built-By” MainClass: “howTo.Hello”) value=”${user.name}”/> } <attribute name=”Main-Class” archiveName: “hello.jar” value=”howto.Hello”/> destinationDir = file(“${buildDir}/jars”) </manifest> from sourceSets.main.classes } <jar destfile=”hello.jar” basedir=”.” includes=”**/*.class” manifest=”MANIFEST.MF” /> </target> 38
  • 39. Gradle tasks Task Types Gradle ANT apply plugin: “java” <target name=”jar” depends=”compile”> apply plugin: “application” <delete file=”hello.jar”/> mainClassName = “howto.Hello” <delete file=”MANIFEST.MF”/> <manifest file=”MANIFEST.MF”> <attribute name=”Built-By” value=”${user.name}”/> <attribute name=”Main-Class” value=”howto.Hello”/> </manifest> <jar destfile=”hello.jar” basedir=”.” includes=”**/*.class” manifest=”MANIFEST.MF” /> </target> 39
  • 40. Plugins Funcionalidades que interessam Adicionam novas Tasks, domain Objects, conventions e extendem os objetos do core e de outros plugins Implementam a interface Plugin 40
  • 41. 41
  • 42. Aplicação de Plugins São aplicados através do método apply da classe Project Somente uma vez 42
  • 43. Aplicação de Plugins apply plugin: “java” apply plugin: org.gradle.api.plugins.JavaPlugin apply plugin: JavaPlugin 43
  • 44. Exemplos de Plugins incluídos na API padrão Java Maven War EAR Jetty Checkstyle Application Sonar Groovy Scala Eclipse Antlr 44
  • 45. Outros Plugins Android Tomcat AndroidAnnotations MacAppBundle Artifactory Templates Cobertura UbuntuPackager Clojure JSLint Gwt 45
  • 46. Integração com o Ant Integração total Objeto “ ant” exposto Possível importar um Build completo ou tasks individualmente Targets como cidadãos de 1ª classe 46
  • 47. Integração com o Ant Targets da API padrão funcionam sem nenhuma firula Targets externos são facilmente integrados Targets passam a ser tratados como Tasks do Gradle 47
  • 48. Executando Targets Ant no Gradle task antEcho << { ant.echo(message:”this is gradle calling an Ant target”) } task antEcho << { ant.echo ”this is gradle calling an Ant target” } :antEcho [ant:echo] this is gradle calling an Ant target BUILD SUCCESSFUL 48
  • 49. Executando Targets Ant no Gradle configurations { pmd } dependencies { pmd “pmd:pmd:4.2.5” } task check << { ant.taskdef(name:”pmd”, classname:”net.sourceforge.pmd.ant.PMDTask”, classpath: configurations.pmd.asPath) ant.pmd(shortFilenames: “true”, failonruleviolation: “true”, rulesetfiles: file(“pmd-rules.xml”).toURI().toString()) { formatter(type:”text”, toConsole:”true”) fileset(dir:”src”) }) } 49
  • 50. Importando um Build completo ant.importBuild “build.xml” 50
  • 51. Dependências entre Target e Tasks <target name=”antEcho”> <echo>This is Ant</echo> </target> task hello(dependsOn:antEcho) << { println “and this is Gradle” } > gradle hello :antEcho [ant:echo] This is Ant and this is Gradle BUILD SUCCESSFUL 51
  • 52. GradleWrapper Permite a utilização do Gradle sem que pra isso seja preciso instalar o Gradle na máquina Pensado para utilização em ser vidores de integração contínua 52
  • 53. GradleWrapper task generateWrapper(type:Wrapper) { gradleVersion=”1.0-rc-3” } > gradle generateWrapper :generateWrapper BUILD SUCCESSFUL projeto/ gradlew gradlew.bat gradle/wrapper/ gradle-wrapper.jar gradle-wrapper.properties 53
  • 54. 54
  • 55. https://github.com/marceloemanoel/ vraptor-js-controller > ./gradlew check jar 55
  • 56. 56
  • 57. Mas, eu não gosto de usar o terminal... 57
  • 58. Mas, eu não gosto de usar o terminal... 57
  • 59. Spring STS Gradle Support 58
  • 60. Spring STS Gradle Support Import Wizard Gerenciamento de Dependências (Semi-)Automatizado Extensão do Eclipse para Execução de Tasks do Gradle 59
  • 61. Documentação Building and Testing with Gradle (http:// gradleware.com/registered-access?content=books/ building-and-testing/) User Guide (http://gradle.org/docs/current/ userguide/userguide_single.html) DSL Reference (http://gradle.org/docs/current/dsl/ index.html) Tutoriais (http://gradle.org/docs/current/ userguide/tutorials.html) 60
  • 69. 65

Notas do Editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n