Tengo una compilación multiproyecto y puse una tarea para construir un frasco gordo en uno de los subproyectos. Creé la tarea similar a la descrita en el libro de cocina .
jar {
from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
manifest { attributes 'Main-Class': 'com.benmccann.gradle.test.WebServer' }
}
Ejecutarlo da como resultado el siguiente error:
Causa: ¡No puede cambiar una configuración que no esté en estado sin resolver!
No estoy seguro de lo que significa este error. También informé esto en Gradle JIRA en caso de que sea un error .

def mainClassNamepara que el código funcionara ... Estaba recibiendo No se pudo establecer la propiedad desconocida 'mainClassName' para el proyecto raízimplementationconfiguración en lugar de la ahora obsoletacompile. El código anterior me crea un pequeño frasco sin las dependencias. Cuando lo cambio (from { configurations.implementation.collect {...} }), se produce un error que dice que no se permite resolver la 'implementación' de la configuración directamenteconfigurations.compileClasspatharreglará todos losimplementations, pero dejará fuera lasapidependencias afik. Encontré aquí en otra respuesta la soluciónruntimeClasspath. Eso también incluye lasapidependencias.La respuesta de @felix casi me lleva allí. Tuve dos problemas:
La siguiente configuración resuelve este
Para agregar esto a la tarea estándar de ensamblar o compilar, agregue:
Editar: gracias a @mjaggard: en versiones recientes de Gradle, cambie
configurations.runtimeaconfigurations.runtimeClasspathfuente
artifacts: exactamente lo que estaba buscando.gradle fatJarlas dependencias en tiempo de ejecución no parecen estar compiladas, por lo que no se pueden copiar.Si desea que la
jartarea se comporte normalmente y también tiene unafatJartarea adicional , use lo siguiente:La parte importante es
with jar. Sin él, las clases de este proyecto no están incluidas.fuente
group "build"y esta tarea estará enbuildgrupo (con otras tareas, es decir,jartarea.with jarpalabra clave, ¿qué hace exactamente?Esto funciona bien para mi.
Mi clase principal:
Y es el contenido de mi archivo build.gradle:
Y escribo lo siguiente en mi consola:
Y la salida es genial:
fuente
Para generar un JAR gordo con una clase ejecutable principal, evitando problemas con los JAR firmados, sugiero el complemento gradle-one-jar . Un complemento simple que usa el proyecto One-JAR .
Fácil de usar:
fuente
Sulución simple
fuente
La respuesta de @ben casi funciona para mí, excepto que mis dependencias son demasiado grandes y recibí el siguiente error
Para solucionar este problema, tengo que usar el siguiente código
fuente
Para aquellos que necesitan construir más de un frasco del proyecto.
Crea una función en gradle:
luego llame:
Funciona en gradle 5.
Jar se colocará en
./build/libs.fuente
Yo uso tarea
shadowJarpor complemento. com.github.jengelman.gradle.plugins:shadow:5.2.0El uso del
./gradlew app::shadowJararchivo de resultados de ejecución será enMyProject/app/build/libs/shadow.jarbuild.gradlearchivo de nivel superior :build.gradlearchivo de nivel de módulo de aplicaciónfuente
Gradle 6.3, biblioteca de Java. El código de "jar task" agrega las dependencias a "build / libs / xyz.jar" cuando se ejecuta la tarea " gradle build ".
fuente
Si estás acostumbrado a las hormigas, también puedes intentar lo mismo con Gradle:
fuente