2012-06-11 4 views
28

Я новичок в Gradle. Я хочу построить uberjar (AKA fatjar), который включает в себя все транзитивные зависимости проекта. Какие строки мне нужно добавить в мой «build.gradle»?Строительство uberjar с Gradle

Это то, что я в настоящее время: (я скопировал откуда-то несколько дней назад, но не помню откуда.)

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

Вместо этого вы можете попробовать использовать [приложение плагина] (http://www.gradle.org/docs/current/userguide/application_plugin.html). – Scott

+0

Это будет работать до тех пор, пока у вас нет никаких зависимостей. Но как только ваш проект имеет зависимости, они не попадут в uberjar. –

ответ

29

Вы пробовали FatJar пример в gradle cookbook?

Что вы ищете является the shadow plugin для Gradle

+0

Спасибо за указатель. Это помогло. Хотя я ударил еще одну проблему, которая была решена небольшим количеством поисковых запросов. Я добавлю еще один ответ, расширяющийся по этому поводу. – missingfaktor

+0

Похоже, что поваренная книга теперь требует логина. Поскольку это именно то, что я ищу, вы можете вставить рецепт здесь, пожалуйста? – tarzan

+0

@tarzan три года спустя, и теперь я использую теневой плагин https://github.com/johnrengelman/shadow –

34

Я заменил task uberjar(.. со следующим:

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 
    } 
} 

Необходимы исключения, потому что в их отсутствие Вы поразите this вопрос.

+4

Я думаю, что он должен использовать 'configurations.runtime' для включения всех зависимостей во время выполнения – lyomi

+0

мне нужно было добавить' с jar' под манифестом, чтобы получить файлы в 'java/main/resources' в uberjar – gladiator

5

Я нашел это project очень полезным. Используя его в качестве ссылки, моего Gradle uberjar задачи будет

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

i get' Недостаточный файл сигнатур сигнатур для основных атрибутов Manifest', когда я пытаюсь это сделать –

+0

вам нужно 'exclude" META-INF/*. SF "' 'исключить" META-INF/*. DSA "' 'исключить" META-INF/*. RSA "' такие как missfaktor's ans wer –

5

Просто добавьте в build.gradle вашего Java-модуле.

mainClassName = "my.main.Class"

jar { 
    manifest { 
    attributes "Main-Class": "$mainClassName" 
    } 

    from { 
    configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } 
    } 
} 

Это приведет к [module_name]/сборки/LIBS/.jar файл [module_name].

+0

но что это за код? Что такое configurations.compile.collect {it.isDirectory()? это: zipTree (it)} do? –

+1

@SamRedway 'configurations.compile.collect' собирает материал из' compile' Тернар позволяет вставлять в обе папки и zip-файлы (например, банки), как если бы они были также папками – pal

+0

Я еще не пробовал другие версии размещены здесь, но этот работает красиво и красиво и просто. – chris

Смежные вопросы