Como outros observaram, para que um arquivo jar seja executável, o ponto de entrada do aplicativo deve ser definido no Main-Class
atributo do arquivo de manifesto. Se os arquivos de classe de dependência não forem colocados, eles deverão ser configurados na Class-Path
entrada do arquivo de manifesto.
Eu tentei todos os tipos de combinações de plugins e para a simples tarefa de criar um jar executável e de alguma forma incluir as dependências. Todos os plugins parecem estar faltando de um jeito ou de outro, mas finalmente consegui o que queria. Nenhum script misterioso, nem um milhão de mini-arquivos diferentes poluindo o diretório de compilação, um arquivo de script de compilação bastante limpo e, acima de tudo: nem um milhão de arquivos de classe de terceiros estrangeiros mesclados no meu arquivo jar.
A seguir, é copiada e colada a partir daqui para sua conveniência.
[Como fazer] crie um arquivo zip de distribuição com jars de dependência no subdiretório /lib
e adicione todas as dependências à Class-Path
entrada no arquivo de manifesto:
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
}
Hospedado como uma essência aqui .
O resultado pode ser encontrado em build/distributions
e o conteúdo descompactado tem a seguinte aparência:
lib / commons-lang3-3.3.2.jar
MyJarFile.jar
Conteúdo de MyJarFile.jar#META-INF/MANIFEST.mf
:
Versão do manifesto: 1.0
Classe principal: caminho da
classe com.somepackage.MainClass : lib / commons-lang3-3.3.2.jar