Jak zauważyli inni, aby plik jar był wykonywalny, punkt wejścia aplikacji musi być ustawiony w Main-Class
atrybucie pliku manifestu. Jeśli pliki klas zależności nie są kolokowane, należy je ustawić we Class-Path
wpisie pliku manifestu.
Wypróbowałem różne kombinacje wtyczek, a nie tylko po to, aby utworzyć plik wykonywalny jar i jakoś dołączyć zależności. Wydaje się, że wszystkim wtyczkom brakuje w ten czy inny sposób, ale w końcu dostałem to tak, jak chciałem. Żadnych tajemniczych skryptów, ani miliona różnych mini-plików zanieczyszczających katalog kompilacji, całkiem czysty plik skryptu kompilacji, a przede wszystkim: ani milion obcych plików klas innych firm, które zostały włączone do mojego archiwum jar.
Poniżej znajduje się kopia-wklej stąd dla Twojej wygody.
[How-to] Utwórz dystrybucyjny plik ZIP z plikami JAR zależności w podkatalogu /lib
i dodaj wszystkie zależności do Class-Path
wpisu w pliku manifestu:
apply plugin: 'java'
apply plugin: 'java-library-distribution'
repositories {
mavenCentral()
}
dependencies {
compile 'org.apache.commons:commons-lang3:3.3.2'
}
// Task "distZip" added by plugin "java-library-distribution":
distZip.shouldRunAfter(build)
jar {
// Keep jar clean:
exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.MF'
manifest {
attributes 'Main-Class': 'com.somepackage.MainClass',
'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' ')
}
// How-to add class path:
// /programming/22659463/add-classpath-in-manifest-using-gradle
// https://gist.github.com/simon04/6865179
}
Hostowane jako sedno tutaj .
Wynik można znaleźć w, build/distributions
a rozpakowana zawartość wygląda następująco:
lib / commons-lang3-3.3.2.jar
MyJarFile.jar
Zawartość MyJarFile.jar#META-INF/MANIFEST.mf
:
Manifest-Version: 1.0
Main-Class: com.somepackage.MainClass
Class-Path: lib / commons-lang3-3.3.2.jar