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?
davy.ai
Un problema potencial es que la tarea
startScripts
podría no haber sido ejecutada todavía cuando se configuradistZip
. Para asegurarnos de que la tarea se ejecute primero, podemos agregar una dependencia en ella para cada subproyecto:Aquí, agregamos una dependencia explícita en la tarea
startScripts
para cada subproyecto para asegurarnos de que se ejecute antes dedistZip
. También nos aseguramos de que cada tareastartScripts
incluya la configuraciónruntimeClasspath
para que el script de lanzamiento incluya todas las dependencias necesarias.Luego, en el bloque
distributions
, iteramos sobre cadasubproject
que tiene el pluginapplication
y agregamos su tareastartScripts
al directoriobin
de nuestra distribución.