2014-05-19 8 views
13

Jestem zainteresowany budowaniem pojedynczego słoika zawierającego wszystkie zależności modułów i słoiki zewnętrzne w jednym pliku wykonywalnego jar, który będę mógł uruchomić z java -jar myApp.jar.Jak określić główną klasę podczas korzystania z wtyczki fatjar w gradle.build

Mam moduł A, która jest zależna od modułu B. Obecnie używam Gradle, a mój build.gradle skrypt wygląda tak:

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

Kiedy budować poprzez komendy Gradle: clean build fatjar słoik tłuszczu "A.jar" jest tworzony zgodnie z oczekiwaniami. Ale uruchamianie go tak jak napisałem powyżej powoduje: no main manifest attribute, in A.jar Jak mogę zmodyfikować mój plik build.gradle i określić główną klasę lub manifest?

+0

Nie mam pojęcia jak ci pomóc. Wydaje się, że polecenie 'clean build fatjar' ma różne wyjścia. Czy to prawda? – Opal

+0

Zobacz "Dostosowywanie MANIFEST.MF" w [Przewodnik użytkownika Gradle] (http://gradle.org/docs/current/userguide/userguide_single.html). –

Odpowiedz

15

I zdobione go sobie: Użyłem uberjar zadania Gradle. teraz mój plik build.gradle wygląda następująco:

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

i teraz ja go używać z poleceniem:

czysty build uberjar

i buduje jeden piękny słoik runnable :)

+0

Potrzebowałem dodać 'z jar' poniżej manifestu, aby uzyskać pliki w' java/main/resources' w uberjar. Również wewnątrz kolekcji powinno być {it.isDirectory()? it: zipTree (it)} ... – gladiator

+1

Dlaczego wcięcia kodu tak niekonsekwentnie? –

5

Aby to działało, używając fatjara, dodałem manifest w dziale 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' 
    } 
} 
Powiązane problemy