Как указать основной класс при использовании плагина fatjar в gradle.build

Я заинтересован в создании одного jar-файла, содержащего все зависимости модуля и внешние jar-файлы в одном исполняемом файле jar, который я смогу запускать с помощью java -jar myApp.jar.

У меня есть модуль A, который зависит от модуля B. В настоящее время я использую gradle, и мой build.gradlescript выглядит так:

    apply plugin: 'fatjar'
    description = "A_Project"
    dependencies {
      compile project(':B_Project')
      compile "com.someExternalDependency::3.0"
    }

Когда я создаю его с помощью команды gradle: clean build fatjar создается толстая банка «A.jar», как и ожидалось. Но запуск его, как я написал выше, приводит к: no main manifest attribute, in A.jar Как я могу изменить свой файл build.gradle и указать основной класс или манифест?


person Ella Nikolic    schedule 19.05.2014    source источник
comment
Не знаю, как Вам помочь. Кажется, что команда clean build fatjar имеет разные выходные данные. Это правда?   -  person Opal    schedule 19.05.2014
comment
См. раздел Настройка файла MANIFEST.MF в Руководстве пользователя Gradle.   -  person Peter Niederwieser    schedule 20.05.2014


Ответы (2)


Я сам понял это: я использовал задачу uberjar Gradle. теперь мой файл build.gradle выглядит так:

apply plugin: 'java'
apply plugin: 'application'

mainClassName  = 'com.organization.project.package.mainClassName'

version = '1.0'

task uberjar(type: Jar) {
    from files(sourceSets.main.output.classesDir)
    from {configurations.compile.collect {zipTree(it)}} {
        exclude "META-INF/*.SF"
        exclude "META-INF/*.DSA"
        exclude "META-INF/*.RSA"
}

manifest {
    attributes 'Main-Class': 'com.organization.project.package.mainClassName'
    }
}


dependencies {
compile project(':B_Project')
compile "com.someExternalDependency::3.0"
}

и теперь я использую его с командой:

чистая сборка uberjar

и он строит одну красивую работоспособную банку :)

person Ella Nikolic    schedule 02.07.2014
comment
мне нужно было добавить with jar ниже манифеста, чтобы получить файлы в java/main/resources в uberjar. Также внутри сбора должно быть { it.isDirectory() ? это : zipTree(это) }... - person gladiator; 30.12.2014

Чтобы заставить его работать с помощью fatjar, я добавил раздел манифеста в задачу fatJar:

task fatJar(type: Jar) {
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
    manifest {
        attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
        attributes 'Main-Class': 'com.organization.project.package.mainClassName'
    }
}
person Damien    schedule 12.09.2014