15 de enero de 2019

Gradle + Eclipse + GitHub

En esta entrada voy a enumerar los pasos que hay que seguir para poder utilizar, en nuestro IDE Eclipse, un proyecto de Gradle con una dependencia directa de un repositorio en GitHub.

Con esto vamos a poder automatizar la construcción y pruebas de nuestra aplicación y tener las dependencias actualizadas (o establecerlas a una versión concreta) sin tener que cargar con ellas.

Eclipse, Gradle y GitHub forman una combinación perfecta para automatizar tareas de construcción y pruebas


Eclipse lo conocemos, GitHub también deberíamos, la nueva desconocida puede ser Gradle: es una herramienta de automatización de la construcción de código abierto. En esta entrada se verán términos como plugins o tasks, pero no se explican pues no es objeto de la entrada. Para más información se puede ver en su documentación.

Hay más herramientas de automatización de tareas como Maven y Ant de Apache. En Java personalmente creo que Gradle se está volviendo más fuerte, pero es una opinión. Maven y Ant llevan más tiempo y es probable que si cogéis proyectos más antiguos los usen.

En el ejemplo vamos a usar el repositorio en GitHub "jsonbeans" de EsotericSoftware para convertir objetos entre Java y JSON, pero serviría para cualquier otro. Nos vamos a traer la versión release de la rama master.

Para ello vamos a necesitar Eclipse con el plugin Gradle que viene por defecto en la versión que instalamos con nuestro tutorial y utilizar el servicio Jitpack que será el encargado de construir y suministrarnos bajo demanda artefactos (.jars) de repositorios de GitHub (o de otras plataformas parecidas) para cubrir esas dependencias.

Creamos un proyecto vacío siguiendo estos pasos:
  1. Abrimos Eclipse
  2. En Package Explorer: New/Project.../Gradle Project/Next
  3. Poner nombre al proyecto -> Next -> Next o escoger versión/Wrapper -> Finish
Con esto ya tenemos un proyecto "vacío" creado con una configuración por defecto. Vamos a personalizarlo para lo que queremos conseguir:
  1. Copiar la configuración del archivo build.gradle preparado y substituirlo (se añaden una serie de plugins y dependencias que se explican en comentario dentro del propio archivo)
  2. Modificar en build.gradle la clase con el main según corresponda: cambiar App a com.paquete.Library por ejemplo
Ahora tenemos que hacer que esos cambios sean visibles por Eclipse:
  1. Actualizar las tareas (tasks) del proyecto Gradle en pestaña "Gradle Tasks" (click en icono de refresco)
  2. Ahora nos aparecen nuevas tasks por los plugins que instalamos. Ejecutar la task (haciendo doble click sobre ella) ide/eclipse
  3. Refrescar el proyecto en el Package Explorer
  4. Comprobar que aparece jsonbeans-master.jar en Referenced Libraries
  5. Elegir para el proyecto la librería JDK que tengamos instalada (por ejemplo C:\Program Files (x86)\Java\jdk1.8.0_191). Hay multiples formas de hacerlo, mi preferida para compartir proyectos es configurarlo en el fichero gradle.properties (crearlo si no existe en la raiz del proyecto). Se hace añadiendo una línea (ejemplo):
org.gradle.java.home=C:/Program Files (x86)/Java/jdk1.8.0_191

NOTA 1: Es importante usar "/" en la ruta dentro de gradle.properties.
NOTA 2: Si al seguir estos pasos da un error, puede ser debido a la ubicación del archivo gradle.properties. Aunque en la documentación dice que debe ir en el raíz, se ha comprobado que algunas veces se soluciona un error en este procedimiento ubicándolo en la carpeta "src".

Comprobamos que todo ha ido bien y que el asistente de contenido busca en las nuevas dependencias (en Library mismo probar la clase Json). Podemos usar este código para el main:
public static void main(String[] args) {
    // Serializador JSON
    Json json = new Json(OutputType.json);

    // Objeto para serializar inicializado
    Object obj = new Object() {
        int[] numeros;
        String texto;

        Object init() {
            numeros = new int[] { 1, 2, 3 };
            texto = "Mi texto";

            return this;

        }
    }.init();

    // Salida por consola serializada en formato facil de leer
    System.out.println(json.prettyPrint(obj));
}

NOTA: Si el código te parece extraño, mira la explicación. Se ha puesto como ejemplo para crear un objeto asignándole unos valores NO por defecto a una clase anónima con el mínimo código)

Finalmente ejecutamos para ver el resultado:
  1. Ejecutar task application/run y comprobar que funciona

De esta forma vamos a poder compartir muy fácilmente el proyecto con sus dependencias sin tener que compartir los archivos compilados. Gradle se encargará por nosotros de controlar de manera centralizada los archivos de esas dependencias para todos los proyectos que gestionen (los cacheará en la carpeta GRADLE_HOME (se usará la instalación de Gradle local o la carpeta .gradle en la carpeta personal del usuario)

3 comentarios:

  1. jcenter() no se actualiza y se recomienda el uso de mavenCentral(). En las últimas versiones de gradle es necesario añadir el plugin `java-lib` en lugar de `java`.

    ResponderEliminar
    Respuestas
    1. https://blog.gradle.org/jcenter-shutdown

      Eliminar
    2. El objetivo de esta entrada es ver cómo se puede usar GitHub para tener las dependencias en automático en nuestro proyecto Gradle.

      Tomo nota de su comentario, pero donde usamos gradle es cuando se ve Spring, en ese momento el proyecto lo iniciamos con Spring Initialzr, no lo hacemos a mano.

      Acabo de comprobar la plantilla que usa y ya aparece con mavenCentral(). Sobre los plugins aparece el de java, pero añade otros dos propios de Spring que deben tener el resto de funcionalidades.

      En nuestro caso no usaremos java-lib. Yo personalmente no lo conozco, veo que es para publicar en repositorios maven, pero en nuestro caso usamos el servicio Jitpack.

      Gracias y un saludo.

      Eliminar

Compárteme

Entradas populares