es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Creando una distribución combinada para la compilación compuesta en Gradle

Tengo un proyecto modular de Java que combina bibliotecas y herramientas de línea de comandos (CLI):

  • cli-tools/
    • create-patch (crear-parche)
    • find-conflicts (buscar-conflictos)
  • modules/
    • core (núcleo)
    • analysis (análisis)

Estoy tratando de crear una distribución combinada a partir del proyecto cli-tools que contenga todos los archivos jar de dependencia y todos los scripts de inicio generados por el complemento “application”. He logrado que funcionen las dependencias de construcción y se incluyen mis archivos jar locales, pero los scripts de inicio no se incluyen, y tampoco se incluye nada de las rutas de clase de tiempo de ejecución (runtimeClasspath). Mi declaración de registro no muestra complementos en ninguno de los subproyectos, aunque sus tareas se están ejecutando, por lo que tal vez mi método de verificación de complementos esté incorrecto.

// cli-tools/build.gradle.kts:
tasks.named("distZip").configure {
    subprojects.forEach {
        dependsOn(it.path.plus(":startScripts"))
    }
}
distributions {
    main {
        distributionBaseName.set("patch-tools")
        contents {
            project.subprojects.forEach { sub ->
                val subLibs = sub.buildDir.resolve("libs")
                if (subLibs.exists())
                    into("lib") {
                        from(subLibs)
                    }

                sub.logger.info("plugins of {}: {}", sub.name, sub.plugins)
                if (sub.pluginManager.hasPlugin("application")) {
                    into("lib") {
                        from(sub.configurations.findByName("runtimeClasspath"))
                    }
                    into("bin") {
                        from(sub.buildDir.resolve("scripts"))
                    }
                }
            }
        }
    }
}

¿Cómo puedo hacer que esto funcione para que los scripts de inicio y las dependencias transitorias se incluyan en la distribución?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Un problema potencial es que la tarea startScripts podría no haber sido ejecutada todavía cuando se configura distZip. Para asegurarnos de que la tarea se ejecute primero, podemos agregar una dependencia en ella para cada subproyecto:

    tasks.named("distZip") {
        subprojects.forEach {
            dependsOn(it.path.plus(":startScripts"))
        }
    }
    
    subprojects {
        apply(plugin = "application")
    
        // ...
    
        application {
            // ...
            mainClassName = "com.example.MainKt"
        }
    
        // ...
    
        tasks.named<createstartscripts>("startScripts") {
            // Esto asegura que el script incluya todos los jars necesarios
            doLast {
                classpath += project.configurations.getByName("runtimeClasspath")
            }
        }
    }
    
    distributions {
        // ...
        contents {
            // ...
            subprojects.filter { it.plugins.hasPlugin("application") }.forEach { sub ->
                into("bin") {
                    from(sub.tasks.named<createstartscripts>("startScripts"))
                }
            }
        }
    }
    

    Aquí, agregamos una dependencia explícita en la tarea startScripts para cada subproyecto para asegurarnos de que se ejecute antes de distZip. También nos aseguramos de que cada tarea startScripts incluya la configuración runtimeClasspath para que el script de lanzamiento incluya todas las dependencias necesarias.

    Luego, en el bloque distributions, iteramos sobre cada subproject que tiene el plugin application y agregamos su tarea startScripts al directorio bin de nuestra distribución.

Comments are closed.