Mostrando entradas con la etiqueta gradle. Mostrar todas las entradas
Mostrando entradas con la etiqueta gradle. Mostrar todas las entradas

miércoles, 25 de mayo de 2022

Gradle-7 (10) Repasando conceptos de Gradle. Git

 1. El fichero .gitignore

Este fichero se encuentra en el directorio princial del proyecto. Veamos un ejemplo que a mi me vale

# Ignore Gradle project-specific cache directory
.gradle

# Ignore Gradle build output directory
build

# Ignore build directory
**/build
**/bin

# Ignore other libraries
**/webapp/libraries

Recordar que:

* representa cualquier palabra

** representa cualquier directorio

2.  Comandos básicos del git

git init   Crea un git en el directorio .git de nuestro proyecto

git add .   Guarda en un buffer los ficheros antes de guardarlos en el git

git status | more   Para ver los fichero guardados en el buffer

git rm --cached * -r  Para eliminar todos los fichero de la cache (recursivamente)

git commit -m "initialise project" Gurda definitivament el buffer anterior. Pero a veces pide que se haya indicado usuario y mail

git config --global user.emai="myemail@ximo.org" Damos el mail

git config --global user.name="ximo" Damos el nombre

Gradle-7 (9) Gradle Multiproyecto (3). Creando wars. Shadow plugin. Reflexiones

1. Creando wars en multiproject

NOTA: Hay un conflicto entre el plugin war (cuando usamos la opcion api(project(":A000-Basic")) para cada uno de los proyectos de los que depende y la ejecución/depuración de la aplicación web en eclipse, ya que eclipse no copia los jars de los proyectos que depende a la carpeta de despliegue local de tomcat en eclipse:

WORKSPACES/WS_JSP01/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/Mywebapp/WEB-INF/lib

Pero cuando genera el war desde la ventanda de "Gradle-tasks", si que lo genera bien.

Hay 2 opciones "sucias" para arreglarlo:

1. Copiar a mano los jars de los proyectos-dependencia a en dicha carpeta o
2. Indicar en el build.gradle 

implementation files(
      'path_to_firstjar/firstjar.jar',
        'path_to_secondjar/secondjar.jar',
        ........
)

Después de reflexionar, me parece que lo más lógico es crear 2 ficheros build.gradle (build.gradle.eclipse y build.gradle.gradle

Cada vez que queramos ejecutar el proyecto en eclipse o generar el war se copiará  build.gradle.eclipse a build.gradle. Esto equivale a como casi si sacáramos nuestro proyecto del multiproyecto

Solamente, para tener todo actualizado y sincronizado se copiará build.gradle.gradle a build.gradle por tanto esta última opción hay que utilizarla poco. Además esta última opción pierde mas dependencias que la otra por lo que los build.gradle pueden cambiar significativamente.

Veamos para un proyecto complejo primeramente el build.gradle que se ejecuta bien desde eclipse y también su jar es menos problemático (build.gradle.eclipse) y la parte de amarillo es donde se indican las dependencias, y varía significativamente con respecto a la otra versión.

plugins {
    // Apply the java-library plugin for API and implementation separation.
    id 'java-library'
    id 'war'
    id "org.gretty" version "4.0.1"
}

repositories {
    jcenter()
    mavenCentral()
}


//Configuration
project.war.destinationDirectory = file("$rootDir/../mynewtargets")  
project.archivesBaseName = 'CSV01' 
project.version = '3.0'


dependencies {
       
    //=============LOMBOK BEGIN ============================
    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'
    //=============LOMBOK END ==============================
    
    // JSP & SERVLETS
    compileOnly 'jakarta.servlet:jakarta.servlet-api:5.0.0'
    implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl:2.0.0'
    
    compileOnly 'jakarta.platform:jakarta.jakartaee-api:9.1.0' 
    compileOnly 'jakarta.el:jakarta.el-api:4.0.0'
        
    compileOnly 'jakarta.platform:jakarta.jakartaee-web-api:9.1.0' //Multipart
    implementation 'jakarta.activation:jakarta.activation-api:2.1.0'
    
    
    //Apache
    implementation 'commons-io:commons-io:2.11.0' 
    implementation 'org.apache.commons:commons-lang3:3.12.0' 
    implementation 'commons-codec:commons-codec:1.15'
    implementation "org.apache.commons:commons-vfs2:2.9.0"
    
    /* SELENIUM */
    api "org.seleniumhq.selenium:selenium-server:3.141.59"
    implementation 'org.seleniumhq.selenium:selenium-java:4.1.2'
    implementation "org.seleniumhq.selenium:selenium-firefox-driver:4.1.2"
    implementation "org.seleniumhq.selenium:selenium-chrome-driver:4.1.2"
    
    /* PDFBox */
    implementation 'org.apache.pdfbox:pdfbox:2.0.24'
    
    /* Samba */
    implementation "com.hierynomus:smbj:0.11.3"
    
    /* sftp */
    implementation 'com.jcraft:jsch:0.1.55'
    
    /* HIbernate */    
    implementation "org.hibernate:hibernate-core-jakarta:5.6.9.Final"
    implementation "org.hibernate:hibernate-envers-jakarta:5.6.9.Final"
    implementation "org.hibernate:hibernate-validator:7.0.4.Final" 
        
    
    /*DB Drivers */
    //runtimeOnly "com.h2database:h2:1.4.200"
    implementation "org.postgresql:postgresql:42.2.20"
    implementation "net.sourceforge.jtds:jtds:1.3.1"      
    
     /*CMIS*/    
    implementation "org.apache.chemistry.opencmis:chemistry-opencmis-client-impl:1.1.0"
    
     /* Jackson */
    implementation "com.fasterxml.jackson.core:jackson-core:2.13.2"
    implementation "com.fasterxml.jackson.core:jackson-annotations:2.13.2"
    implementation "com.fasterxml.jackson.core:jackson-databind:2.13.2.2"
    implementation "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2"
    implementation "com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.2"
    implementation "com.fasterxml.jackson.module:jackson-module-jakarta-xmlbind-annotations:2.13.2"
    implementation "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.13.2"
    implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.2"   
    
    /* BAR CODES */
    implementation 'com.google.zxing:core:3.4.1'
    implementation 'com.google.zxing:javase:3.4.1'
    
    //Own libraries
    
    implementation files(
     	"$rootDir/../mynewtargets/a000-basic-3.0.jar",
     	"$rootDir/../mynewtargets/a002-jackson-3.0.jar",
     	"$rootDir/../mynewtargets/a004-pdf-3.0.jar",
     	"$rootDir/../mynewtargets/a006-cmis-3.0.jar",
        "$rootDir/../mynewtargets/a009-samba-3.0.jar",
        "$rootDir/../mynewtargets/a010-sftp-3.0.jar",
        "$rootDir/../mynewtargets/a011-barcode-3.0.jar",
        "$rootDir/../mynewtargets/a012-selenium-3.0.jar",
        "$rootDir/../mynewtargets/b001-model-base-3.0.jar",
        "$rootDir/../mynewtargets/b003-dao-3.0.jar",
        "$rootDir/../mynewtargets/c002-model-control-3.0.jar",
        "$rootDir/../mynewtargets/c005-model-csv-3.0.jar",
        "$rootDir/../mynewtargets/c007-model-gexflow-3.0.jar",
        "$rootDir/../mynewtargets/d001-dao-imp-3.0.jar",
      )
}


Para la versión que sirve únicamente para tener el proyecto actualizado (build.gradle.gradle), en amarillo se ven los cambios respecto a la anterior versión.

plugins {
    // Apply the java-library plugin for API and implementation separation.
    id 'java-library'
    id 'war'
    id "org.gretty" version "4.0.1"
}

repositories {
    jcenter()
    mavenCentral()
    maven { url "https://jitpack.io" } //@see: https://stackoverflow.com/questions/38905939/how-to-import-library-from-jitpack-io-using-gradle
    maven { url "https://repository.mulesoft.org/nexus/content/repositories/public/"}
}


//Configuration
project.war.destinationDirectory = file("$rootDir/../mynewtargets")  
project.archivesBaseName = 'CSV01' 
project.version = '3.0'


dependencies {
       
    //=============LOMBOK BEGIN ============================
    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'
    //=============LOMBOK END ==============================
    
    // JSP & SERVLETS
    compileOnly 'jakarta.servlet:jakarta.servlet-api:5.0.0'
    implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl:2.0.0'
    
    compileOnly 'jakarta.platform:jakarta.jakartaee-api:9.1.0' 
    compileOnly 'jakarta.el:jakarta.el-api:4.0.0'
        
    compileOnly 'jakarta.platform:jakarta.jakartaee-web-api:9.1.0' //Multipart
    implementation 'jakarta.activation:jakarta.activation-api:2.1.0'
    
    
    //Apache
    implementation 'commons-io:commons-io:2.11.0' 
    implementation 'org.apache.commons:commons-lang3:3.12.0' 
    implementation 'commons-codec:commons-codec:1.15'
    implementation "org.apache.commons:commons-vfs2:2.9.0"
    
    /* SELENIUM */
    api "org.seleniumhq.selenium:selenium-server:3.141.59"
    implementation 'org.seleniumhq.selenium:selenium-java:4.1.2'
    implementation "org.seleniumhq.selenium:selenium-firefox-driver:4.1.2"
    implementation "org.seleniumhq.selenium:selenium-chrome-driver:4.1.2"
    
    /* PDFBox */
    implementation 'org.apache.pdfbox:pdfbox:2.0.24'
    
    /* Samba */
    implementation "com.hierynomus:smbj:0.11.3"
    
    /* sftp */
    implementation 'com.jcraft:jsch:0.1.55'
    
    /* HIbernate */    
    implementation "org.hibernate:hibernate-core-jakarta:5.6.9.Final"
    implementation "org.hibernate:hibernate-envers-jakarta:5.6.9.Final"
    implementation "org.hibernate:hibernate-validator:7.0.4.Final" 
        
    
    /*DB Drivers */
    //runtimeOnly "com.h2database:h2:1.4.200"
    implementation "org.postgresql:postgresql:42.2.20"
    implementation "net.sourceforge.jtds:jtds:1.3.1"      
    
     /*CMIS*/    
    implementation "org.apache.chemistry.opencmis:chemistry-opencmis-client-impl:1.1.0"
    
     /* Jackson */
    implementation "com.fasterxml.jackson.core:jackson-core:2.13.2"
    implementation "com.fasterxml.jackson.core:jackson-annotations:2.13.2"
    implementation "com.fasterxml.jackson.core:jackson-databind:2.13.2.2"
    implementation "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2"
    implementation "com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.2"
    implementation "com.fasterxml.jackson.module:jackson-module-jakarta-xmlbind-annotations:2.13.2"
    implementation "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.13.2"
    implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.2"   
    
    /* BAR CODES */
    implementation 'net.sourceforge.barbecue:barbecue:1.5-beta1'
    implementation 'net.sf.barcode4j:barcode4j:2.1'  
    implementation 'com.github.kenglxn.qrgen:core:v2.2.0'
        
    implementation 'com.google.zxing:core:3.4.1'
    implementation 'com.google.zxing:javase:3.4.1'
        
    //1. Reference to other maven project in muiltiproject scenario
    api(project(":A000-Basic"))
    api(project(":A002-Jackson"))
    api(project(":A004-PDF"))
    api(project(":A006-CMIS"))
    api(project(":A009-Samba"))
    api(project(":A010-SFTP"))
    api(project(":A011-BarCode"))
    api(project(":A012-Selenium"))
    api(project(":B001-Model-Base"))
    api(project(":B003-DAO"))
    api(project(":C002-Model-Control"))
    api(project(":C005-Model-CSV"))
    api(project(":C007-Model-Gexflow"))
    api(project(":D001-DAO-Imp"))
}

Como se puede ver, se pierden referencias a algunos repositorios y a también a ciertos "jars", y además en este caso concreto, da errores de dependencias transitivas con las versiones de org.codehaus.woodstox:stax2-api

Esto en cambio no ha pasado en el build.gradle anterior

2. Gradle build-build vs shadow-shadowJar

En el proyecto principal (en este caso Multiproject), hay 2 operaciones importantes que no hay que confundir:

1. build-build: Genera todos los jars y wars del proyecto

2. shadow-shadowJar: Genera todos los jars o wars pero solo de aquellos proyectos que han utilizado el shadow plugin, junto con los proyectos que son necesitados(dependencias) por los proyectos con shadow.


Por tanto para construir todos los jars y wars convierne utilizar la primera opción


3. Errores y resultados inesperados en la ejecución

Cuando incluimos un subproyecto con shadow jar, Eclipse tarda muchísimo en actualizar las referencias, de manera que si ejecutamos el projecto que hace referencia a otro con shadow plugin aparecen resultados incoherentes.

Esto es debido a que Eclipse utiliza "caches" para que la cosa vaya más rápida, pero lo que está haciendo es provocar resultados extraños pues no tarda mucho en actualizarse los caches. Mucho cuidado y paciencia.

Para evitar estos problemas, es conveniente sacar los proyectos que dependan de aquellos que se utiliza el shadow jar, fuera de este gradle multiproyecto

lunes, 23 de mayo de 2022

Gradle-7 (7) Gradle Multiproyecto (1) Introduccion

 0. Introducción

Se agradece a tomgregory sus claras explicaciones

1. Crear un proyecto gradle en Eclipse

Como es habitual utilizamos el menú: File -> New -> Gradle -> Gradle Project

Le damos un nombre del projecto por ejemplo "Multiproject"

Es importante configurar el workspace


y asegurarnos que tengamos Gradle 7.4.2 y java igual o superior a 16



Y observamos que nos ha preparado el entorno para tener un Multiproyecto, pues nos ha creado un subproyecto llamado lib.


Analicemos lo que tenemos:

En el diectorio principal (Multiproject) tenemos:

  1. La carpeta del subproyecto hijo (lib)
  2. La carpeta gradle
  3. 3 ficheros: gradlew, gradle.bat y settings.gradle
En el proyecto hio (lib) tenemos una estructura de proyecto java normal, y el fichero "build.gradle"

Para que gradle sepa cuales son sus subproyectos, tenemos que indicarle en "settings.gradle" los subproyectos:

rootProject.name = 'Multiproject'
include('lib')


2. Crear un subproyecto 

Vamos a guradarnos el subproyecto "lib" como modelo para generar otros subproyectos.

Desde eclipse creamos una nueva carpeta llamada por ejemplo "WS", justo debajo de "Multiproject" (por tanto al mismo nivel que "lib"), y copiamos desde la carpeta "lib" estos ficheros:

  • carpeta src
  • fichero build.gradle

Editamos el "settings.gradle" y le añadimos 'WS' al include

include('lib', 'WS')

Y nos situamos sobre el proyecto "Multiproject" y con el boton derecho "Gradle"->"Refresh gradle project", y a veces desaparece, pero si le damos a F5 ya nos aparece "WS" como subproyecto

Si no apareciera, se podría abrir una 

Para ello abrimos una ventana de terminal, nos situamos en la carpeta "Multiproject" y ejecutamos 

./gradlew projects

y después 

./gradlew build

3. Dependencias entre proyectos.

Supongamos que hemos creados 2 subproyectos

  • A000-Basic
  • D002-Sedipualba-WS-Shdw
Y el primero es una dependencia del segundo
entonces en el "build.gradle" del segundo proyecto le indicamos.

api(project(":A000-Basic"))




domingo, 6 de marzo de 2022

Algunos plugins útiles para Eclipse

 1. EGradle (Editor) 

Es un editor de ficheros de gradle

Detecta algunos errores de sintaxis. Puede ser válido


2. Yaml editor

Para editar ficheros YAML



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] ..


lunes, 17 de mayo de 2021

Gradle-7 (3) Crear una libreria jar. La dependencia Jakarta como providedCompile o compileOnly. Plugin war. Tareas build vs jar

 Con el  nuevo proceso de cambio de nombres desde "javax" a "jakarta", hay que tener cuidado.

Para las librerías que solo se usan en compilación, se puede utilizar estas 2 definiciones de dependencias en "dependencies {" del build.gradle

  • compileOnly (si se va a crear el jar solamente)
  • providedCompile (solo si se usa elplugin "war")
Por tanto si vamos a crer un jar, debemos de defiirlo como:

compileOnly "jakarta.annotation:jakarta.annotation-api:2.0.0"

Si hubiéramos puesto la segunda opcion (providedCompile "jakarta.annotation:jakarta.annotation-api:2.0.0") sin haberle metido la línea "id war" en "plugins {" del build.gradle, hubieramos tenido este error:

Could not run phased build action using connection to Gradle distribution 'https://services.gradle.org/distributions/gradle-7.0.2-bin.zip'.

cannot assign instance of java.util.Collections$EmptyList to field java.lang.StackTraceElement.moduleVersion of type java.lang.String in instance of java.lang.StackTraceElement B-DAO-lib line 0 Gradle Error Marker

En caso que hubiésemos utilizado el plugin "id war" con providedCompile, NO CREARÁ EL FICHERO JAR, a menos que le demos a la task "jar" en vez de "build" 

miércoles, 5 de mayo de 2021

Gradle-7 (1) Crear una libraría jar. Utilizar Lombok y librerías jar locales

1. Introducción

2. Crear un proyecto desde Eclipse EE

3. Cambiar la versión de java a java 16 

4. build.gradle

5. Incluir una jar propio (local)

6. Generar el jar

7. Agregar la dependencia Lombok.jar

8. Resolución de problemas


1. Introducción

Se pretende migrar desde Maven a Gradle, para ello empezamos con un ejemplo sencillo y creamos una libreria jar, a la que añadiremos como dependencia una libreria jar lcal y también a Lombok que cuesta un poco más.

2. Crear un proyecto desde Eclipse EE

Desde el menú:

File-> New -> Gradle -> Gradle Project ->NEXT

Aparece una pantalla que dice "How to experience the best Gradle integration" y le damos NEXT

Le damos el nombre del proyecto (en mi caso "XimoProject") y seleccionamos "Use default location" y NEXT



Indicamos la version 7.0 de Gradle y  donde localizar el jdk y FINISH (ANTICUADO NO utilizar la version de gradle superior a la 6.6!!)


Y vemos que nos ha creado esta estructura del proyecto



Ha creado 2 clases, una src/main/java/Library.java y otra en src/text/java/LibaryTest.java

Como vemos, el JRE System library és el JavaSE-13 que debemos de cambiar por el 16. 

3. Cambiar la versión de java a java 16 (anticuado, no utilizar la version de java 16 pues tenemos problemas con el cambio de nombres de javax a jakarta)

Para ello , nos situmanos en el "Project Explorer" sobre XimoProject-lib(in lib) y con el botón derecho seleccionamos "Properties", y marcamos Java Build Path en el menú izquierdo.


Marcamos dentro de ModulePath -> JRE System Library [JavaSE-13] y le damos al botón Edit


Ahora se trata de buscar en el botón Environments el casar el tipo de java con su localización. en este caso nos interesa Java 16


Y cuadramos el tipo y el jdk (16)


Si por algún motivo no apareciera el jdk 16 habría que buscarlo en en el botón Installed JREs


Le daríamos al botón Add y localizariamos donde está instalado el jdk


Le damos a Standard VM y NEXT


Le damos al botón "Directory" y localizamos donde está nuestro jdk y luego le damos a FINISH

4. build.gradle

Este fichero está en la carpeta XimoProject-lib (lib)

y el contenido generado es:

 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
/*
 * This file was generated by the Gradle 'init' task.
 *
 * This generated file contains a sample Java library project to get you started.
 * For more details take a look at the 'Building Java & JVM projects' chapter in the Gradle
 * User Manual available at https://docs.gradle.org/7.0/userguide/building_java_projects.html
 */

plugins {
    // Apply the java-library plugin for API and implementation separation.
    id 'java-library'
}

repositories {
    // Use Maven Central for resolving dependencies.
    mavenCentral()
}

dependencies {
    // Use JUnit test framework.
    testImplementation 'junit:junit:4.13.1'

    // This dependency is exported to consumers, that is to say found on their compile classpath.
    api 'org.apache.commons:commons-math3:3.6.1'

    // This dependency is used internally, and not exposed to consumers on their own compile classpath.
    implementation 'com.google.guava:guava:30.0-jre'
}


Lo que hay que saber:

Línea 11: El plugin para crear jars es "java-library"

Línea 16: Utilizaremos el repositorio de maven central

En principio nos ha creado 3 tipos de depenedencias, que se definen según el equivalente en maven de groupId, artifactId y version, pero en este caso supone que seguimos ese orden y separa los valores por ":", en este caso 'junit:junit:4.13.1' és equivalente en Maven a :

1
2
3
4
5
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.13.1</version>
</dependency>

El primer tipo de dependencia afevta al test y es testImplementation

El segundo tipo es api que nos hace accesible a todos los elementos de esta librería. Se referencia a las librerias de la forma "Maven" separando los campos por ":" como hemos visto antes

El tercero y más recomendable es implementation, que sirve para que utilicemos esta librería pero que no exportemos con nuestro jar la visibilidad de los elementos de esta librería. Se utiliza el formato "maven" separando los campos por ":"


5. Incluir una jar propio (local)

Para ello cremos una carpeta "mylibs" que cuelgue directamente de XimoProject-lib( in lib)


Metemos un jar (por ejemplo he bajado el jar de Apache "commons-lang3-3.12.0.jar") dentro de mylibs


Ahora hay que definirlo en el "build.gradle

con lo que la sección de dependencies quedaría


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
dependencies {
    // Use JUnit test framework.
    testImplementation 'junit:junit:4.13.1'

    // This dependency is exported to consumers, that is to say found on their compile classpath.
    api 'org.apache.commons:commons-math3:3.6.1'

    // This dependency is used internally, and not exposed to consumers on their own compile classpath.
    implementation 'com.google.guava:guava:30.0-jre'
    
    // This dependency is for local jars in the folder mylibs
    implementation files('mylibs/commons-lang3-3.12.0.jar')
}

la línea 12 indica que referenciamos desde un fichero en ruta relativa desde la carpeta "lib" o XimoProject-lib (in lib), y no usamos el estilo "Maven" con campos separados por ":"


6. Generar el jar

Primeramente en el Project Explorer, con el botón derecho del mouse, seleccionar Graddle --> Refresh Gradle Project

Buscar el tab de Gradle Tasks, marcar XimoProject, ir entrando en el árbol darle dos clicks al "build" indicado en figura (el que cuelga de XipoProject-lib-build)


Y en la consola sale que tod ha salido bien:

Working Directory: /home/eduard/WORKSPACES/WS_VAADIN07/XimoProject
Gradle user home: /home/eduard/.gradle
Gradle Distribution: Specific Gradle version 7.0
Gradle Version: 7.0
Java Home: /home/eduard/MyPrograms/jdk-16.0.1
JVM Arguments: None
Program Arguments: None
Build Scans Enabled: false
Offline Mode Enabled: false
Gradle Tasks: build

> Task :lib:compileJava
> Task :lib:processResources NO-SOURCE
> Task :lib:classes
> Task :lib:jar
> Task :lib:assemble
> Task :lib:compileTestJava
> Task :lib:processTestResources NO-SOURCE
> Task :lib:testClasses
> Task :lib:test
> Task :lib:check
> Task :lib:build

BUILD SUCCESSFUL in 3s
4 actionable tasks: 4 executed

Y el jar se guarda en XimoProject/lib/build/libs/lib.jar

Siendo XimoProject la carpeta del proyecto y lib la carpeta que en el Project Explorer aparece como XimoProject-lib (en lib)

OJO: Esta librería generada lib.jar, no es visible ni accesible desde eclipse al menos desde la perspectiva Java EE!

Por tanto hay que entrar en el administrador de archivos para verla!!!


7. Agregar la dependencia Lombok.jar

Para ello hay que seguir las indicaciones que se dan en Lombok

Veamos el build.gradle como quedaria


plugins {
    // Apply the java-library plugin for API and implementation separation.
    id 'java-library'
}

repositories {
    // Use Maven Central for resolving dependencies.
    mavenCentral()
}

dependencies {
    // Use JUnit test framework.
    testImplementation 'junit:junit:4.13.1'

    // This dependency is exported to consumers, that is to say found on their compile classpath.
    api 'org.apache.commons:commons-math3:3.6.1'

    // This dependency is used internally, and not exposed to consumers on their own compile classpath.
    implementation 'com.google.guava:guava:30.0-jre'
    
    // This dependency is for local jars in the folder mylibs
    implementation files('mylibs/commons-lang3-3.12.0.jar')

    /***********************************************************************
    *********************** 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'
    /************************************************************************/
    
}

8. Resolución de problemas


A veces hay alguna configuracion antigua de gradle guardada en user.gradle por tanto se tendrá que borrar este fichero para que Eclipse genere uno nuevo con datos actualizados