2014-05-19 28 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' 
    } 
} 
相關問題