Come altri hanno notato, affinché un file jar sia eseguibile, il punto di ingresso dell'applicazione deve essere impostato Main-Classnell'attributo del file manifest. Se i file della classe di dipendenza non sono collocati, devono essere impostati nella Class-Pathvoce del file manifest.
Ho provato tutti i tipi di combinazioni di plug-in e cosa non per il semplice compito di creare un vaso eseguibile e in qualche modo, includere le dipendenze. Tutti i plugin sembrano mancare in un modo o nell'altro, ma alla fine ho capito come volevo. Nessuno script misterioso, non un milione di mini file diversi che inquinano la directory di build, un file di script build abbastanza pulito e, soprattutto: non un milione di file di terze parti stranieri si sono fusi nel mio archivio jar.
Di seguito è riportato un copia-incolla da qui per comodità.
[Come fare] creare un file zip di distribuzione con barattoli di dipendenza nella sottodirectory /libe aggiungere tutte le dipendenze alla Class-Pathvoce nel file manifest:
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
}
Ospitato come sostanza qui .
Il risultato può essere trovato build/distributionse il contenuto decompresso appare così:
lib / commons-lang3-3.3.2.jar
MyJarFile.jar
Contenuto di MyJarFile.jar#META-INF/MANIFEST.mf:
Versione manifest: 1.0
Classe principale: com.somepackage.MainClass
Percorso di classe: lib / commons-lang3-3.3.2.jar