Construyendo un uberjar con Gradle

Soy un novato de Gradle. Quiero construir un uberjar (también conocido como fatjar) que incluya todas las dependencias transitivas del proyecto. ¿Qué líneas debo agregar a mi “build.gradle“?

Esto es lo que tengo actualmente: (Lo copié de algún lugar hace unos días, pero no recuerdo de dónde).

task uberjar(type: Jar) { from files(sourceSets.main.output.classesDir) manifest { attributes 'Implementation-Title': 'Foobar', 'Implementation-Version': version, 'Built-By': System.getProperty('user.name'), 'Built-Date': new Date(), 'Built-JDK': System.getProperty('java.version'), 'Main-Class': mainClassName } } 

¿Has probado el ejemplo de Fatjar en el libro de cocina Gradle ?

Lo que estás buscando es el plugin shadow para gradle

task uberjar(.. la task uberjar(.. con lo siguiente:

 jar { from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) { exclude "META-INF/*.SF" exclude "META-INF/*.DSA" exclude "META-INF/*.RSA" } manifest { attributes 'Implementation-Title': 'Foobar', 'Implementation-Version': version, 'Built-By': System.getProperty('user.name'), 'Built-Date': new Date(), 'Built-JDK': System.getProperty('java.version'), 'Main-Class': mainClassName } } 

Las exclusiones son necesarias porque en su ausencia usted llegará a este problema.

Simplemente agregue esto a build.gradle de su módulo java.

mainClassName = “my.main.Class”

 jar { manifest { attributes "Main-Class": "$mainClassName" } from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } } 

Esto dará como resultado el archivo [nombre_módulo] / build / libs / [nombre_módulo] .jar.

Encontré este proyecto muy útil. Utilicándolo como referencia, mi tarea de Gradle uberjar sería

 task uberjar(type: Jar, dependsOn: [':compileJava', ':processResources']) { from files(sourceSets.main.output.classesDir) from configurations.runtime.asFileTree.files.collect { zipTree(it) } manifest { attributes 'Main-Class': 'SomeClass' } }