gradle, groovy, jvm

Construcción de proyectos basado en Gradle

gradle-logo-vertical

Gradle es una herramienta de automatización de construcción de software (build automation tool) que nos permiten llevar algunas de tareas involucradas en el proceso de desarrollo, como lo son la compilación del código fuente, el empaquetado y la ejecución de nuestras pruebas de manera automática.
Las Ventajas de usar un sistema de automatización de builds como gradle pueden ser:

  • Implementar integración y pruebas continuas al software.
  • Mejorar la calidad de nuestro producto.
  • Mejorar y acelerar el proceso puesta en marcha de nuestra solución.
  • Eliminar tareas redundantes.
  • Independizar de personas el proceso de empaquetado, y pruebas.
  • Contar con información de construcciones(builds) y liberaciones de manera automática, todo el equipo estará enterado si algún build ha fallado. 😦

Basada en los conceptos de Apache Ant y MavenGradle, nos proporciona un lenguaje específico de dominio(DSL) en vez del tradicional y verboso XML como forma de declarar configuración de nuestro proyecto, además nos proporciona una construcción declarativa, ya que nos permite usar scripts basados en DSL, el cual extiende de Groovy, o sea, podemos extender y programar nuestras propias tareas en la construcción.
Otra característica, es la convención sobre configuración; con este paradigma ganamos simplicidad sin perder flexibilidad ya que nuestra configuración adquiere valores por defecto(simplicidad), solo necesitamos especificar algunos aspectos fuera de nuestra convención cuando sea necesario(flexibilidad)
Con el poder del DSLgradle nos permite agregar y gestionar nuestras dependencias, crear tareas, declarar propiedades, detallar configuraciones, aplicar plugins, definir repositorios, empaquetar el proyecto, realizar pruebas unitarias, integración, especificaciones, y hasta continuous delivery, en otras mas características.

Instalación.

Requisitos.
Gradle 2.8 requiere de JDK o JRE version 6 o superior instalado.

  • Instalación SDKMan(Linux,Unix,Cygwin,OSX)

$curl -s get.sdkman.io | bash

Instalar Gradle
➜ ~ sdk install gradle

  • Instalación Windows

   https://bitnami.com/stack/gradle/installer

Primeros Pasos

Una vez ya instalado en nuestro sistema, vamos a dar nuestros primeros pasos para la creación de un proyecto java, utilizaremos el plugin Init que trae por defecto gradle, este plugin nos permite arrancar el proceso de creación del proyecto mediante la tarea init  que nos generará toda la estructura necesaria para nuestra primera aplicación.

  1. Crear el directorio de nuestra aplicación: mkdir demo
  2. Desde el directorio ejecutar gradle init --type java-library

Gradle provee distintos tipos de librerías aparte de la java, también podemos crear un proyecto del tipo groovy, scala,o en su defecto un proyecto básico con gradle.

Esta tarea nos creara dentro del directorio demo la siguiente estructura:

Screen Shot 2015-10-27 at 4.37.42 PM

Dentro de la estructura podemos ver un archivo importante, el llamado build.gradle.
/*
* This build file was auto generated by running the Gradle 'init' task
* by 'josebovet' at '10/27/15 3:51 PM' with Gradle 2.8
*
* This generated file contains a sample Java project to get you started.
* For more details take a look at the Java Quickstart chapter in the Gradle
* user guide available at https://docs.gradle.org/2.8/userguide/tutorial_java_projects.html
*/

// Apply the java plugin to add support for Java
apply plugin: ‘java’

// In this section you declare where to find the dependencies of your project
repositories {
// Use ‘jcenter’ for resolving your dependencies.
// You can declare any Maven/Ivy/file repository here.
jcenter()
}

// In this section you declare the dependencies for your production and test code
dependencies {
// The production code uses the SLF4J logging API at compile time
compile ‘org.slf4j:slf4j-api:1.7.12’

// Declare the dependency for your favourite test framework you want to use in your tests.
// TestNG is also supported by the Gradle Test task. Just change the
// testCompile dependency to testCompile ‘org.testng:testng:6.8.1’ and add
// ‘test.useTestNG()’ to your build script.
testCompile ‘junit:junit:4.12’
}

Este archivo aparte de los comentarios obviamente, nos permite ver la configuración basada en DSL de nuestro proyecto que detallo a continuación:

  • apply plugin: ‘java’  : Este plugin permite añadir soporte para la  compilación de Java junto con las pruebas, además, es la base de muchos de los otros plugins Gradle. 
  • repositories { … } :  Gradle busca en un repositorio los archivos de dependencias externas. Un repositorio es una colección de archivos, organizado por el grupo, el nombre y la versión. Gradle comprende varios formatos de repositorios diferentes, como Maven e Ivy, y diferentes maneras de acceder al repositorio, como el uso del sistema de archivos local o HTTP.

Por defecto, Gradle no define ningún repositorio. Es necesario definir al menos uno antes de poder utilizar las dependencias externas. Una opción es utilizar el repositorio central de Maven en este caso jcenter()

  • dependencies {…}: En Gradle  las dependencias se agrupan en configuraciones, una configuración es simplemente un conjunto con el nombre de las dependencias, también existe manera para declararlas de manera  externa a nuestro proyecto.

El plugin de Java define un número de configuraciones estándar. Estas configuraciones representan las rutas de clases que utiliza el plugin de Java, a continuación se enumeran algunas:

compile
Las dependencias necesarias para compilar el código fuente del proyecto.

runtime
Las dependencias requeridas tiempo de ejecución. Por defecto, también incluye las dependencias de tiempo de compilación.

testCompile
Las dependencias necesarias para compilar el código fuente de los test, por defecto, también incluye las dependencias del tipo compile, y runtime.

testRuntime
Las dependencias necesarias para ejecutar las pruebas. Por defecto, también incluye las dependencias compile, runtime, y testCompile.

Tareas:

Gradle nos permite ejecutar distintos tipos de tareas, como por ejemplo tareas de construcción, de ejecución de pruebas, comprobación, generar documentación, etc… ejecutando el comando gradle tasks  se listan algunas tareas disponibles.

Screen Shot 2015-10-27 at 4.34.35 PM

Para nuestro ejemplo, lanzaremos la tarea test, que básicamente realizará una lista de tareas organizadas y por orden, en donde lo primero será la compilación de nuestro código fuente, el archivo /src/main/java/Libray.java pasando por la generación de las clases, ubicación de nuestros recursos, y finalmente la ejecución de nuestra unidad de prueba llamada  /src/test/java/LibraryTest.java

Screen Shot 2015-10-27 at 4.43.35 PM

Las clases incluidas en el ejemplo las podemos ver a continuación

/src/test/java/LibraryTest.javaScreen Shot 2015-10-27 at 4.45.15 PM

 /src/main/java/Libray.java
Screen Shot 2015-10-27 at 4.45.05 PM

Ahora podemos agregar nuestro propio código y empezar a utilizar dependencias para nuestros proyectos, no olvidar generar sus unidades de prueba.! 😀

Referencias:

Estándar
Grails, groovy, gvm, java, springboot

GVM ahora SDKMAN

sdkman

Hace ya mas de dos años, publicaba el current estado de mi Groovy enVironment Manager o GVM Tool, herramienta escrita por Marco Vermeulen  inspirado por la comunidad Ruby con sus herramientas RVM y rbenv.  ahora esta herramienta para la administración de versiones de múltiples Kits de desarrollo de software cambia de nombre a SDKMAN.

Esta herramienta nos proporciona una cómoda interfaz de línea de comandos  basada en un cliente y una API que nos permite: instalar,cambiar,eliminar y listar nuestras herramientas preferidas con sus versiones como lo son asciidoctorj, crash, gaiden, glide, gradle, grails, griffon, groovy, groovyserv, jbake, jbossforge, lazybones, springboot, vertex.

Algunas características de sdkman:

  • Por Desarrolladores, para desarrolladores que nos permite simplificar el proceso de descarga, y configuración de nuestro entorno por cada herramienta, esto es útil para dejar de definir PATH y variables _HOME en nuestros entornos de desarrollo.
  • Si eres un desarrollador de la JVM, podrás instalar algunos sabores como por ejemplo Groovy, Grails, Spring Boot, Vertx  todo en un solo lugar, en próximas versiones podrás fácilmente cambiar de JDK! 😀
  • Ligero, esta escrito en bash y también lo puedes utilizar con zsh en mi caso con Oh My ZSH!” , sólo requiere dos comandos para la instalación, curl y unzip.
  • Multi Plataforma, originalmente, se ejecutaba en cualquier plataforma basada en Unix como Mac OSX, Linux, Cygwin, Solaris y FreeBSD, hoy en dia tambien esta disponible para  Windows mediante Powershell CLI.

Ya puedes jugar con sdkman
$ curl -s http://get.sdkman.io | bash

Estándar