jueves, 27 de mayo de 2021

Gradle-7 (4) Crear una libreria jar ejecutable

 1.Introducción

Existen opciones para crear un "fat jar" runnable con todas las dependencias metidas dentro del jar. Se puede ver en estos enlaces como hacerlo:

Pero de momento voy a generar mis librerias a parte, pero tengo que hacer algunas cosas a mano

2. Crear un jar runnable con las librerias de dependencias aparte en otra carpeta

Utilizo el plugin "application", pero me genera:
  • Los "jars" en el fichero build/distributions/NOMBRE_PROYECTO.tar (y tambien .zip)
  • Dentro de ese fichero comprimido se guandan en NOMBRE_FICHERO/lib todos los jars, tanto el runnable como las dependencias
En este caso tenemos un proyecto gradle llamado D-IF07
Dentro de distributions tenemos los 2 ficheros

Y dentro de "D-INF07-1.0.tar" está esta estructura



3. Pasos a seguir


3.1 Fichero build.gradle


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
plugins {
    // Apply the java-library plugin to add support for Java Library
    id 'java-library'
    id 'java-library-distribution' 
} repositories { jcenter() mavenCentral() } // My customization //project.jar.destinationDirectory = file("$rootDir/../mytargets") project.archivesBaseName = 'd-if07-run' project.version = '1.0' dependencies { // Use JUnit test framework. testImplementation 'junit:junit:4.13' /*********************************************************************** *********************** LOMBOK DEFINITION ******************************/ compileOnly 'org.projectlombok:lombok:1.18.20' annotationProcessor 'org.projectlombok:lombok:1.18.20' testCompileOnly 'org.projectlombok:lombok:1.18.20' testAnnotationProcessor 'org.projectlombok:lombok:1.18.20' /************************************************************************/ implementation files('../mytargets/a-annotations-1.0.jar', '../mytargets/a-basic-utils-1.0.jar', '../mytargets/b-base-control-model-1.0.jar') implementation "org.apache.commons:commons-lang3:3.12.0" } //Always after dependencies !!!!! jar { manifest { //attributes 'Main-Class': 'com.foo.bar.MainClass' attributes( 'Main-Class': 'mipaquete.Execute', 'Class-Path': configurations.runtimeClasspath.files.collect { 'lib/'+it.getName() }.join(' ') ) } }

Lo mas importante es:
  • Línea 3-4: Se utiliza los plugins "java-library" y "java-library-distribution"
  • Líneas 13 y 14: renombraremos el jar runnable con el nombre "d-if07-run" + la versión
  • Línea 36: Se ha definido el apartado "jar" después del apartado "dependencies"
  • Línea 40: El atributo 'Main-Class' debe definir el nombre completo de la clase(que tiene el método "main") con el paquete
  • Línea 41: Le decimos al manifest donde están las dependencias. OJO le indicamos "lib", pues tendremos que incluir MANUALMENTE las librerias de dependencias (unicamente) dentro de esta librería. El jar runnable estará al mismo nivel que la libreria lib

3.2 Reajustar la ubicación de las librerias

  1. Ahora tenemos que crear unas carpeta por ejemplo "MiCarpeta"
  2. Copiar el jar runnable (en este caso "d-if07-run-1.0.jar") a MiCarpeta. Hay que recordar que este fichero se encuentra en este caso en  "build/distributions/D-IF07-01.tar/D-IF07-01/lib" donde  la parte azul es la estructura interna del fichero "tar".
  3. Crear la carpeta "lib" dentro de MiCarpeta".
  4. Copiar el resto de jars de  "build/distributions/D-IF07-01.tar/D-IF07-01/lib" a la carpeta "lib"

3.3 Como hacer la llamada?

  • Nos situamos en la carpeta MiCarpeta
  • Ejecutamos java -jar d-if07-run [parametro1] [parametro2] donde [parametroX] pueden ser los parámetros opcionales que haya
  • Comprobar que la versión de java sea la misma que la que se ha utilizado en gradle para generar el jar.
  • Tambien se puede ejecutar desde cualquier ubicación del disco, así:
  • [ruta a java/]java -jar [ruta a MiCarpeta/]d-if07-run [parametros] ..


No hay comentarios :

Publicar un comentario