2. Arreglo del proyecto y solución de errores. Descarga de proyectos de dependencias. java.smartcardio

1. Buscar errores

 Le damos al build de la ventana Gradle Tasks


Y nos da un error que no ha podido encontrar la libreria 

es.gob.afirma.lib:afirma-lib-jmimemagic:0.0.7.

En Maven central aparecen versiones anterirores a esta. Parece ser que esta versión se encuentra en

https://github.com/ctt-gob-es/clienteafirma-external

Vamos al github y descargamos dicho proyecto al igual que se hizo en el post anterior dentro de la carpeta WS_AUTOFIRMA-APPLET

2. Cargar el proyecto clienteafirma-external

Por tanto que hemos descargado dicho proyecto en nuestro workspace y actuamos como antes:

  • Entrar al terminal
  • Situarnos en la carpeta de descarga cliente-autofirma-master
  • Ejecutar ../Autofirma/gradlew init
  • Contestar a las preguntas
  • Ver el settings.gradle generado para renombrar la carpeta en este caso es support-libraries
  • Ahora importamos el proyecto
Ahora modificamos  o creamos el fichero build.properties del proyecto support-libraries para que quede así

subprojects { 
    apply plugin: 'eclipse'
    apply plugin: 'java'
    apply plugin: 'java-library'
    project.jar.destinationDirectory = file("$rootDir/../mynewtargets2")  
}    

De esta manera los jarsse crearan en la carpeta mynewtargets2 que hay justo debajo de WS_AUTOFIRMA-APPLET

Ahora vamos a Gradle Tasks > Buscamos el build del propyecto de suppport-libraries y lo accionamos con doble click, y nos generará todas las libreria en la carpeta mynewtargets2

3. Referenciar correctamente dependencias cargadas en el proyecto inicial

Vamos al proyecto afirma-client

Ahora hay que hacer un "search" de todas las referencias en los build.gradle (de los proyectos hijos) a estas librerias
api 'es.gob.afirma.lib:afirma-lib-jmimemagic:0.0.7'
y cambiar la línea por:
implementation files(
  "$rootDir/../mynewtargets2/afirma-lib-jmimemagic-1.0.4.jar",
  "$rootDir/../mynewtargets2/afirma-lib-oro-1.0.4.jar",
) 
también
api 'es.gob.afirma.lib:afirma-lib-itext:1.4'
y cambiarla por
implementation files(
  "$rootDir/../mynewtargets2/afirma-lib-itext-1.0.4.jar",
) 

4. Cambir la versión de java

Al convertir el proyecto desde Maven a Gradle, se ha creado el plugin 
id 'es.gob.afirma.java-conventions'

Este plugin tiene la versión de java 1.7 y hay que cambiarla a java 17, para ello vamos al fichero

es.gob.afirma.java-conventions.properties

del la carpeta

afirma-client/buildSrc/build/resources/main/META-INF/gradle-plugins/

para que quede así tras modificar la versión de java

/*
 * This file was generated by the Gradle 'init' task.
 */

plugins {
    id 'java-library'
    id 'maven-publish'
}

repositories {
    mavenLocal()
    maven {
        url = uri('https://repo.maven.apache.org/maven2/')
    }
}

group = 'es.gob.afirma'
version = '1.8'
//java.sourceCompatibility = JavaVersion.VERSION_1_7
java.sourceCompatibility = JavaVersion.VERSION_17

publishing {
    publications {
        maven(MavenPublication) {
            from(components.java)
        }
    }
}

tasks.withType(JavaCompile) {
    options.encoding = 'utf-8'
}

tasks.withType(Javadoc) {
    options.encoding = 'utf-8'
}


5. Definir las dependencias en settings.gradle del proyecto padre (afirma-client)

En el fichero settings.gradle vamos a ñadir dos partes, la primera (en color amarillo) és referente a los repositorios a buscar (en concreto añadimos el repositorio "../mynewtargets2") y la segunda en color naranja, són las referencias a las librerias a utilizar.

En el caso de las referencias a utilizar , hay que cambiar en cada build.gradle cada una de ls referencia indicadas y cambiarlas por su alias,

Por ejemplo par ala línea  del settings.gradle

library('json',                          'org.json:json:20201115')

hay que sustituir en todos los build.grlade 

api 'org.json:json:20201115'

por

api libs.json

Por tanto el settings.gradle quedaria:

/*
 * This file was generated by the Gradle 'init' task.
 */

rootProject.name = 'afirma-client'
include(':afirma-crypto-batch-client')
include(':afirma-crypto-xades')
include(':afirma-ui-core-jse')
include(':afirma-server-triphase-signer-document')
include(':afirma-crypto-xadestri-client')
include(':afirma-core-keystores')
include(':afirma-crypto-cades')
include(':afirma-crypto-xmlsignature')
include(':afirma-crypto-core-xml')
include(':afirma-crypto-validation')
include(':afirma-crypto-odf')
include(':afirma-crypto-pdf')
include(':afirma-crypto-cadestri-client')
include(':afirma-server-triphase-signer-cache')
include(':afirma-ui-core-jse-keystores')
include(':afirma-ui-simpleafirma-plugins')
include(':afirma-keystores-filters')
include(':afirma-crypto-cms')
include(':afirma-core-massive')
include(':afirma-ui-simpleafirma-plugins-manager')
include(':afirma-ui-simpleafirma-plugin-hash')
include(':afirma-crypto-ooxml')
include(':afirma-crypto-core-pkcs7')
include(':afirma-ui-simpleafirma-plugin-validatecerts')
include(':afirma-core')
include(':afirma-crypto-padestri-client')
include(':afirma-server-triphase-signer-core')
include(':afirma-crypto-cades-multi')
include(':afirma-crypto-core-pkcs7-tsp')
include(':afirma-keystores-mozilla')
include(':afirma-crypto-pdf-common')
project(":afirma-ui-simpleafirma-plugins").projectDir = file('afirma-simple-plugins')
project(":afirma-ui-simpleafirma-plugins-manager").projectDir = file('afirma-simple-plugins-manager')
project(":afirma-ui-simpleafirma-plugin-hash").projectDir = file('afirma-simple-plugin-hash')
project(":afirma-ui-simpleafirma-plugin-validatecerts").projectDir = file('afirma-simple-plugin-validatecerts')

dependencyResolutionManagement {
    repositories {
        jcenter()
        mavenCentral()
        maven { url "https://jitpack.io" } //@see: https://stackoverflow.com/questions/38905939/how-to-import-library-from-jitpack-io-using-gradle
        //aspose { url "http://repository.aspose.com/repo/" } NO VA !!!
        //flatDir {dirs "$rootDir/../mynewtargets2","$rootDir/../InsideLibs"} //@see https://stackoverflow.com/a/25966303
        flatDir {dirs "$rootDir/../mynewtargets2"} //@see https://stackoverflow.com/a/25966303
        //flatDir {dirs "$rootDir/../InsideLibs"} //@see https://stackoverflow.com/a/25966303
    }
    versionCatalogs {
        libs {
            //library('commons-lang3', 'org.apache.commons', 'commons-lang3').version {
            //    strictly '[3.8, 4.0['
            //    prefer '3.9'
            //}
            
            library('junit',                         'junit:junit:4.13.2')         
            
            //library('afirma.itext',                  'es.gob.afirma.lib:afirma-lib-itext:1.4')
            //library('afirma.jmimemagic',             'es.gob.afirma.lib:afirma-lib-jmimemagic:0.0.7')
            library('afirma.jmulticard',             'es.gob.afirma.jmulticard:jmulticard:1.8')
            library('afirma.jmulticard.jse',         'es.gob.afirma.jmulticard:jmulticard-jse:1.8')
            library('afirma.jmulticard.ui',          'es.gob.afirma.jmulticard:jmulticard-ui:1.8')
            
            library('apache.pdfbox',                 'org.apache.pdfbox:pdfbox:2.0.25')
            library('apache.santuario',              'org.apache.santuario:xmlsec:2.1.7')
            
            library('crypto.xades',                  'es.uji.crypto.xades:jxades:0.2.2')
            
            
            
            library('javax.json',                    'org.glassfish:javax.json:1.0.4')
            
            library('json',                          'org.json:json:20201115')
            
            library('spongycastle.core',             'com.madgag.spongycastle:core:1.58.0.0')    
            library('spongycastle.prov',             'com.madgag.spongycastle:prov:1.58.0.0')
            library('spongycastle.bcpkix',           'com.madgag.spongycastle:bcpkix-jdk15on:1.58.0.0')
            
            library('xom',                          'com.io7m.xom:xom:1.2.10')
            
            
            //Additional libraries for solving errors
            library ('itext',                        'com.lowagie:itext:4.2.2')
            
       }     
   }
}   

Veamos como quedaria el build.gradle del proyecto afirma-core-keystores

/*
 * This file was generated by the Gradle 'init' task.
 */

plugins {
    id 'es.gob.afirma.java-conventions'
}

dependencies {
    api project(':afirma-core')
    //api project(':afirma-keystores-mozilla')
    /*
    api 'es.gob.afirma.jmulticard:jmulticard:1.8'
    api 'es.gob.afirma.jmulticard:jmulticard-jse:1.8'
    api 'es.gob.afirma.jmulticard:jmulticard-ui:1.8'
    */
    api libs.afirma.jmulticard
    api libs.afirma.jmulticard.jse
    api libs.afirma.jmulticard.ui
    
}

description = 'afirma-core-keystores'

y a modo de ejemplo también se incluye el build.gradle del proyecto afirma-core-keystores

/*
 * This file was generated by the Gradle 'init' task.
 */

plugins {
    id 'es.gob.afirma.java-conventions'
}

dependencies {
    api project(':afirma-core')
    api project(':afirma-crypto-cms')
    api project(':afirma-crypto-cades')
    api project(':afirma-crypto-core-xml')
    api project(':afirma-crypto-pdf')
    api project(':afirma-crypto-pdf-common')
    api project(':afirma-crypto-xades')
    api project(':afirma-crypto-ooxml')
    api project(':afirma-crypto-odf')
    
    /*
    api 'com.madgag.spongycastle:core:1.58.0.0'
    api 'com.madgag.spongycastle:prov:1.58.0.0'
    api 'es.gob.afirma.lib:afirma-lib-itext:1.4'
    api 'org.apache.pdfbox:pdfbox:2.0.25'
    */
    
    api libs.spongycastle.core
    api libs.spongycastle.prov
    //api libs.afirma.itext
    implementation files(
        "$rootDir/../mynewtargets2/afirma-lib-itext-1.0.4.jar",
    ) 
    
    
    api libs.apache.pdfbox
    
}

description = 'afirma-crypto-validation'


6. Definir las dependencias en build.gradle del proyecto padre (afirma-client). Error de smartcardio

Para evitar el error de smartcardio ver en StackOverflow se ha creado este build.gradle en el proyecto padre

subprojects { 
    apply plugin: 'eclipse'
    apply plugin: 'java'
    apply plugin: 'java-library'
    project.jar.destinationDirectory = file("$rootDir/../mynewtargets2")  
    
    eclipse { //Avoids java.smartcardio complaint
        classpath {
            file {
                whenMerged {
                    def jre = entries.find { it.path.contains 'org.eclipse.jdt.launching.JRE_CONTAINER' }
                    jre.entryAttributes['module'] = 'true'
                    jre.entryAttributes['limit-modules'] = 'java.se,jdk.accessibility,jdk.dynalink,jdk.httpserver,jdk.jartool,jdk.javadoc,jdk.jconsole,jdk.jshell,jdk.jsobject,jdk.management.jfr,jdk.net,jdk.nio.mapmode,jdk.sctp,jdk.security.auth,jdk.security.jgss,jdk.unsupported,jdk.unsupported.desktop,jdk.xml.dom,java.smartcardio'
                    jre.entryAttributes['add-modules'] = 'java.smartcardio'           //--limit-modules java.se --add-modules java.smartcardio
                }
            }
        }
    }
}    


7. Errores de test que fallan.

Veamos los test que fallan:

7.1 TestMIMEDetection del proyecto afirma-core

En este caso se queja porque quiere la libreria afirma-lib-oro

Para ello en el build.gradle debe aparecer  esta referencia, quedando así

/*
 * This file was generated by the Gradle 'init' task.
 */

plugins {
    id 'es.gob.afirma.java-conventions'
}

dependencies {
    /*
    api 'es.gob.afirma.lib:afirma-lib-jmimemagic:0.0.7'
    testImplementation 'junit:junit:4.13.2'
    */
    //api libs.afirma.jmimemagic
    implementation files(
        "$rootDir/../mynewtargets2/afirma-lib-jmimemagic-1.0.4.jar",
        "$rootDir/../mynewtargets2/afirma-lib-oro-1.0.4.jar",
    )    
    
    testImplementation libs.junit
}

description = 'afirma-core'

7.2 TestSignatureValidation del proyecto afirma-crypto-validation

En este caso falla la función testCadeTAValidation, que hace referencia a un fichero que no se dispone de el, por tanto hay que comentar esta función para que no se ejecute.

6-3 TestRFC2254CertificateFilter del proyecto afirma-keystores-filter

En este caso hay que añadir la referencia al proyecto afirma-keystores-mozilla

quedando así el build.gradle

/*
 * This file was generated by the Gradle 'init' task.
 */

plugins {
    id 'es.gob.afirma.java-conventions'
}

dependencies {
    api project(':afirma-core')
    api project(':afirma-core-keystores')
    api project(':afirma-keystores-mozilla')  //EDU???
    /*
    api 'com.madgag.spongycastle:core:1.58.0.0'
    api 'com.madgag.spongycastle:prov:1.58.0.0'
    */
    api libs.spongycastle.core
    api libs.spongycastle.prov
}

description = 'afirma-keystores-filters'


Tambien es conveniente crear un fichero build.gradle para el proyecto afirma-client con este contenido, para que se generen el los jars en mynewtarget2 

Ahora modificamos  o creamos el fichero build.properties del proyecto support-libraries para que quede así

subprojects { 
    apply plugin: 'eclipse'
    apply plugin: 'java'
    apply plugin: 'java-library'
    project.jar.destinationDirectory = file("$rootDir/../mynewtargets2")  
}   


Ahora en teroria ya deberia compilar bien el build del proyecto afirma-client











Comentarios