SlideShare una empresa de Scribd logo
1 de 94
Descargar para leer sin conexión
Construcción de proyectos 
con 
David Gómez G. 
@dgomezg
Automatizar la construcción… ¿Pur qué? 
• Evitar empaquetado 
manual 
• Construir rápidamente 
y en cualquier entorno 
• Builds programadas (C.I.) 
Foto de Steindy 
http://commons.wikimedia.org/wiki/File:Jose_Mourinho_-_Inter_Mailand_(7).jpg
Herramientas 
Fichero de descripción 
+ 
Código fuente 
+ 
Gestión de dependencias 
= 
Artefacto
Características 
• Basado en Java 
• Configuración basada en XML 
• Gestor de dependencias adicional (Ivy) 
• Muy flexible 
• Todas las tareas se definen 
específicamente
Pegas 
• Muy verboso. XML muy extensos 
• Difícil escribir lógica compleja (condiciones) 
• Estructura de proyecto libre. 
• Difícil de mantener 
• Difícil de entender el proceso de construcción.
Ejemplo
Ejemplo 
<?xml version="1.0" encoding="UTF-8"?> 
<project> 
<target name="clean"> 
<delete dir="build"/> 
</target> 
<target name="compile"> 
<mkdir dir="build/classes"/> 
<javac srcdir="src" destdir="build/classes"/> 
</target> 
<target name="jar"> 
<mkdir dir="build/jar"/> 
<jar destfile="build/jar/HelloWorld.jar" 
basedir="build/classes"> 
<manifest> 
<attribute name="Main-Class" 
value="com.autentia.dgomezg.sandbox.ant.HelloWorld"/> 
</manifest> 
</jar> 
</target> 
! 
<target name="run"> 
<java jar="build/jar/HelloWorld.jar" fork="true"/> 
</target> 
! 
</project>
Ejemplo 
<?xml version="1.0" encoding="UTF-8"?> 
<project> 
<target name="clean"> 
<delete dir="build"/> 
</target> 
<target name="compile"> 
<mkdir dir="build/classes"/> 
<javac srcdir="src" destdir="build/classes"/> 
</target> 
<target name="jar"> 
<mkdir dir="build/jar"/> 
<jar destfile="build/jar/HelloWorld.jar" 
basedir="build/classes"> 
<manifest> 
<attribute name="Main-Class" 
value="com.autentia.dgomezg.sandbox.ant.HelloWorld"/> 
</manifest> 
</jar> 
</target> 
! 
<target name="run"> 
<java jar="build/jar/HelloWorld.jar" fork="true"/> 
</target> 
! 
</project> 
dolamroth:ant-sample dgomezg$ ant clean compile jar run 
Buildfile: /Users/dgomezg/Documents/workspace/ant-sample/build.xml 
! 
clean: 
! 
compile: 
[mkdir] Created dir: /Users/dgomezg/Documents/workspace/ant-sample/ 
build/classes 
[javac] Compiling 1 source file to /Users/dgomezg/Documents/ 
workspace/ant-sample/build/classes 
! 
jar: 
[mkdir] Created dir: /Users/dgomezg/Documents/workspace/ant-sample/ 
build/jar 
[jar] Building jar: /Users/dgomezg/Documents/workspace/ant-sample/ 
build/jar/HelloWorld.jar 
! 
run: 
[java] Hello World 
! 
BUILD SUCCESSFUL 
Total time: 1 second 
dolamroth:ant-sample dgomezg$
Características 
• Convención sobre configuración 
• Estructura de proyecto 
determinada 
• Proceso de construcción 
definido 
• Gestor de dependencias 
• Informes de construcción y de test 
• Arquetipos 
• Ampliable con Plugins (Mojos)
Pegas 
• Estructura demasiado rígida 
• Extensión complicada 
• Fichero de build verboso 
• Especialmente si configuramos plugins
Ejemplo
Ejemplo 
<?xml version="1.0" encoding="UTF-8"?> 
<project> 
<modelVersion>4.0.0</modelVersion> 
<groupId>com.autentia.dgomezg.sandbox</groupId> 
<artifactId>mvn-sample</artifactId> 
<version>1.0.0</version> 
</project>
Ejemplo 
<?xml version="1.0" encoding="UTF-8"?> 
<project> 
<modelVersion>4.0.0</modelVersion> 
<groupId>com.autentia.dgomezg.sandbox</groupId> 
<artifactId>mvn-sample</artifactId> 
<version>1.0.0</version> 
</project> 
dolamroth:mvn-sample dgomezg$ mvn package 
[INFO] Scanning for projects... 
[INFO] 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building mvn-sample 1.0.0 
[INFO] ------------------------------------------------------------------------ 
[INFO] 
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ mvn-sample --- 
[debug] execute contextualize 
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! 
[INFO] Copying 0 resource 
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ mvn-sample --- 
[INFO] Nothing to compile - all classes are up to date 
[INFO] 
[INFO] --- maven-resources-plugin:2.5:testResources (default-testResources) @ mvn-sample --- 
[debug] execute contextualize 
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! 
[INFO] Copying 0 resource 
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ mvn-sample --- 
[INFO] Nothing to compile - all classes are up to date 
[INFO] 
[INFO] --- maven-surefire-plugin:2.10:test (default-test) @ mvn-sample --- 
[INFO] Surefire report directory: /Users/dgomezg/Documents/workspace/mvn-sample/target/surefire-reports ! 
------------------------------------------------------- 
T E S T S 
------------------------------------------------------- ! 
Results : ! 
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0 ! 
[INFO] 
[INFO] --- maven-jar-plugin:2.3.2:jar (default-jar) @ mvn-sample --- 
[INFO] Building jar: /Users/dgomezg/Documents/workspace/mvn-sample/target/mvn-sample-1.0.0.jar 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 0.876s 
[INFO] Finished at: Wed Nov 20 13:32:06 CET 2013 
[INFO] Final Memory: 7M/245M 
[INFO] ------------------------------------------------------------------------ 
dolamroth:mvn-sample dgomezg$
¿Qué se puede mejorar? 
Ficheros de build más concisos 
Convención para estructura 
Flexibilidad para requisitos 
Builds incrementales 
Reutilización de partes del script 
Soporte para implementar lógica
Características 
• Flexibilidad 
• Definición de nuevas 
tareas 
• Gestor de 
dependencias (Ivy) 
• Convención sobre 
configuración 
• Multi-Módulo 
• Plugins 
• Gestor de dependencias
Características 
• Basado en Groovy 
• Lenguaje completo 
• Permite definir lógica más compleja 
• Convenciones Flexibles 
• Extensibilidad 
• Integración con Ant (AntExecutor) y 
maven
Ejemplo
Ejemplo 
build.gradle
Ejemplo 
build.gradle 
apply plugin: 'java' 
! 
group = 'com.autentia.dgomezg.sandbox' 
archivesBaseName = 'gradle-sample' 
version = '0.1.0-SNAPSHOT' 
!
Ejemplo 
apply plugin: 'java' 
! 
group = 'com.autentia.dgomezg.sandbox' 
archivesBaseName = 'gradle-sample' 
version = '0.1.0-SNAPSHOT' 
! 
dolamroth:gradle-sample dgomezg$ gradle build 
:compileJava UP-TO-DATE 
:processResources UP-TO-DATE 
:classes UP-TO-DATE 
:jar 
:assemble 
:compileTestJava UP-TO-DATE 
:processTestResources UP-TO-DATE 
:testClasses UP-TO-DATE 
:test 
:check 
:build 
! 
BUILD SUCCESSFUL 
! 
Total time: 2.375 secs 
dolamroth:gradle-sample dgomezg$ 
build.gradle
Ejemplo 
build.gradle 
apply plugin: 'java' 
! 
group = 'com.autentia.dgomezg.sandbox' 
archivesBaseName = 'gradle-sample' 
version = '0.1.0-SNAPSHOT' 
! 
dolamroth:gradle-sample dgomezg$ gradle build 
:compileJava UP-TO-DATE 
:processResources UP-TO-DATE 
:classes UP-TO-DATE 
:jar 
:assemble 
:compileTestJava UP-TO-DATE 
:processTestResources UP-TO-DATE 
:testClasses UP-TO-DATE 
:test 
:check 
:build 
! 
BUILD SUCCESSFUL 
! 
Total time: 2.375 secs 
dolamroth:gradle-sample dgomezg$ 
sourceCompatibility = 1.6 
! 
jar { 
manifest { 
attributes 'Main-Class': 'com.autentia.dgomezg.sandbox.gradle.HelloWorld' 
} 
}
Fundamentos Gradle
El proceso
La lista de tareas 
gradle tasks o gradle tasks --all
Groovy DSL 
Todo tiene un equivalente en clases java 
http://gradle.org/docs/current/javadoc/index.html
Groovy DSL 
Mayor flexibilidad a la hora de definir nuevas tareas
Groovy DSL 
Mayor flexibilidad a la hora de definir nuevas tareas 
task projectVersion { 
doLast { 
println ‘Project version’ + project.version 
} 
}
Groovy DSL 
Mayor flexibilidad a la hora de definir nuevas tareas 
task projectVersion { 
doLast { 
println ‘Project version’ + project.version 
} 
} 
dolamroth:gradle-sample dgomezg$ gradle projectVersion 
:projectVersion 
Project Version: 0.1.0-SNAPSHOT 
! 
BUILD SUCCESSFUL 
! 
Total time: 3.708 secs
Groovy DSL 
Mayor flexibilidad a la hora de definir nuevas tareas 
task projectVersion { 
doLast { 
println ‘Project version’ + project.version 
} 
} 
dolamroth:gradle-sample dgomezg$ gradle projectVersion 
:projectVersion 
Project Version: 0.1.0-SNAPSHOT 
! 
BUILD SUCCESSFUL 
! 
Total time: 3.708 secs 
dolamroth:gradle-sample dgomezg$ gradle -q projectVersion 
Project Version: 0.1.0-SNAPSHOT 
dolamroth:gradle-sample dgomezg
Plugins 
Permiten activar funcionalidades
Plugins 
Permiten activar funcionalidades 
apply plugin: 'java' 
apply plugin: 'maven' 
apply plugin: ‘eclipse' 
apply plugin: 'war' 
! 
group = 'com.autentia.dgomezg.sandbox' 
archivesBaseName = 'gradle-sample' 
version = '0.1.0-SNAPSHOT' 
! 
sourceCompatibility = 1.6
Plugins 
Permiten activar funcionalidades 
apply plugin: 'java' 
apply plugin: 'maven' 
apply plugin: ‘eclipse' 
apply plugin: 'war' 
! 
group = 'com.autentia.dgomezg.sandbox' 
archivesBaseName = 'gradle-sample' 
version = '0.1.0-SNAPSHOT' 
! 
sourceCompatibility = 1.6 
$ gradle tasks 
! 
Build tasks 
----------- 
assemble - Assembles the outputs of this project. 
build - Assembles and tests this project. 
buildDependents - Assembles and tests this project and all projects that depend on it. 
buildNeeded - Assembles and tests this project and all projects it depends on. 
clean - Deletes the build directory. 
jar - Assembles a jar archive containing the main classes. 
war - Generates a war archive with all the compiled classes, the web-app content and 
the libraries. 
! 
Documentation tasks 
------------------- 
javadoc - Generates Javadoc API documentation for the main source code. 
! 
IDE tasks 
--------- 
cleanEclipse - Cleans all Eclipse files. 
eclipse - Generates all Eclipse files. 
! 
Other tasks 
----------- 
install - Installs the 'archives' artifacts into the local Maven repository.
Integración con ant 
Propiedad ant disponible en todas las tareas
Integración con ant 
Propiedad ant disponible en todas las tareas 
task projectVersion { 
doLast { 
ant.echo(message: 'Project Version: ' + project.version) 
} 
}
Integración con ant 
Propiedad ant disponible en todas las tareas 
task projectVersion { 
doLast { 
ant.echo(message: 'Project Version: ' + project.version) 
} 
} 
dolamroth:gradle-sample dgomezg$ gradle -q projectVersion 
dolamroth:gradle-sample dgomezg$ 
dolamroth:gradle-sample dgomezg$ gradle projectVersion 
:projectVersion 
[ant:echo] Project Version: 0.1.0-SNAPSHOT 
! 
BUILD SUCCESSFUL 
! 
Total time: 2.914 secs 
dolamroth:gradle-sample dgomezg$
Integración con maven 
Por defecto, toma las convenciones de maven 
Se puede integrar con los repositorios de maven
Integración con maven 
Por defecto, toma las convenciones de maven 
Se puede integrar con los repositorios de maven 
repositories { 
mavenRepo name: 'nexus', url: 'http://terraka:8080/nexus/content/repositories/public' 
mavenCentral() 
mavenRepo name: 'spring-milestones', url: 'http://maven.springframework.org/milestone' 
mavenRepo name: 'java.net', url: 'http://download.java.net/maven/2/' 
}
Integración con maven 
Por defecto, toma las convenciones de maven 
Se puede integrar con los repositorios de maven 
repositories { 
mavenRepo name: 'nexus', url: 'http://terraka:8080/nexus/content/repositories/public' 
mavenCentral() 
mavenRepo name: 'spring-milestones', url: 'http://maven.springframework.org/milestone' 
mavenRepo name: 'java.net', url: 'http://download.java.net/maven/2/' 
} 
Declaración compacta de dependencias
Integración con maven 
Por defecto, toma las convenciones de maven 
Se puede integrar con los repositorios de maven 
repositories { 
mavenRepo name: 'nexus', url: 'http://terraka:8080/nexus/content/repositories/public' 
mavenCentral() 
mavenRepo name: 'spring-milestones', url: 'http://maven.springframework.org/milestone' 
mavenRepo name: 'java.net', url: 'http://download.java.net/maven/2/' 
} 
Declaración compacta de dependencias 
dependencies { 
compile "com.google.guava:guava:12.0", 
"org.apache.commons:commons-lang3:3.1", 
"org.slf4j:jcl-over-slf4j:1.6.1", 
"org.springframework.security:spring-security-core:3.0.1.RELEASE", 
"org.springframework:spring-jdbc:3.0.0.RELEASE", 
"org.springframework:spring-tx:3.0.0.RELEASE" 
runtime "org.apache.geronimo.specs:geronimo-jpa_3.0_spec:1.1.1", 
"org.apache.geronimo.specs:geronimo-servlet_2.4_spec:1.1.1" 
testCompile "junit:junit:4.5", 
"org.springframework:spring-test:3.0.0.RELEASE" 
}
Integración con maven 
Se pueden excluir dependencias transitivas
Integración con maven 
Se pueden excluir dependencias transitivas 
configurations { 
sources.exclude group: 'com.google.code.guice' 
all*.exclude module: 'commons-logging' 
}
Integración con maven 
Se pueden excluir dependencias transitivas 
configurations { 
sources.exclude group: 'com.google.code.guice' 
all*.exclude module: 'commons-logging' 
} 
Se pueden subir artefactos al repositorio
Integración con maven 
Se pueden excluir dependencias transitivas 
configurations { 
sources.exclude group: 'com.google.code.guice' 
all*.exclude module: 'commons-logging' 
} 
Se pueden subir artefactos al repositorio 
apply plugin: 'maven' 
! 
uploadArchives { 
! 
repositories.mavenDeployer { 
def credentials = [userName: 'user', password: 'password'] 
uniqueVersion = true 
snapshotRepository(url: 'http://gitrepo:8081/nexus/content/repositories/snapshots') { 
authentication(credentials) 
} 
repository(url: 'http://gitrepo:8081/nexus/content/repositories/releases') { 
authentication(credentials) 
} 
} 
}
Propiedades 
Se pueden utilizar propiedades internas
Propiedades 
project.ext { 
springVersion = ‘3.2.5.RELEASE’ 
} 
! 
dependencies { 
compile “org.springframework.security:spring-security-core:${springVersion}”, 
"org.springframework:spring-jdbc:${springVersion}", 
"org.springframework:spring-tx:${springVersion}" 
testCompile "junit:junit:4.5", 
“org.springframework:spring-test:${springVersion}” 
} 
Se pueden utilizar propiedades internas
Propiedades 
project.ext { 
springVersion = ‘3.2.5.RELEASE’ 
} 
! 
dependencies { 
compile “org.springframework.security:spring-security-core:${springVersion}”, 
"org.springframework:spring-jdbc:${springVersion}", 
"org.springframework:spring-tx:${springVersion}" 
testCompile "junit:junit:4.5", 
“org.springframework:spring-test:${springVersion}” 
Se pueden utilizar propiedades externas 
} 
Se pueden utilizar propiedades internas
Propiedades 
Se pueden utilizar propiedades externas 
version=0.1.0-SNAPSHOT 
springVersion=3.2.5.RELEASE 
sharedLocation=https://raw.github.com/autentia/common/ 
gradle.properties 
project.ext { 
springVersion = ‘3.2.5.RELEASE’ 
} 
! 
dependencies { 
compile “org.springframework.security:spring-security-core:${springVersion}”, 
"org.springframework:spring-jdbc:${springVersion}", 
"org.springframework:spring-tx:${springVersion}" 
testCompile "junit:junit:4.5", 
“org.springframework:spring-test:${springVersion}” 
} 
Se pueden utilizar propiedades internas
Propiedades 
dependencies { 
compile “org.springframework.security:spring-security-core:${springVersion}”, 
"org.springframework:spring-jdbc:${springVersion}", 
"org.springframework:spring-tx:${springVersion}" 
testCompile "junit:junit:4.5", 
“org.springframework:spring-test:${springVersion}” 
} 
Se pueden utilizar propiedades externas 
version=0.1.0-SNAPSHOT 
springVersion=3.2.5.RELEASE 
sharedLocation=https://raw.github.com/autentia/common/ 
gradle.properties 
build.gradle 
project.ext { 
springVersion = ‘3.2.5.RELEASE’ 
} 
! 
dependencies { 
compile “org.springframework.security:spring-security-core:${springVersion}”, 
"org.springframework:spring-jdbc:${springVersion}", 
"org.springframework:spring-tx:${springVersion}" 
testCompile "junit:junit:4.5", 
“org.springframework:spring-test:${springVersion}” 
} 
Se pueden utilizar propiedades internas
Gradle on JVM
Gradle on JVM 
task projectVersion { 
doLast { 
println ‘Project version’ + project.version 
} 
}
Gradle on JVM 
task projectVersion { 
doLast { 
println ‘Project version’ + project.version 
} 
} 
dolamroth:gradle-sample dgomezg$ gradle projectVersion 
:projectVersion 
Project Version: 0.1.0-SNAPSHOT 
! 
BUILD SUCCESSFUL 
! 
Total time: 3.708 secs
Gradle on JVM 
task projectVersion { 
doLast { 
println ‘Project version’ + project.version 
} 
} 
dolamroth:gradle-sample dgomezg$ gradle projectVersion 
:projectVersion 
Project Version: 0.1.0-SNAPSHOT 
! 
BUILD SUCCESSFUL 
! 
Total time: 3.708 secs 
WTF!!!!
Gradle on JVM 
task projectVersion { 
doLast { 
println ‘Project version’ + project.version 
} 
} 
dolamroth:gradle-sample dgomezg$ gradle projectVersion 
:projectVersion 
Project Version: 0.1.0-SNAPSHOT 
! 
BUILD SUCCESSFUL 
! 
Total time: 3.708 secs 
WTF!!!! 
Tiempo dedicado a levantar la JVM y traducir el script
Gradle daemon to the rescue! 
gradle --daemon
Gradle daemon to the rescue! 
gradle --daemon
Gradle daemon to the rescue! 
gradle --daemon
Gradle Wrapper
Gradle Wrapper
Gradle Wrapper 
task wrapper(type: Wrapper) { 
gradleVersion = '1.7' 
}
Gradle Wrapper 
task wrapper(type: Wrapper) { 
gradleVersion = '1.7' 
} $ gradle wrapper 
:wrapper 
! 
BUILD SUCCESSFUL 
! 
Total time: 5.071 secs 
! 
$ ls -l gradle/wrapper 
total 112 
-rw-r--r-- 1 dgomezg staff 49875 Nov 20 16:53 gradle-wrapper.jar 
-rw-r--r-- 1 dgomezg staff 229 Nov 20 16:53 gradle-wrapper.properties 
$ ls gradle* 
gradle.properties gradlew gradlew.bat 
$ ./gradlew build 
:compileJava UP-TO-DATE 
:processResources UP-TO-DATE 
:classes UP-TO-DATE 
:war UP-TO-DATE 
:assemble UP-TO-DATE 
:compileTestJava UP-TO-DATE 
:processTestResources UP-TO-DATE 
:testClasses UP-TO-DATE 
:test UP-TO-DATE 
:check UP-TO-DATE 
:build UP-TO-DATE 
! 
BUILD SUCCESSFUL 
! 
Total time: 3.531 secs
Convención flexible 
Se pueden adaptar las convenciones de estructura de 
proyecto
Convención flexible 
Se pueden adaptar las convenciones de estructura de 
sourceSets { 
main { 
java { 
srcDirs = ['src'] 
} 
} 
test { 
java { 
srcDirs = ['test'] 
} 
} 
} 
buildDir = 'out' 
proyecto
Convención flexible 
Se pueden adaptar las convenciones de estructura de 
sourceSets { 
main { 
java { 
srcDirs = ['src'] 
} 
} 
test { 
java { 
srcDirs = ['test'] 
} 
} 
} 
buildDir = 'out' 
proyecto 
compileJava { 
source 'src/protobuf/java' 
source 'src/main/java' 
}
Reutilización 
Los archivos se pueden modularizar
Reutilización 
apply plugin: 'java' 
apply plugin: 'maven' 
apply plugin: 'eclipse' 
! 
group = 'com.autentia.dgomezg.sandbox' 
archivesBaseName = 'gradle-sample' 
! 
sourceCompatibility = 1.6 
! 
repositories { 
//mavenRepo name: 'nexus', url: 'http://terraka:8080/nexus/content/repositories/public' 
mavenCentral() 
mavenRepo name: 'spring-milestones', url: 'http://maven.springframework.org/milestone' 
mavenRepo name: 'java.net', url: 'http://download.java.net/maven/2/' 
} 
! 
dependencies { 
compile "org.springframework.security:spring-security-core:3.0.1.RELEASE", 
"org.springframework:spring-jdbc:3.0.0.RELEASE", 
"org.springframework:spring-tx:3.0.0.RELEASE" 
testCompile "junit:junit:4.5", 
"org.springframework:spring-test:3.0.0.RELEASE" 
} 
! 
Los archivos se pueden modularizar
Reutilización 
apply plugin: 'java' 
apply plugin: 'maven' 
apply plugin: 'eclipse' 
! 
group = 'com.autentia.dgomezg.sandbox' 
archivesBaseName = 'gradle-sample' 
! 
sourceCompatibility = 1.6 
! 
repositories { 
//mavenRepo name: 'nexus', url: 'http://terraka:8080/nexus/content/repositories/public' 
mavenCentral() 
mavenRepo name: 'spring-milestones', url: 'http://maven.springframework.org/milestone' 
mavenRepo name: 'java.net', url: 'http://download.java.net/maven/2/' 
} 
! 
dependencies { 
compile "org.springframework.security:spring-security-core:3.0.1.RELEASE", 
"org.springframework:spring-jdbc:3.0.0.RELEASE", 
"org.springframework:spring-tx:3.0.0.RELEASE" 
testCompile "junit:junit:4.5", 
"org.springframework:spring-test:3.0.0.RELEASE" 
} 
! 
Los archivos se pueden modularizar 
project.gradle
Reutilización 
Los archivos se pueden importar
Reutilización 
Los archivos se pueden importar 
apply plugin: 'java' 
apply plugin: 'maven' 
apply plugin: 'eclipse' 
! 
group = 'com.autentia.dgomezg.sandbox' 
archivesBaseName = 'gradle-sample' 
! 
sourceCompatibility = 1.6 
! 
repositories { 
} 
! 
dependencies { 
} 
project.gradle
Reutilización 
Los archivos se pueden importar 
apply plugin: 'java' 
apply plugin: 'maven' 
apply plugin: 'eclipse' 
! 
group = 'com.autentia.dgomezg.sandbox' 
archivesBaseName = 'gradle-sample' 
! 
sourceCompatibility = 1.6 
! 
repositories { 
} 
! 
dependencies { 
} 
project.gradle 
apply from: ‘../autentia-common/project.gradle’ 
! 
dependencies { 
compile "com.google.guava:guava:r05", 
"org.apache.commons:commons-lang3:3.1", 
"org.slf4j:slf4j-api:1.6.1", 
"ch.qos.logback:logback-classic:0.9.24", 
"org.springframework:spring-aop:$springVersion", 
"org.springframework:spring-beans:$springVersion", 
"org.springframework:spring-context:$springVersion", 
"org.springframework:spring-core:$springVersion", 
"org.springframework:spring-web:$springVersion", 
"org.springframework.data:spring-data-mongodb:1.0.1.RELEASE", 
"org.mongodb:mongo-java-driver:2.7.1" 
testCompile "org.mockito:mockito-core:1.8.5" 
} 
build.gradle
Reutilización 
Los archivos se pueden compartir
Reutilización 
Los archivos se pueden compartir 
gradle.properties 
version=0.1.0-SNAPSHOT 
springVersion=3.2.5.RELEASE 
sharedLocation=https://raw.github.com/autentia/common/ 
#commitId of the version to be used 
commonComponentsVersion=c7e2110511112c5055e0aaaa7db953b35129a95b
Reutilización 
Los archivos se pueden compartir 
gradle.properties 
apply from: ‘$sharedLocation/$commonComponentsVersion/autentia-nexus.gradle’ 
! 
dependencies { 
compile "com.google.guava:guava:r05", 
"org.apache.commons:commons-lang3:3.1", 
"org.slf4j:slf4j-api:1.6.1", 
"ch.qos.logback:logback-classic:0.9.24", 
"org.springframework:spring-aop:$springVersion", 
"org.springframework:spring-beans:$springVersion", 
"org.springframework:spring-context:$springVersion", 
"org.springframework:spring-core:$springVersion", 
"org.springframework:spring-web:$springVersion", 
"org.springframework.data:spring-data-mongodb:1.0.1.RELEASE", 
"org.mongodb:mongo-java-driver:2.7.1" 
testCompile "org.mockito:mockito-core:1.8.5" 
} 
build.gradle 
version=0.1.0-SNAPSHOT 
springVersion=3.2.5.RELEASE 
sharedLocation=https://raw.github.com/autentia/common/ 
#commitId of the version to be used 
commonComponentsVersion=c7e2110511112c5055e0aaaa7db953b35129a95b
Extensibilidad 
Podemos ampliar la funcionalidad fácilmente
Extensibilidad 
Podemos ampliar la funcionalidad fácilmente 
task deployJetty(dependsOn: assertJettyHome) << { 
new File("$jettyHome/contexts/${webappName}.xml").write ( 
"""<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" 
"http://jetty.mortbay.org/configure.dtd"> 
<Configure class="org.mortbay.jetty.webapp.WebAppContext"> 
<Set name="contextPath">/${webappName}</Set> 
<Set name="resourceBase">${projectDir}/src/main/webapp</Set> 
</Configure> 
""") 
} 
! 
task undeployJetty(dependsOn: assertJettyHome) << { 
ant.delete file: "$jettyHome/contexts/${webappName}.xml" 
} 
jetty.gradle
Extensibilidad 
Podemos ampliar la funcionalidad fácilmente 
apply from: ‘$sharedLocation/$commonComponentsVersion/jetty.gradle’ 
! 
project.ext { 
webappName=gradle-sample 
jettyHome= System.getenv(“JETTY_HOME”); 
} 
… 
build.gradle 
task deployJetty(dependsOn: assertJettyHome) << { 
new File("$jettyHome/contexts/${webappName}.xml").write ( 
"""<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" 
"http://jetty.mortbay.org/configure.dtd"> 
<Configure class="org.mortbay.jetty.webapp.WebAppContext"> 
<Set name="contextPath">/${webappName}</Set> 
<Set name="resourceBase">${projectDir}/src/main/webapp</Set> 
</Configure> 
""") 
} 
! 
task undeployJetty(dependsOn: assertJettyHome) << { 
ant.delete file: "$jettyHome/contexts/${webappName}.xml" 
} 
jetty.gradle
‘Arquetipos’ 
Hay un proyecto de plugin que procura cubrir ese hueco: 
https://github.com/townsfolk/gradle-templates 
!
‘Arquetipos’ 
Hay un proyecto de plugin que procura cubrir ese hueco: 
https://github.com/townsfolk/gradle-templates 
apply from: 'http://www.tellurianring.com/projects/gradle-plugins/gradle-templates/1.3/apply.groovy' 
! 
… 
!
‘Arquetipos’ 
Hay un proyecto de plugin que procura cubrir ese hueco: 
https://github.com/townsfolk/gradle-templates 
apply from: 'http://www.tellurianring.com/projects/gradle-plugins/gradle-templates/1.3/apply.groovy' 
! 
… 
! 
$ gradle tasks 
! 
Template tasks 
-------------- 
createGradlePlugin - Creates a new Gradle Plugin project in a new directory named after your project. 
createGroovyClass - Creates a new Groovy class in the current project. 
createGroovyProject - Creates a new Gradle Groovy project in a new directory named after your project. 
createJavaClass - Creates a new Java class in the current project. 
createJavaProject - Creates a new Gradle Java project in a new directory named after your project. 
createScalaClass - Creates a new Scala class in the current project. 
createScalaObject - Creates a new Scala object in the current project. 
createScalaProject - Creates a new Gradle Scala project in a new directory named after your project. 
createWebappProject - Creates a new Gradle Webapp project in a new directory named after your project. 
exportAllTemplates - Exports all the default template files into the current directory. 
exportGroovyTemplates - Exports the default groovy template files into the current directory. 
exportJavaTemplates - Exports the default java template files into the current directory. 
exportPluginTemplates - Exports the default plugin template files into the current directory. 
exportScalaTemplates - Exports the default scala template files into the current directory. 
exportWebappTemplates - Exports the default webapp template files into the current directory. 
initGradlePlugin - Initializes a new Gradle Plugin project in the current directory. 
initGroovyProject - Initializes a new Gradle Groovy project in the current directory. 
initJavaProject - Initializes a new Gradle Java project in the current directory. 
initScalaProject - Initializes a new Gradle Scala project in the current directory. 
initWebappProject - Initializes a new Gradle Webapp project in the current directory.
Y mucho más 
• Posibilidad de ejecutar gradle como demonio 
• Toda la potencia de un lenguaje para los scripts 
• Integración con sistemas de Integración Continua 
• Jenkins 
• ClinkerHQ 
• Consola
apply plugin: ‘android’ 
• Build variants 
• local, remote & Module dependencies 
• Manifest entries 
• APK Sign 
• ProGuard 
• Testing
Configuracion android
Configuracion android 
android { 
compileSdkVersion 20 
buildToolsVersion "20.0.0" 
! 
defaultConfig { 
applicationId "com.autentia.dgomezg.sandbox.android.app" 
minSdkVersion 8 
targetSdkVersion 8 
versionCode 1 
versionName "1.0" 
} 
}
Dependencias
Dependencias 
• Librerías en repositorio Maven (librerías remotas) 
dependencies { 
compile 'com.android.support:appcompat-v7:19.0.1' 
}
Dependencias 
• Librerías en repositorio Maven (librerías remotas) 
dependencies { 
compile 'com.android.support:appcompat-v7:19.0.1' 
} 
• Dependencia con otros módulos 
dependencies { 
compile project(":lib") 
}
Dependencias 
• Librerías en repositorio Maven (librerías remotas) 
dependencies { 
// Local binary dependency 
compile fileTree(dir: 'libs', include: ['*.jar']) 
} 
dependencies { 
compile 'com.android.support:appcompat-v7:19.0.1' 
} 
• Dependencia con otros módulos 
dependencies { 
compile project(":lib") 
} 
• Dependencia con librerías locales
Firma de distribución 
• A partir de la release key
Firma de distribución 
• A partir de la release key 
android { 
signingConfigs { 
release { 
storeFile file("myreleasekey.keystore") 
storePassword "password" 
keyAlias "MyReleaseKey" 
keyPassword "password" 
} 
} 
buildTypes { 
release { 
signingConfig signingConfigs.release 
} 
} 
}
Firma de distribución 
• A partir de la release key 
android { 
signingConfigs { 
release { 
storeFile file("myreleasekey.keystore") 
storePassword "password" 
keyAlias "MyReleaseKey" 
keyPassword "password" 
} 
} 
buildTypes { 
release { 
signingConfig signingConfigs.release 
} 
} 
} 
storePassword System.getenv("KSTOREPWD") 
keyPassword System.getenv("KEYPWD")
Firma de distribución 
• A partir de la release key 
android { 
signingConfigs { 
release { 
storeFile file("myreleasekey.keystore") 
storePassword "password" 
keyAlias "MyReleaseKey" 
keyPassword "password" 
} 
} 
buildTypes { 
release { 
signingConfig signingConfigs.release 
} 
} 
} 
storePassword System.getenv("KSTOREPWD") 
keyPassword System.getenv("KEYPWD") 
storePassword System.console().readLine("nKeystore password: ") 
keyPassword System.console().readLIne("nKey password: ")
Build variants 
• Permite sacar distintos desplegables desde el mismo 
proyecto, basado en combinación de 
• BuildType 
• Build Flavor 
• 2 BuildTypes por defecto 
• Debug 
• release
Build flavours 
• Configura los ‘flavors’ (necesita carpetas distintas en /src/)
Build flavours 
• Configura los ‘flavors’ (necesita carpetas distintas en /src/) 
android { 
! 
productFlavors { 
demo { 
applicationId “com.autentia.dgomezg.sandbox.android.app.demo” 
versionName "0.1-demo" 
} 
full { 
applicationId “com.autentia.dgomezg.sandbox.android.app.full" 
versionName “0.1-full" 
} 
} 
}
Conclusiones 
• No más XML Oriented Programming 
• Concisión y legibilidad 
• Toda la potencia de las convenciones de maven 
• Integración con Ant 
• Gestor de dependencias 
• Flexibilidad de un lenguaje de programación 
• Modularización y reutilización

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

Consultas multitabla clase
Consultas multitabla claseConsultas multitabla clase
Consultas multitabla clase
 
U1 s3 introducción a uml parte 1
U1 s3 introducción a uml parte 1U1 s3 introducción a uml parte 1
U1 s3 introducción a uml parte 1
 
PL/SQL - CURSORS
PL/SQL - CURSORSPL/SQL - CURSORS
PL/SQL - CURSORS
 
Introducción a LDAP y los Servicios de Directorio
Introducción a LDAP y los Servicios de DirectorioIntroducción a LDAP y los Servicios de Directorio
Introducción a LDAP y los Servicios de Directorio
 
Entidad Relación Banco
Entidad Relación BancoEntidad Relación Banco
Entidad Relación Banco
 
Diferencias entre base de datos relacional y no relacional
Diferencias entre base de datos relacional y no relacionalDiferencias entre base de datos relacional y no relacional
Diferencias entre base de datos relacional y no relacional
 
Uml diagramas-caso-de-uso
Uml diagramas-caso-de-usoUml diagramas-caso-de-uso
Uml diagramas-caso-de-uso
 
Tarjetas crc
Tarjetas crcTarjetas crc
Tarjetas crc
 
Mongodb Aggregation Pipeline
Mongodb Aggregation PipelineMongodb Aggregation Pipeline
Mongodb Aggregation Pipeline
 
Ejercicio En Weka
Ejercicio En WekaEjercicio En Weka
Ejercicio En Weka
 
Bdoo
Bdoo Bdoo
Bdoo
 
Diseño y Análisis de una Plataforma e-Commerce
Diseño y Análisis de una Plataforma e-CommerceDiseño y Análisis de una Plataforma e-Commerce
Diseño y Análisis de una Plataforma e-Commerce
 
Farmacia
FarmaciaFarmacia
Farmacia
 
TIPO DE DATOS EN ORACLE
TIPO DE DATOS EN ORACLETIPO DE DATOS EN ORACLE
TIPO DE DATOS EN ORACLE
 
Modelo relacional
Modelo relacionalModelo relacional
Modelo relacional
 
En 20 minutos ... Arquitectura Oracle
En 20 minutos ... Arquitectura OracleEn 20 minutos ... Arquitectura Oracle
En 20 minutos ... Arquitectura Oracle
 
Sistemas distribuidos
Sistemas distribuidosSistemas distribuidos
Sistemas distribuidos
 
Normalización de Base de Datos
Normalización de Base de DatosNormalización de Base de Datos
Normalización de Base de Datos
 
Oracle: Cursors
Oracle: CursorsOracle: Cursors
Oracle: Cursors
 
Modelo conceptual entidad interrelacion
Modelo conceptual entidad interrelacionModelo conceptual entidad interrelacion
Modelo conceptual entidad interrelacion
 

Similar a Construccion de proyectos con gradle

Conferencia Rails: Integracion Continua Y Rails
Conferencia Rails: Integracion Continua Y RailsConferencia Rails: Integracion Continua Y Rails
Conferencia Rails: Integracion Continua Y RailsDavid Calavera
 
Dev Tools para Kubernetes - Codemotion 2019
Dev Tools para Kubernetes - Codemotion 2019Dev Tools para Kubernetes - Codemotion 2019
Dev Tools para Kubernetes - Codemotion 2019Micael Gallego
 
Breve introducción práctica al DevOps - (es) 2021_03_18
Breve introducción práctica al DevOps -  (es) 2021_03_18Breve introducción práctica al DevOps -  (es) 2021_03_18
Breve introducción práctica al DevOps - (es) 2021_03_18Young Suk Ahn Park
 
Conferencia DevOps Academy DevOps-the_journey
Conferencia DevOps Academy   DevOps-the_journeyConferencia DevOps Academy   DevOps-the_journey
Conferencia DevOps Academy DevOps-the_journeyDevOpsAcademy
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJSBEEVA_es
 
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...Micael Gallego
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephpbetabeers
 
Probando aplicaciones AngularJS
Probando aplicaciones AngularJSProbando aplicaciones AngularJS
Probando aplicaciones AngularJSRodrigo Pimentel
 
La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
La Caja de Herramientas del Desarrollador Moderno PHPConferenceARLa Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
La Caja de Herramientas del Desarrollador Moderno PHPConferenceARPablo Godel
 
FROM lost to the Docker 2020
FROM lost to the Docker 2020FROM lost to the Docker 2020
FROM lost to the Docker 2020BelnGonzlezGarca1
 
Instalacion y configuracion de Android Studio
Instalacion y configuracion de Android StudioInstalacion y configuracion de Android Studio
Instalacion y configuracion de Android StudioJuan Vladimir
 
Continuous Integration
Continuous Integration Continuous Integration
Continuous Integration jose diaz
 
Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014 Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014 Fernando Petrola
 

Similar a Construccion de proyectos con gradle (20)

Gwt II - trabajando con gwt
Gwt II - trabajando con gwtGwt II - trabajando con gwt
Gwt II - trabajando con gwt
 
Conferencia Rails: Integracion Continua Y Rails
Conferencia Rails: Integracion Continua Y RailsConferencia Rails: Integracion Continua Y Rails
Conferencia Rails: Integracion Continua Y Rails
 
Dev Tools para Kubernetes - Codemotion 2019
Dev Tools para Kubernetes - Codemotion 2019Dev Tools para Kubernetes - Codemotion 2019
Dev Tools para Kubernetes - Codemotion 2019
 
Grails
GrailsGrails
Grails
 
Gwt III - Avanzado
Gwt III - AvanzadoGwt III - Avanzado
Gwt III - Avanzado
 
Breve introducción práctica al DevOps - (es) 2021_03_18
Breve introducción práctica al DevOps -  (es) 2021_03_18Breve introducción práctica al DevOps -  (es) 2021_03_18
Breve introducción práctica al DevOps - (es) 2021_03_18
 
Dbdeployer
DbdeployerDbdeployer
Dbdeployer
 
Conferencia DevOps Academy DevOps-the_journey
Conferencia DevOps Academy   DevOps-the_journeyConferencia DevOps Academy   DevOps-the_journey
Conferencia DevOps Academy DevOps-the_journey
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJS
 
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
 
Herramientas Java
Herramientas JavaHerramientas Java
Herramientas Java
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
 
Probando aplicaciones AngularJS
Probando aplicaciones AngularJSProbando aplicaciones AngularJS
Probando aplicaciones AngularJS
 
La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
La Caja de Herramientas del Desarrollador Moderno PHPConferenceARLa Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
La Caja de Herramientas del Desarrollador Moderno PHPConferenceAR
 
FROM lost to the Docker 2020
FROM lost to the Docker 2020FROM lost to the Docker 2020
FROM lost to the Docker 2020
 
Semana 2 Configuración entorno de desarrollo
Semana 2   Configuración entorno de desarrolloSemana 2   Configuración entorno de desarrollo
Semana 2 Configuración entorno de desarrollo
 
Instalacion y configuracion de Android Studio
Instalacion y configuracion de Android StudioInstalacion y configuracion de Android Studio
Instalacion y configuracion de Android Studio
 
Continuous Integration
Continuous Integration Continuous Integration
Continuous Integration
 
Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014 Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014
 

Más de David Gómez García

Leverage CompletableFutures to handle async queries. DevNexus 2022
Leverage CompletableFutures to handle async queries. DevNexus 2022Leverage CompletableFutures to handle async queries. DevNexus 2022
Leverage CompletableFutures to handle async queries. DevNexus 2022David Gómez García
 
Building Modular monliths that could scale to microservices (only if they nee...
Building Modular monliths that could scale to microservices (only if they nee...Building Modular monliths that could scale to microservices (only if they nee...
Building Modular monliths that could scale to microservices (only if they nee...David Gómez García
 
Building modular monoliths that could scale to microservices (only if they ne...
Building modular monoliths that could scale to microservices (only if they ne...Building modular monoliths that could scale to microservices (only if they ne...
Building modular monoliths that could scale to microservices (only if they ne...David Gómez García
 
Leveraging Completable Futures to handle your query results Asynchrhonously
Leveraging Completable Futures to handle your query results AsynchrhonouslyLeveraging Completable Futures to handle your query results Asynchrhonously
Leveraging Completable Futures to handle your query results AsynchrhonouslyDavid Gómez García
 
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021Builiding Modular monoliths that can scale to microservices. JBCNConf 2021
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021David Gómez García
 
Cdm mil-18 - hypermedia ap is for headless platforms and data integration
Cdm mil-18 - hypermedia ap is for headless platforms and data integrationCdm mil-18 - hypermedia ap is for headless platforms and data integration
Cdm mil-18 - hypermedia ap is for headless platforms and data integrationDavid Gómez García
 
What's in a community like Liferay's
What's in a community like Liferay'sWhat's in a community like Liferay's
What's in a community like Liferay'sDavid Gómez García
 
Java9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadJava9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadDavid Gómez García
 
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTRT3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTRDavid Gómez García
 
Managing user's data with Spring Session
Managing user's data with Spring SessionManaging user's data with Spring Session
Managing user's data with Spring SessionDavid Gómez García
 
Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.David Gómez García
 
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)David Gómez García
 
Measuring Code Quality in WTF/min.
Measuring Code Quality in WTF/min. Measuring Code Quality in WTF/min.
Measuring Code Quality in WTF/min. David Gómez García
 
El poder del creador de Software. Entre la ingeniería y la artesanía
El poder del creador de Software. Entre la ingeniería y la artesaníaEl poder del creador de Software. Entre la ingeniería y la artesanía
El poder del creador de Software. Entre la ingeniería y la artesaníaDavid Gómez García
 
HDTR images with Photoshop Javascript Scripting
HDTR images with Photoshop Javascript ScriptingHDTR images with Photoshop Javascript Scripting
HDTR images with Photoshop Javascript ScriptingDavid Gómez García
 

Más de David Gómez García (20)

Leverage CompletableFutures to handle async queries. DevNexus 2022
Leverage CompletableFutures to handle async queries. DevNexus 2022Leverage CompletableFutures to handle async queries. DevNexus 2022
Leverage CompletableFutures to handle async queries. DevNexus 2022
 
Building Modular monliths that could scale to microservices (only if they nee...
Building Modular monliths that could scale to microservices (only if they nee...Building Modular monliths that could scale to microservices (only if they nee...
Building Modular monliths that could scale to microservices (only if they nee...
 
Building modular monoliths that could scale to microservices (only if they ne...
Building modular monoliths that could scale to microservices (only if they ne...Building modular monoliths that could scale to microservices (only if they ne...
Building modular monoliths that could scale to microservices (only if they ne...
 
Leveraging Completable Futures to handle your query results Asynchrhonously
Leveraging Completable Futures to handle your query results AsynchrhonouslyLeveraging Completable Futures to handle your query results Asynchrhonously
Leveraging Completable Futures to handle your query results Asynchrhonously
 
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021Builiding Modular monoliths that can scale to microservices. JBCNConf 2021
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021
 
Cdm mil-18 - hypermedia ap is for headless platforms and data integration
Cdm mil-18 - hypermedia ap is for headless platforms and data integrationCdm mil-18 - hypermedia ap is for headless platforms and data integration
Cdm mil-18 - hypermedia ap is for headless platforms and data integration
 
What's in a community like Liferay's
What's in a community like Liferay'sWhat's in a community like Liferay's
What's in a community like Liferay's
 
Java9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadJava9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidad
 
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTRT3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
 
Managing user's data with Spring Session
Managing user's data with Spring SessionManaging user's data with Spring Session
Managing user's data with Spring Session
 
Parallel streams in java 8
Parallel streams in java 8Parallel streams in java 8
Parallel streams in java 8
 
Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.
 
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
 
Measuring Code Quality in WTF/min.
Measuring Code Quality in WTF/min. Measuring Code Quality in WTF/min.
Measuring Code Quality in WTF/min.
 
Spring4 whats up doc?
Spring4 whats up doc?Spring4 whats up doc?
Spring4 whats up doc?
 
Gradle como alternativa a maven
Gradle como alternativa a mavenGradle como alternativa a maven
Gradle como alternativa a maven
 
El poder del creador de Software. Entre la ingeniería y la artesanía
El poder del creador de Software. Entre la ingeniería y la artesaníaEl poder del creador de Software. Entre la ingeniería y la artesanía
El poder del creador de Software. Entre la ingeniería y la artesanía
 
Geo-SentimentZ
Geo-SentimentZGeo-SentimentZ
Geo-SentimentZ
 
HDTR images with Photoshop Javascript Scripting
HDTR images with Photoshop Javascript ScriptingHDTR images with Photoshop Javascript Scripting
HDTR images with Photoshop Javascript Scripting
 
Wtf per lineofcode
Wtf per lineofcodeWtf per lineofcode
Wtf per lineofcode
 

Último

Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxMariaBurgos55
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son241514984
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxJOSEFERNANDOARENASCA
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativaAdrianaMartnez618894
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.241514949
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptMiguelAtencio10
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxJOSEMANUELHERNANDEZH11
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxAlexander López
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..RobertoGumucio2
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELmaryfer27m
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptJavierHerrera662252
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaarkananubis
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 

Último (20)

Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptx
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptx
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativa
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.ppt
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptx
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFEL
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en mina
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 

Construccion de proyectos con gradle

  • 1. Construcción de proyectos con David Gómez G. @dgomezg
  • 2. Automatizar la construcción… ¿Pur qué? • Evitar empaquetado manual • Construir rápidamente y en cualquier entorno • Builds programadas (C.I.) Foto de Steindy http://commons.wikimedia.org/wiki/File:Jose_Mourinho_-_Inter_Mailand_(7).jpg
  • 3. Herramientas Fichero de descripción + Código fuente + Gestión de dependencias = Artefacto
  • 4. Características • Basado en Java • Configuración basada en XML • Gestor de dependencias adicional (Ivy) • Muy flexible • Todas las tareas se definen específicamente
  • 5. Pegas • Muy verboso. XML muy extensos • Difícil escribir lógica compleja (condiciones) • Estructura de proyecto libre. • Difícil de mantener • Difícil de entender el proceso de construcción.
  • 7. Ejemplo <?xml version="1.0" encoding="UTF-8"?> <project> <target name="clean"> <delete dir="build"/> </target> <target name="compile"> <mkdir dir="build/classes"/> <javac srcdir="src" destdir="build/classes"/> </target> <target name="jar"> <mkdir dir="build/jar"/> <jar destfile="build/jar/HelloWorld.jar" basedir="build/classes"> <manifest> <attribute name="Main-Class" value="com.autentia.dgomezg.sandbox.ant.HelloWorld"/> </manifest> </jar> </target> ! <target name="run"> <java jar="build/jar/HelloWorld.jar" fork="true"/> </target> ! </project>
  • 8. Ejemplo <?xml version="1.0" encoding="UTF-8"?> <project> <target name="clean"> <delete dir="build"/> </target> <target name="compile"> <mkdir dir="build/classes"/> <javac srcdir="src" destdir="build/classes"/> </target> <target name="jar"> <mkdir dir="build/jar"/> <jar destfile="build/jar/HelloWorld.jar" basedir="build/classes"> <manifest> <attribute name="Main-Class" value="com.autentia.dgomezg.sandbox.ant.HelloWorld"/> </manifest> </jar> </target> ! <target name="run"> <java jar="build/jar/HelloWorld.jar" fork="true"/> </target> ! </project> dolamroth:ant-sample dgomezg$ ant clean compile jar run Buildfile: /Users/dgomezg/Documents/workspace/ant-sample/build.xml ! clean: ! compile: [mkdir] Created dir: /Users/dgomezg/Documents/workspace/ant-sample/ build/classes [javac] Compiling 1 source file to /Users/dgomezg/Documents/ workspace/ant-sample/build/classes ! jar: [mkdir] Created dir: /Users/dgomezg/Documents/workspace/ant-sample/ build/jar [jar] Building jar: /Users/dgomezg/Documents/workspace/ant-sample/ build/jar/HelloWorld.jar ! run: [java] Hello World ! BUILD SUCCESSFUL Total time: 1 second dolamroth:ant-sample dgomezg$
  • 9. Características • Convención sobre configuración • Estructura de proyecto determinada • Proceso de construcción definido • Gestor de dependencias • Informes de construcción y de test • Arquetipos • Ampliable con Plugins (Mojos)
  • 10. Pegas • Estructura demasiado rígida • Extensión complicada • Fichero de build verboso • Especialmente si configuramos plugins
  • 12. Ejemplo <?xml version="1.0" encoding="UTF-8"?> <project> <modelVersion>4.0.0</modelVersion> <groupId>com.autentia.dgomezg.sandbox</groupId> <artifactId>mvn-sample</artifactId> <version>1.0.0</version> </project>
  • 13. Ejemplo <?xml version="1.0" encoding="UTF-8"?> <project> <modelVersion>4.0.0</modelVersion> <groupId>com.autentia.dgomezg.sandbox</groupId> <artifactId>mvn-sample</artifactId> <version>1.0.0</version> </project> dolamroth:mvn-sample dgomezg$ mvn package [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building mvn-sample 1.0.0 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ mvn-sample --- [debug] execute contextualize [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] Copying 0 resource [INFO] [INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ mvn-sample --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-resources-plugin:2.5:testResources (default-testResources) @ mvn-sample --- [debug] execute contextualize [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] Copying 0 resource [INFO] [INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ mvn-sample --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-surefire-plugin:2.10:test (default-test) @ mvn-sample --- [INFO] Surefire report directory: /Users/dgomezg/Documents/workspace/mvn-sample/target/surefire-reports ! ------------------------------------------------------- T E S T S ------------------------------------------------------- ! Results : ! Tests run: 0, Failures: 0, Errors: 0, Skipped: 0 ! [INFO] [INFO] --- maven-jar-plugin:2.3.2:jar (default-jar) @ mvn-sample --- [INFO] Building jar: /Users/dgomezg/Documents/workspace/mvn-sample/target/mvn-sample-1.0.0.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.876s [INFO] Finished at: Wed Nov 20 13:32:06 CET 2013 [INFO] Final Memory: 7M/245M [INFO] ------------------------------------------------------------------------ dolamroth:mvn-sample dgomezg$
  • 14. ¿Qué se puede mejorar? Ficheros de build más concisos Convención para estructura Flexibilidad para requisitos Builds incrementales Reutilización de partes del script Soporte para implementar lógica
  • 15. Características • Flexibilidad • Definición de nuevas tareas • Gestor de dependencias (Ivy) • Convención sobre configuración • Multi-Módulo • Plugins • Gestor de dependencias
  • 16. Características • Basado en Groovy • Lenguaje completo • Permite definir lógica más compleja • Convenciones Flexibles • Extensibilidad • Integración con Ant (AntExecutor) y maven
  • 19. Ejemplo build.gradle apply plugin: 'java' ! group = 'com.autentia.dgomezg.sandbox' archivesBaseName = 'gradle-sample' version = '0.1.0-SNAPSHOT' !
  • 20. Ejemplo apply plugin: 'java' ! group = 'com.autentia.dgomezg.sandbox' archivesBaseName = 'gradle-sample' version = '0.1.0-SNAPSHOT' ! dolamroth:gradle-sample dgomezg$ gradle build :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :jar :assemble :compileTestJava UP-TO-DATE :processTestResources UP-TO-DATE :testClasses UP-TO-DATE :test :check :build ! BUILD SUCCESSFUL ! Total time: 2.375 secs dolamroth:gradle-sample dgomezg$ build.gradle
  • 21. Ejemplo build.gradle apply plugin: 'java' ! group = 'com.autentia.dgomezg.sandbox' archivesBaseName = 'gradle-sample' version = '0.1.0-SNAPSHOT' ! dolamroth:gradle-sample dgomezg$ gradle build :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :jar :assemble :compileTestJava UP-TO-DATE :processTestResources UP-TO-DATE :testClasses UP-TO-DATE :test :check :build ! BUILD SUCCESSFUL ! Total time: 2.375 secs dolamroth:gradle-sample dgomezg$ sourceCompatibility = 1.6 ! jar { manifest { attributes 'Main-Class': 'com.autentia.dgomezg.sandbox.gradle.HelloWorld' } }
  • 24. La lista de tareas gradle tasks o gradle tasks --all
  • 25. Groovy DSL Todo tiene un equivalente en clases java http://gradle.org/docs/current/javadoc/index.html
  • 26. Groovy DSL Mayor flexibilidad a la hora de definir nuevas tareas
  • 27. Groovy DSL Mayor flexibilidad a la hora de definir nuevas tareas task projectVersion { doLast { println ‘Project version’ + project.version } }
  • 28. Groovy DSL Mayor flexibilidad a la hora de definir nuevas tareas task projectVersion { doLast { println ‘Project version’ + project.version } } dolamroth:gradle-sample dgomezg$ gradle projectVersion :projectVersion Project Version: 0.1.0-SNAPSHOT ! BUILD SUCCESSFUL ! Total time: 3.708 secs
  • 29. Groovy DSL Mayor flexibilidad a la hora de definir nuevas tareas task projectVersion { doLast { println ‘Project version’ + project.version } } dolamroth:gradle-sample dgomezg$ gradle projectVersion :projectVersion Project Version: 0.1.0-SNAPSHOT ! BUILD SUCCESSFUL ! Total time: 3.708 secs dolamroth:gradle-sample dgomezg$ gradle -q projectVersion Project Version: 0.1.0-SNAPSHOT dolamroth:gradle-sample dgomezg
  • 30. Plugins Permiten activar funcionalidades
  • 31. Plugins Permiten activar funcionalidades apply plugin: 'java' apply plugin: 'maven' apply plugin: ‘eclipse' apply plugin: 'war' ! group = 'com.autentia.dgomezg.sandbox' archivesBaseName = 'gradle-sample' version = '0.1.0-SNAPSHOT' ! sourceCompatibility = 1.6
  • 32. Plugins Permiten activar funcionalidades apply plugin: 'java' apply plugin: 'maven' apply plugin: ‘eclipse' apply plugin: 'war' ! group = 'com.autentia.dgomezg.sandbox' archivesBaseName = 'gradle-sample' version = '0.1.0-SNAPSHOT' ! sourceCompatibility = 1.6 $ gradle tasks ! Build tasks ----------- assemble - Assembles the outputs of this project. build - Assembles and tests this project. buildDependents - Assembles and tests this project and all projects that depend on it. buildNeeded - Assembles and tests this project and all projects it depends on. clean - Deletes the build directory. jar - Assembles a jar archive containing the main classes. war - Generates a war archive with all the compiled classes, the web-app content and the libraries. ! Documentation tasks ------------------- javadoc - Generates Javadoc API documentation for the main source code. ! IDE tasks --------- cleanEclipse - Cleans all Eclipse files. eclipse - Generates all Eclipse files. ! Other tasks ----------- install - Installs the 'archives' artifacts into the local Maven repository.
  • 33. Integración con ant Propiedad ant disponible en todas las tareas
  • 34. Integración con ant Propiedad ant disponible en todas las tareas task projectVersion { doLast { ant.echo(message: 'Project Version: ' + project.version) } }
  • 35. Integración con ant Propiedad ant disponible en todas las tareas task projectVersion { doLast { ant.echo(message: 'Project Version: ' + project.version) } } dolamroth:gradle-sample dgomezg$ gradle -q projectVersion dolamroth:gradle-sample dgomezg$ dolamroth:gradle-sample dgomezg$ gradle projectVersion :projectVersion [ant:echo] Project Version: 0.1.0-SNAPSHOT ! BUILD SUCCESSFUL ! Total time: 2.914 secs dolamroth:gradle-sample dgomezg$
  • 36. Integración con maven Por defecto, toma las convenciones de maven Se puede integrar con los repositorios de maven
  • 37. Integración con maven Por defecto, toma las convenciones de maven Se puede integrar con los repositorios de maven repositories { mavenRepo name: 'nexus', url: 'http://terraka:8080/nexus/content/repositories/public' mavenCentral() mavenRepo name: 'spring-milestones', url: 'http://maven.springframework.org/milestone' mavenRepo name: 'java.net', url: 'http://download.java.net/maven/2/' }
  • 38. Integración con maven Por defecto, toma las convenciones de maven Se puede integrar con los repositorios de maven repositories { mavenRepo name: 'nexus', url: 'http://terraka:8080/nexus/content/repositories/public' mavenCentral() mavenRepo name: 'spring-milestones', url: 'http://maven.springframework.org/milestone' mavenRepo name: 'java.net', url: 'http://download.java.net/maven/2/' } Declaración compacta de dependencias
  • 39. Integración con maven Por defecto, toma las convenciones de maven Se puede integrar con los repositorios de maven repositories { mavenRepo name: 'nexus', url: 'http://terraka:8080/nexus/content/repositories/public' mavenCentral() mavenRepo name: 'spring-milestones', url: 'http://maven.springframework.org/milestone' mavenRepo name: 'java.net', url: 'http://download.java.net/maven/2/' } Declaración compacta de dependencias dependencies { compile "com.google.guava:guava:12.0", "org.apache.commons:commons-lang3:3.1", "org.slf4j:jcl-over-slf4j:1.6.1", "org.springframework.security:spring-security-core:3.0.1.RELEASE", "org.springframework:spring-jdbc:3.0.0.RELEASE", "org.springframework:spring-tx:3.0.0.RELEASE" runtime "org.apache.geronimo.specs:geronimo-jpa_3.0_spec:1.1.1", "org.apache.geronimo.specs:geronimo-servlet_2.4_spec:1.1.1" testCompile "junit:junit:4.5", "org.springframework:spring-test:3.0.0.RELEASE" }
  • 40. Integración con maven Se pueden excluir dependencias transitivas
  • 41. Integración con maven Se pueden excluir dependencias transitivas configurations { sources.exclude group: 'com.google.code.guice' all*.exclude module: 'commons-logging' }
  • 42. Integración con maven Se pueden excluir dependencias transitivas configurations { sources.exclude group: 'com.google.code.guice' all*.exclude module: 'commons-logging' } Se pueden subir artefactos al repositorio
  • 43. Integración con maven Se pueden excluir dependencias transitivas configurations { sources.exclude group: 'com.google.code.guice' all*.exclude module: 'commons-logging' } Se pueden subir artefactos al repositorio apply plugin: 'maven' ! uploadArchives { ! repositories.mavenDeployer { def credentials = [userName: 'user', password: 'password'] uniqueVersion = true snapshotRepository(url: 'http://gitrepo:8081/nexus/content/repositories/snapshots') { authentication(credentials) } repository(url: 'http://gitrepo:8081/nexus/content/repositories/releases') { authentication(credentials) } } }
  • 44. Propiedades Se pueden utilizar propiedades internas
  • 45. Propiedades project.ext { springVersion = ‘3.2.5.RELEASE’ } ! dependencies { compile “org.springframework.security:spring-security-core:${springVersion}”, "org.springframework:spring-jdbc:${springVersion}", "org.springframework:spring-tx:${springVersion}" testCompile "junit:junit:4.5", “org.springframework:spring-test:${springVersion}” } Se pueden utilizar propiedades internas
  • 46. Propiedades project.ext { springVersion = ‘3.2.5.RELEASE’ } ! dependencies { compile “org.springframework.security:spring-security-core:${springVersion}”, "org.springframework:spring-jdbc:${springVersion}", "org.springframework:spring-tx:${springVersion}" testCompile "junit:junit:4.5", “org.springframework:spring-test:${springVersion}” Se pueden utilizar propiedades externas } Se pueden utilizar propiedades internas
  • 47. Propiedades Se pueden utilizar propiedades externas version=0.1.0-SNAPSHOT springVersion=3.2.5.RELEASE sharedLocation=https://raw.github.com/autentia/common/ gradle.properties project.ext { springVersion = ‘3.2.5.RELEASE’ } ! dependencies { compile “org.springframework.security:spring-security-core:${springVersion}”, "org.springframework:spring-jdbc:${springVersion}", "org.springframework:spring-tx:${springVersion}" testCompile "junit:junit:4.5", “org.springframework:spring-test:${springVersion}” } Se pueden utilizar propiedades internas
  • 48. Propiedades dependencies { compile “org.springframework.security:spring-security-core:${springVersion}”, "org.springframework:spring-jdbc:${springVersion}", "org.springframework:spring-tx:${springVersion}" testCompile "junit:junit:4.5", “org.springframework:spring-test:${springVersion}” } Se pueden utilizar propiedades externas version=0.1.0-SNAPSHOT springVersion=3.2.5.RELEASE sharedLocation=https://raw.github.com/autentia/common/ gradle.properties build.gradle project.ext { springVersion = ‘3.2.5.RELEASE’ } ! dependencies { compile “org.springframework.security:spring-security-core:${springVersion}”, "org.springframework:spring-jdbc:${springVersion}", "org.springframework:spring-tx:${springVersion}" testCompile "junit:junit:4.5", “org.springframework:spring-test:${springVersion}” } Se pueden utilizar propiedades internas
  • 50. Gradle on JVM task projectVersion { doLast { println ‘Project version’ + project.version } }
  • 51. Gradle on JVM task projectVersion { doLast { println ‘Project version’ + project.version } } dolamroth:gradle-sample dgomezg$ gradle projectVersion :projectVersion Project Version: 0.1.0-SNAPSHOT ! BUILD SUCCESSFUL ! Total time: 3.708 secs
  • 52. Gradle on JVM task projectVersion { doLast { println ‘Project version’ + project.version } } dolamroth:gradle-sample dgomezg$ gradle projectVersion :projectVersion Project Version: 0.1.0-SNAPSHOT ! BUILD SUCCESSFUL ! Total time: 3.708 secs WTF!!!!
  • 53. Gradle on JVM task projectVersion { doLast { println ‘Project version’ + project.version } } dolamroth:gradle-sample dgomezg$ gradle projectVersion :projectVersion Project Version: 0.1.0-SNAPSHOT ! BUILD SUCCESSFUL ! Total time: 3.708 secs WTF!!!! Tiempo dedicado a levantar la JVM y traducir el script
  • 54. Gradle daemon to the rescue! gradle --daemon
  • 55. Gradle daemon to the rescue! gradle --daemon
  • 56. Gradle daemon to the rescue! gradle --daemon
  • 59. Gradle Wrapper task wrapper(type: Wrapper) { gradleVersion = '1.7' }
  • 60. Gradle Wrapper task wrapper(type: Wrapper) { gradleVersion = '1.7' } $ gradle wrapper :wrapper ! BUILD SUCCESSFUL ! Total time: 5.071 secs ! $ ls -l gradle/wrapper total 112 -rw-r--r-- 1 dgomezg staff 49875 Nov 20 16:53 gradle-wrapper.jar -rw-r--r-- 1 dgomezg staff 229 Nov 20 16:53 gradle-wrapper.properties $ ls gradle* gradle.properties gradlew gradlew.bat $ ./gradlew build :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :war UP-TO-DATE :assemble UP-TO-DATE :compileTestJava UP-TO-DATE :processTestResources UP-TO-DATE :testClasses UP-TO-DATE :test UP-TO-DATE :check UP-TO-DATE :build UP-TO-DATE ! BUILD SUCCESSFUL ! Total time: 3.531 secs
  • 61. Convención flexible Se pueden adaptar las convenciones de estructura de proyecto
  • 62. Convención flexible Se pueden adaptar las convenciones de estructura de sourceSets { main { java { srcDirs = ['src'] } } test { java { srcDirs = ['test'] } } } buildDir = 'out' proyecto
  • 63. Convención flexible Se pueden adaptar las convenciones de estructura de sourceSets { main { java { srcDirs = ['src'] } } test { java { srcDirs = ['test'] } } } buildDir = 'out' proyecto compileJava { source 'src/protobuf/java' source 'src/main/java' }
  • 64. Reutilización Los archivos se pueden modularizar
  • 65. Reutilización apply plugin: 'java' apply plugin: 'maven' apply plugin: 'eclipse' ! group = 'com.autentia.dgomezg.sandbox' archivesBaseName = 'gradle-sample' ! sourceCompatibility = 1.6 ! repositories { //mavenRepo name: 'nexus', url: 'http://terraka:8080/nexus/content/repositories/public' mavenCentral() mavenRepo name: 'spring-milestones', url: 'http://maven.springframework.org/milestone' mavenRepo name: 'java.net', url: 'http://download.java.net/maven/2/' } ! dependencies { compile "org.springframework.security:spring-security-core:3.0.1.RELEASE", "org.springframework:spring-jdbc:3.0.0.RELEASE", "org.springframework:spring-tx:3.0.0.RELEASE" testCompile "junit:junit:4.5", "org.springframework:spring-test:3.0.0.RELEASE" } ! Los archivos se pueden modularizar
  • 66. Reutilización apply plugin: 'java' apply plugin: 'maven' apply plugin: 'eclipse' ! group = 'com.autentia.dgomezg.sandbox' archivesBaseName = 'gradle-sample' ! sourceCompatibility = 1.6 ! repositories { //mavenRepo name: 'nexus', url: 'http://terraka:8080/nexus/content/repositories/public' mavenCentral() mavenRepo name: 'spring-milestones', url: 'http://maven.springframework.org/milestone' mavenRepo name: 'java.net', url: 'http://download.java.net/maven/2/' } ! dependencies { compile "org.springframework.security:spring-security-core:3.0.1.RELEASE", "org.springframework:spring-jdbc:3.0.0.RELEASE", "org.springframework:spring-tx:3.0.0.RELEASE" testCompile "junit:junit:4.5", "org.springframework:spring-test:3.0.0.RELEASE" } ! Los archivos se pueden modularizar project.gradle
  • 67. Reutilización Los archivos se pueden importar
  • 68. Reutilización Los archivos se pueden importar apply plugin: 'java' apply plugin: 'maven' apply plugin: 'eclipse' ! group = 'com.autentia.dgomezg.sandbox' archivesBaseName = 'gradle-sample' ! sourceCompatibility = 1.6 ! repositories { } ! dependencies { } project.gradle
  • 69. Reutilización Los archivos se pueden importar apply plugin: 'java' apply plugin: 'maven' apply plugin: 'eclipse' ! group = 'com.autentia.dgomezg.sandbox' archivesBaseName = 'gradle-sample' ! sourceCompatibility = 1.6 ! repositories { } ! dependencies { } project.gradle apply from: ‘../autentia-common/project.gradle’ ! dependencies { compile "com.google.guava:guava:r05", "org.apache.commons:commons-lang3:3.1", "org.slf4j:slf4j-api:1.6.1", "ch.qos.logback:logback-classic:0.9.24", "org.springframework:spring-aop:$springVersion", "org.springframework:spring-beans:$springVersion", "org.springframework:spring-context:$springVersion", "org.springframework:spring-core:$springVersion", "org.springframework:spring-web:$springVersion", "org.springframework.data:spring-data-mongodb:1.0.1.RELEASE", "org.mongodb:mongo-java-driver:2.7.1" testCompile "org.mockito:mockito-core:1.8.5" } build.gradle
  • 70. Reutilización Los archivos se pueden compartir
  • 71. Reutilización Los archivos se pueden compartir gradle.properties version=0.1.0-SNAPSHOT springVersion=3.2.5.RELEASE sharedLocation=https://raw.github.com/autentia/common/ #commitId of the version to be used commonComponentsVersion=c7e2110511112c5055e0aaaa7db953b35129a95b
  • 72. Reutilización Los archivos se pueden compartir gradle.properties apply from: ‘$sharedLocation/$commonComponentsVersion/autentia-nexus.gradle’ ! dependencies { compile "com.google.guava:guava:r05", "org.apache.commons:commons-lang3:3.1", "org.slf4j:slf4j-api:1.6.1", "ch.qos.logback:logback-classic:0.9.24", "org.springframework:spring-aop:$springVersion", "org.springframework:spring-beans:$springVersion", "org.springframework:spring-context:$springVersion", "org.springframework:spring-core:$springVersion", "org.springframework:spring-web:$springVersion", "org.springframework.data:spring-data-mongodb:1.0.1.RELEASE", "org.mongodb:mongo-java-driver:2.7.1" testCompile "org.mockito:mockito-core:1.8.5" } build.gradle version=0.1.0-SNAPSHOT springVersion=3.2.5.RELEASE sharedLocation=https://raw.github.com/autentia/common/ #commitId of the version to be used commonComponentsVersion=c7e2110511112c5055e0aaaa7db953b35129a95b
  • 73. Extensibilidad Podemos ampliar la funcionalidad fácilmente
  • 74. Extensibilidad Podemos ampliar la funcionalidad fácilmente task deployJetty(dependsOn: assertJettyHome) << { new File("$jettyHome/contexts/${webappName}.xml").write ( """<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd"> <Configure class="org.mortbay.jetty.webapp.WebAppContext"> <Set name="contextPath">/${webappName}</Set> <Set name="resourceBase">${projectDir}/src/main/webapp</Set> </Configure> """) } ! task undeployJetty(dependsOn: assertJettyHome) << { ant.delete file: "$jettyHome/contexts/${webappName}.xml" } jetty.gradle
  • 75. Extensibilidad Podemos ampliar la funcionalidad fácilmente apply from: ‘$sharedLocation/$commonComponentsVersion/jetty.gradle’ ! project.ext { webappName=gradle-sample jettyHome= System.getenv(“JETTY_HOME”); } … build.gradle task deployJetty(dependsOn: assertJettyHome) << { new File("$jettyHome/contexts/${webappName}.xml").write ( """<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd"> <Configure class="org.mortbay.jetty.webapp.WebAppContext"> <Set name="contextPath">/${webappName}</Set> <Set name="resourceBase">${projectDir}/src/main/webapp</Set> </Configure> """) } ! task undeployJetty(dependsOn: assertJettyHome) << { ant.delete file: "$jettyHome/contexts/${webappName}.xml" } jetty.gradle
  • 76. ‘Arquetipos’ Hay un proyecto de plugin que procura cubrir ese hueco: https://github.com/townsfolk/gradle-templates !
  • 77. ‘Arquetipos’ Hay un proyecto de plugin que procura cubrir ese hueco: https://github.com/townsfolk/gradle-templates apply from: 'http://www.tellurianring.com/projects/gradle-plugins/gradle-templates/1.3/apply.groovy' ! … !
  • 78. ‘Arquetipos’ Hay un proyecto de plugin que procura cubrir ese hueco: https://github.com/townsfolk/gradle-templates apply from: 'http://www.tellurianring.com/projects/gradle-plugins/gradle-templates/1.3/apply.groovy' ! … ! $ gradle tasks ! Template tasks -------------- createGradlePlugin - Creates a new Gradle Plugin project in a new directory named after your project. createGroovyClass - Creates a new Groovy class in the current project. createGroovyProject - Creates a new Gradle Groovy project in a new directory named after your project. createJavaClass - Creates a new Java class in the current project. createJavaProject - Creates a new Gradle Java project in a new directory named after your project. createScalaClass - Creates a new Scala class in the current project. createScalaObject - Creates a new Scala object in the current project. createScalaProject - Creates a new Gradle Scala project in a new directory named after your project. createWebappProject - Creates a new Gradle Webapp project in a new directory named after your project. exportAllTemplates - Exports all the default template files into the current directory. exportGroovyTemplates - Exports the default groovy template files into the current directory. exportJavaTemplates - Exports the default java template files into the current directory. exportPluginTemplates - Exports the default plugin template files into the current directory. exportScalaTemplates - Exports the default scala template files into the current directory. exportWebappTemplates - Exports the default webapp template files into the current directory. initGradlePlugin - Initializes a new Gradle Plugin project in the current directory. initGroovyProject - Initializes a new Gradle Groovy project in the current directory. initJavaProject - Initializes a new Gradle Java project in the current directory. initScalaProject - Initializes a new Gradle Scala project in the current directory. initWebappProject - Initializes a new Gradle Webapp project in the current directory.
  • 79. Y mucho más • Posibilidad de ejecutar gradle como demonio • Toda la potencia de un lenguaje para los scripts • Integración con sistemas de Integración Continua • Jenkins • ClinkerHQ • Consola
  • 80. apply plugin: ‘android’ • Build variants • local, remote & Module dependencies • Manifest entries • APK Sign • ProGuard • Testing
  • 82. Configuracion android android { compileSdkVersion 20 buildToolsVersion "20.0.0" ! defaultConfig { applicationId "com.autentia.dgomezg.sandbox.android.app" minSdkVersion 8 targetSdkVersion 8 versionCode 1 versionName "1.0" } }
  • 84. Dependencias • Librerías en repositorio Maven (librerías remotas) dependencies { compile 'com.android.support:appcompat-v7:19.0.1' }
  • 85. Dependencias • Librerías en repositorio Maven (librerías remotas) dependencies { compile 'com.android.support:appcompat-v7:19.0.1' } • Dependencia con otros módulos dependencies { compile project(":lib") }
  • 86. Dependencias • Librerías en repositorio Maven (librerías remotas) dependencies { // Local binary dependency compile fileTree(dir: 'libs', include: ['*.jar']) } dependencies { compile 'com.android.support:appcompat-v7:19.0.1' } • Dependencia con otros módulos dependencies { compile project(":lib") } • Dependencia con librerías locales
  • 87. Firma de distribución • A partir de la release key
  • 88. Firma de distribución • A partir de la release key android { signingConfigs { release { storeFile file("myreleasekey.keystore") storePassword "password" keyAlias "MyReleaseKey" keyPassword "password" } } buildTypes { release { signingConfig signingConfigs.release } } }
  • 89. Firma de distribución • A partir de la release key android { signingConfigs { release { storeFile file("myreleasekey.keystore") storePassword "password" keyAlias "MyReleaseKey" keyPassword "password" } } buildTypes { release { signingConfig signingConfigs.release } } } storePassword System.getenv("KSTOREPWD") keyPassword System.getenv("KEYPWD")
  • 90. Firma de distribución • A partir de la release key android { signingConfigs { release { storeFile file("myreleasekey.keystore") storePassword "password" keyAlias "MyReleaseKey" keyPassword "password" } } buildTypes { release { signingConfig signingConfigs.release } } } storePassword System.getenv("KSTOREPWD") keyPassword System.getenv("KEYPWD") storePassword System.console().readLine("nKeystore password: ") keyPassword System.console().readLIne("nKey password: ")
  • 91. Build variants • Permite sacar distintos desplegables desde el mismo proyecto, basado en combinación de • BuildType • Build Flavor • 2 BuildTypes por defecto • Debug • release
  • 92. Build flavours • Configura los ‘flavors’ (necesita carpetas distintas en /src/)
  • 93. Build flavours • Configura los ‘flavors’ (necesita carpetas distintas en /src/) android { ! productFlavors { demo { applicationId “com.autentia.dgomezg.sandbox.android.app.demo” versionName "0.1-demo" } full { applicationId “com.autentia.dgomezg.sandbox.android.app.full" versionName “0.1-full" } } }
  • 94. Conclusiones • No más XML Oriented Programming • Concisión y legibilidad • Toda la potencia de las convenciones de maven • Integración con Ant • Gestor de dependencias • Flexibilidad de un lenguaje de programación • Modularización y reutilización