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

Ell*_*lic 13 jar build uberjar gradle intellij-13

我有兴趣在一个可执行的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"
    }
Run Code Online (Sandbox Code Playgroud)

当我通过gradle命令构建它时:clean build fatjar按预期创建一个胖罐"A.jar".但是,如上所述,运行它会导致: no main manifest attribute, in A.jar 如何修改我的build.gradle文件并指定主类或清单?

Ell*_*lic 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"
}
Run Code Online (Sandbox Code Playgroud)

现在我用它命令:

干净的建造uberjar

它构建了一个漂亮的runnable jar :)


小智 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'
    }
}
Run Code Online (Sandbox Code Playgroud)