Построение Uberjar с Gradle

Я новичок в Gradle. Я хочу построить Uberjar (AKA FATJAR), который включает в себя все переходные зависимости проекта. Какие строки мне нужно добавить в мой & quot; build.gradle & quot ;?

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

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
    }
}
 Scott04 февр. 2014 г., 22:15
Вы можете попробовать использоватьapplication plug-in вместо.
 Stefan Neuhaus15 мар. 2017 г., 22:02
Это будет работать до тех пор, пока у вас нет никаких зависимостей. Но как только у вашего проекта есть зависимости, они не попадут в uberjar.

Ответы на вопрос(4)

mainClassName = & quot; my.main.Class & quot;

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

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

Это приведет к созданию файла [module_name] / build / libs / [module_name] .jar.

 21 апр. 2017 г., 22:41
но что это за код? Что означает configurations.compile.collect {it.isDirectory ()? это: zipTree (it)} делать?
 03 июл. 2017 г., 19:10
@SamRedwayconfigurations.compile.collect собирает вещи изcompile  Тройной позволяет ему извлекать как папки, так и zip-файлы (например, jars), как если бы они были также папками.
 18 июл. 2017 г., 17:52
Я не пробовал другие версии, размещенные здесь, но эта работает хорошо, и это приятно и просто.
 31 июл. 2018 г., 17:16
Этот ответ исключает любыеruntime или жеruntimeOnly объявленные зависимости, которые приведут к разрыву приложения во время выполнения.
 01 мар. 2019 г., 15:58
@mkobit Вы можете заменитьcompile сruntimeClasspath как указано вthis answer.

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

Исключения нужны, потому что в их отсутствие вы попадетеэтот вопрос.

 02 апр. 2018 г., 22:49
Это сработало для меня! Без исключающей части это убивало меня с SecurityException, и с этим исправлением это работает!
 31 июл. 2018 г., 17:17
Лучше всего даже использоватьsourceSets.getByName('main').runtimeClasspath
 30 дек. 2014 г., 13:15
мне нужно было добавитьwith jar ниже манифест, чтобы получить файлы вjava/main/resources в уберьяре
 12 сент. 2014 г., 08:46
Я думаю, что следует использоватьconfigurations.runtime включить все зависимости времени выполнения

проект очень полезно. Используя его в качестве ссылки, моя задача 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'
    }
}
 31 авг. 2017 г., 18:03
тебе нужноexclude "META-INF/*.SF" exclude "META-INF/*.DSA" exclude "META-INF/*.RSA" как и ответ отсутствующего фактора
 31 авг. 2017 г., 18:01
я получилInvalid signature file digest for Manifest main attributes когда я попробую это
Решение Вопроса

Have you tried the fatjar example in the поваренная книга?

То, что вы ищете, этоплагин тени для gradle

 29 апр. 2015 г., 23:58
Вещи меняются через 3 года. И я все еще использую плагин тени ;-)
 29 апр. 2015 г., 23:56
это очень просто и сработало в первый раз (после попытки многих других "ответов":stackoverflow.com/questions/23738676/…
 07 апр. 2015 г., 05:42
Похоже, что поваренная книга теперь требует входа в систему. Поскольку это именно то, что я ищу, не могли бы вы вставить сюда рецепт, пожалуйста?
 07 апр. 2015 г., 08:03
@tarzan три года спустя, и я теперь использую плагин тениgithub.com/johnrengelman/shadow
 missingfaktor11 июн. 2012 г., 22:02
Спасибо за указатель. Это помогло. Хотя я столкнулся с другой проблемой, которая была решена с помощью небольшого поиска. Я добавлю еще один ответ, расширяющий этот вопрос.

Ваш ответ на вопрос