2012-06-11 14 views
28

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"?Construyendo un uberjar con Gradle

Esto es lo que tengo actualmente: (lo copié de algún lugar unos pocos días atrás, 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 
    } 
} 
+2

En su lugar, puede intentar usar el [plugin de la aplicación] (http://www.gradle.org/docs/current/userguide/application_plugin.html). – Scott

+0

Esto funcionará siempre que no tenga ninguna dependencia. Pero una vez que su proyecto tiene dependencias, esas no se incluirán en el uberjar. –

Respuesta

29

¿Has probado el ejemplo fatjar en el gradle cookbook?

Lo que estamos buscando es the shadow plugin para Gradle

+0

Gracias por el puntero. Eso ayudo. Aunque acerté con otro problema que fue resuelto con un poco de Google. Añadiré otra respuesta para ampliar eso. – missingfaktor

+0

Parece que el libro de cocina ahora requiere un inicio de sesión. Como esto es exactamente lo que estoy buscando, ¿podrías pegar la receta aquí, por favor? – tarzan

+0

@tarzan tres años después, y ahora usaría el complemento de la sombra https://github.com/johnrengelman/shadow –

34

que sustituyó a 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 
    } 
} 

Se necesitan las exclusiones ya que en su ausencia se alcanzó this tema.

+4

Creo que debería usar 'configurations.runtime' para incluir todas las dependencias en tiempo de ejecución – lyomi

+0

que necesitaba para agregar' con jar' debajo del manifiesto para obtener los archivos en 'java/main/resources' en el archivo uberjar – gladiator

5

Encontré este project 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' 
    } 
} 
+0

me sale' Invalid signature file digest para los atributos principales de Manifiesto' cuando intento esto –

+0

necesita 'excluir 'META-INF/*. SF" ' ' excluir "META-INF/*. DSA" ' ' excluir "META-INF/*. RSA" ' como ans de missingfaktor wer –

5

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á lugar a [module_name]/build libs/archivo .jar/[module_name].

+0

pero ¿qué es ese código? ¿Qué configura configurations.compile.collect {it.isDirectory()? it: zipTree (it)} do? –

+1

@SamRedway 'configurations.compile.collect' recopila elementos de' compile' El ternario permite que tire tanto de las carpetas como de los archivos zip (como jarras) como si también fueran carpetas – pal

+0

No he probado las otras versiones publicadas aquí, pero este funciona bien y es agradable y simple. – chris