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 mainClassName
para que el código funcionara ... Estaba recibiendo No se pudo establecer la propiedad desconocida 'mainClassName' para el proyecto raízimplementation
configuració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.compileClasspath
arreglará todos losimplementation
s, pero dejará fuera lasapi
dependencias afik. Encontré aquí en otra respuesta la soluciónruntimeClasspath
. Eso también incluye lasapi
dependencias.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.runtime
aconfigurations.runtimeClasspath
fuente
artifacts
: exactamente lo que estaba buscando.gradle fatJar
las dependencias en tiempo de ejecución no parecen estar compiladas, por lo que no se pueden copiar.Si desea que la
jar
tarea se comporte normalmente y también tiene unafatJar
tarea 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á enbuild
grupo (con otras tareas, es decir,jar
tarea.with jar
palabra 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
shadowJar
por complemento. com.github.jengelman.gradle.plugins:shadow:5.2.0
El uso del
./gradlew app::shadowJar
archivo de resultados de ejecución será enMyProject/app/build/libs/shadow.jar
build.gradle
archivo de nivel superior :build.gradle
archivo 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