2014-05-19 29 views
13

我有兴趣在单个可执行jar文件中构建一个包含所有模块依赖项和外部jar的单个jar,我将能够使用java -jar myApp.jar运行该jar文件。如何在gradle.build中使用fatjar插件时指定主类

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

+0

不知道如何帮助你。看起来命令'clean build fatjar'具有不同的输出。真的吗? – Opal

+0

请参阅[Gradle用户指南](http://gradle.org/docs/current/userguide/userguide_single.html)中的“MANIFEST.MF的自定义”。 –

回答

15

我已经想通了自己: 我已经使用了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 :)

+0

我需要在manifest下添加'jar'来获取uberjar中'java/main/resources'中的文件。里面收集应该是{it.isDirectory()?它:zipTree(it)} ... – gladiator

+1

你为什么缩进代码如此不一致? –

5

为了使用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' 
    } 
} 
相关问题