2014-05-19 19 views
13

Sono interessato a creare un singolo jar contenente tutte le dipendenze del modulo e jar esterni in un singolo file jar eseguibile che sarà in grado di eseguire con java -jar myApp.jar.Come specificare la classe principale quando si utilizza il plugin fatjar in gradle.build

Ho modulo A che dipende dal modulo B. Attualmente sto usando Gradle, e il mio script build.gradle simile a questa:

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

Quando costruisco attraverso comando Gradle: clean build fatjar un barattolo di grasso 'A.jar' viene creato come previsto. Ma eseguirlo con quanto ho scritto sopra risulta in: no main manifest attribute, in A.jar Come posso modificare il mio file build.gradle e specificare la classe principale o il manifest?

+0

Non ho idea di come aiutarti. Sembra che il comando 'clean build fatjar' abbia diversi output. È vero? – Opal

+0

Vedere "Personalizzazione di MANIFEST.MF" nella [Guida dell'utente Gradle] (http://gradle.org/docs/current/userguide/userguide_single.html). –

risposta

15

Ho capito da solo: Ho usato il compito di Grader uberjar. ora il mio file build.gradle assomiglia a questo:

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

e ora mi Io lo uso con il comando:

generazione pulita uberjar

e costruisce un bel vaso eseguibile :)

+0

avevo bisogno di aggiungere 'con jar' sotto manifest per ottenere i file in' java/main/resources' in uberjar. Anche inside collect dovrebbe essere {it.isDirectory()? it: zipTree (it)} ... – gladiator

+1

Perché hai indentato il codice in modo incoerente? –

5

Per farlo funzionare utilizzando fatjar, ho aggiunto una sezione manifest nell'attività 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' 
    } 
}