如何在gradle.build中使用fatjar插件时指定主类

时间:2014-05-19 13:11:11

标签: jar build gradle intellij-13 uberjar

我有兴趣在单个可执行jar文件中构建一个包含所有模块依赖项和外部jar的jar,我将能够使用java -jar myApp.jar运行。

我有模块A,它依赖于模块B. 目前我正在使用gradle,我的build.gradle脚本如下所示:

    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文件并指定主类或清单?

2 个答案:

答案 0 :(得分:16)

我自己已经弄清楚了: 我用过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

它构建了一个漂亮的可运行jar:)

答案 1 :(得分:5)

为了让它使用fatjar工作,我在fatJar任务中添加了一个manifest部分:

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