2014-05-19 15 views
13

Ich bin interessiert, ein einzelnes jar zu erstellen, das alle Modulabhängigkeiten und externe jars in einer einzelnen ausführbaren JAR-Datei enthält, die ich mit java -jar myApp.jar ausführen kann.Wie Hauptklasse anzugeben, wenn fatjar plugin in gradle.build

Ich habe Modul A, das auf Modul B. abhängig ist Derzeit gradle ich verwende, und mein build.gradle Skript sieht wie folgt aus:

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

Wenn ich es durch gradle Befehl bauen: clean build fatjar ein fettes Glas 'A.jar' wird wie erwartet erstellt. Aber läuft es mit, wie ich oben beschrieben Ergebnisse in: no main manifest attribute, in A.jar Wie kann ich meine build.gradle Datei ändern und die Hauptklasse oder das Manifest angeben?

+0

Keine Ahnung, wie Sie helfen können. Es scheint, dass der Befehl 'clean build fatjar' verschiedene Ausgaben hat. Ist das wahr? – Opal

+0

Siehe "Anpassung von MANIFEST.MF" im [Benutzerhandbuch zu Gradle] (http://gradle.org/docs/current/userguide/userguide_single.html). –

Antwort

15

Ich habe es selbst herausgefunden: Ich habe Uberjar Gradle Aufgabe verwendet. jetzt meine build.gradle Datei wie folgt aussieht:

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

und jetzt ist es mit dem Befehl, den ich verwende ich:

bereinigter Build uberjar

und es baut ein schönes runnable jar :)

+0

Ich musste "mit jar" unter Manifest hinzufügen, um die Dateien in 'java/main/resources' im Uberjar zu erhalten. Auch innerhalb von Collect sollte sein {it.isDirectory()? it: zipTree (it)} ... – gladiator

+1

Warum haben Sie den Code so inkonsistent eingerückt? –

5

Um es mit Fatjar arbeiten zu lassen, fügte ich einen Manifest-Abschnitt in FatJar-Task hinzu:

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