SlideShare ist ein Scribd-Unternehmen logo
1 von 94
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

Hibernate ORM over JDBC
Hibernate ORM over JDBCHibernate ORM over JDBC
Hibernate ORM over JDBCPratyush Katre
 
Estudio y Estadísticas de Twitter en Guatemala, Centroamérica y Latinoamérica
Estudio y Estadísticas de Twitter en Guatemala, Centroamérica y LatinoaméricaEstudio y Estadísticas de Twitter en Guatemala, Centroamérica y Latinoamérica
Estudio y Estadísticas de Twitter en Guatemala, Centroamérica y LatinoaméricaJose Kont
 
Gobierno de apis
Gobierno de apisGobierno de apis
Gobierno de apisCloudAppi
 
An Attacker's View of Serverless and GraphQL Apps - Abhay Bhargav - AppSec Ca...
An Attacker's View of Serverless and GraphQL Apps - Abhay Bhargav - AppSec Ca...An Attacker's View of Serverless and GraphQL Apps - Abhay Bhargav - AppSec Ca...
An Attacker's View of Serverless and GraphQL Apps - Abhay Bhargav - AppSec Ca...Abhay Bhargav
 
A testing strategy for hexagonal applications
A testing strategy for hexagonal applicationsA testing strategy for hexagonal applications
A testing strategy for hexagonal applicationsMatthias Noback
 
DevOps Transformation in Microsoft – Case Study by Ognjen Bajic and Ana Roje ...
DevOps Transformation in Microsoft – Case Study by Ognjen Bajic and Ana Roje ...DevOps Transformation in Microsoft – Case Study by Ognjen Bajic and Ana Roje ...
DevOps Transformation in Microsoft – Case Study by Ognjen Bajic and Ana Roje ...Bosnia Agile
 
Five Key Numbers to Gauge your Agile Engineering Efforts
Five Key Numbers to Gauge your Agile Engineering EffortsFive Key Numbers to Gauge your Agile Engineering Efforts
Five Key Numbers to Gauge your Agile Engineering EffortsJeff Nielsen
 
Seven Habits of Highly Effective Jenkins Users (2014 edition!)
Seven Habits of Highly Effective Jenkins Users (2014 edition!)Seven Habits of Highly Effective Jenkins Users (2014 edition!)
Seven Habits of Highly Effective Jenkins Users (2014 edition!)Andrew Bayer
 
Choose Boring Technology
Choose Boring TechnologyChoose Boring Technology
Choose Boring TechnologyDan McKinley
 
REST-API overview / concepts
REST-API overview / conceptsREST-API overview / concepts
REST-API overview / conceptsPatrick Savalle
 

Was ist angesagt? (13)

Hibernate ORM over JDBC
Hibernate ORM over JDBCHibernate ORM over JDBC
Hibernate ORM over JDBC
 
Estudio y Estadísticas de Twitter en Guatemala, Centroamérica y Latinoamérica
Estudio y Estadísticas de Twitter en Guatemala, Centroamérica y LatinoaméricaEstudio y Estadísticas de Twitter en Guatemala, Centroamérica y Latinoamérica
Estudio y Estadísticas de Twitter en Guatemala, Centroamérica y Latinoamérica
 
Gobierno de apis
Gobierno de apisGobierno de apis
Gobierno de apis
 
An Attacker's View of Serverless and GraphQL Apps - Abhay Bhargav - AppSec Ca...
An Attacker's View of Serverless and GraphQL Apps - Abhay Bhargav - AppSec Ca...An Attacker's View of Serverless and GraphQL Apps - Abhay Bhargav - AppSec Ca...
An Attacker's View of Serverless and GraphQL Apps - Abhay Bhargav - AppSec Ca...
 
A testing strategy for hexagonal applications
A testing strategy for hexagonal applicationsA testing strategy for hexagonal applications
A testing strategy for hexagonal applications
 
DevOps Transformation in Microsoft – Case Study by Ognjen Bajic and Ana Roje ...
DevOps Transformation in Microsoft – Case Study by Ognjen Bajic and Ana Roje ...DevOps Transformation in Microsoft – Case Study by Ognjen Bajic and Ana Roje ...
DevOps Transformation in Microsoft – Case Study by Ognjen Bajic and Ana Roje ...
 
Digu 05. guías de estilo
Digu 05. guías de estiloDigu 05. guías de estilo
Digu 05. guías de estilo
 
Five Key Numbers to Gauge your Agile Engineering Efforts
Five Key Numbers to Gauge your Agile Engineering EffortsFive Key Numbers to Gauge your Agile Engineering Efforts
Five Key Numbers to Gauge your Agile Engineering Efforts
 
Integral Agile Framework
Integral Agile FrameworkIntegral Agile Framework
Integral Agile Framework
 
Practica cliente servidor java
Practica cliente servidor javaPractica cliente servidor java
Practica cliente servidor java
 
Seven Habits of Highly Effective Jenkins Users (2014 edition!)
Seven Habits of Highly Effective Jenkins Users (2014 edition!)Seven Habits of Highly Effective Jenkins Users (2014 edition!)
Seven Habits of Highly Effective Jenkins Users (2014 edition!)
 
Choose Boring Technology
Choose Boring TechnologyChoose Boring Technology
Choose Boring Technology
 
REST-API overview / concepts
REST-API overview / conceptsREST-API overview / concepts
REST-API overview / concepts
 

Ähnlich wie 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
 

Ähnlich wie 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
 

Mehr von 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
 

Mehr von 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
 

Kürzlich hochgeladen

#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptxHugoGutierrez99
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersIván López Martín
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxtjcesar1
 
PROYECCIÓN DE VISTAS planos de vistas y mas
PROYECCIÓN DE VISTAS planos de vistas y masPROYECCIÓN DE VISTAS planos de vistas y mas
PROYECCIÓN DE VISTAS planos de vistas y maslida630411
 
Clasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxClasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxCarolina Bujaico
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfedepmariaperez
 
Viguetas Pretensadas en concreto armado
Viguetas Pretensadas  en concreto armadoViguetas Pretensadas  en concreto armado
Viguetas Pretensadas en concreto armadob7fwtwtfxf
 
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdfBetianaJuarez1
 
Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1ivanapaterninar
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúCEFERINO DELGADO FLORES
 
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docxPLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docxhasbleidit
 
Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointValerioIvanDePazLoja
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024u20211198540
 
David_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDavid_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDAVIDROBERTOGALLEGOS
 
Nomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de NóminaNomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de Nóminacuellosameidy
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfKarinaCambero3
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosAlbanyMartinez7
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfcristianrb0324
 

Kürzlich hochgeladen (20)

El camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVPEl camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVP
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 Testcontainers
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
 
PROYECCIÓN DE VISTAS planos de vistas y mas
PROYECCIÓN DE VISTAS planos de vistas y masPROYECCIÓN DE VISTAS planos de vistas y mas
PROYECCIÓN DE VISTAS planos de vistas y mas
 
Clasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxClasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptx
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdf
 
Viguetas Pretensadas en concreto armado
Viguetas Pretensadas  en concreto armadoViguetas Pretensadas  en concreto armado
Viguetas Pretensadas en concreto armado
 
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
 
Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
 
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docxPLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
 
Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power Point
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
 
David_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDavid_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptx
 
Nomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de NóminaNomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de Nómina
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdf
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos Juridicos
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdf
 

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