Estou criando um arquivo JAR com o Gradle. Quando tento executá-lo, recebo o erro
nenhum atributo de manifesto principal, em RxJavaDemo.jar
Eu tentei manipular a propriedade Manifest, mas acho que estou esquecendo de adicionar as dependências ou algo assim. O que exatamente estou fazendo de errado?
apply plugin: 'java'
apply plugin: 'application'
mainClassName = 'demo.MainDashboard'
dependencies {
compile files ("H:/Processes/Development/libraries/hikari-cp/HikariCP-2.4.1.jar")
compile files ("H:/Processes/Development/libraries/controls-fx/controlsfx.jar")
compile files ("H:/Processes/Development/libraries/database_connections/sqlite-jdbc-3.8.6.jar")
compile files ("H:/Processes/Development/libraries/guava/guava-18.0.jar")
compile files ("H:/Processes/Development/libraries/rxjava/rxjava-1.0.12.jar")
compile files ("H:/Processes/Development/libraries/rxjava-extras/rxjava-extras-0.5.15.jar")
compile files ("H:/Processes/Development/libraries/rxjavafx/RxJavaFX-1.0.0-RC1-SNAPSHOT.jar")
compile files ("H:/Processes/Development/libraries/rxjavaguava/rxjava-guava-1.0.3.jar")
compile files ("H:/Processes/Development/libraries/rxjava-jdbc/rxjava-jdbc-0.6.3.jar")
compile files ("H:/Processes/Development/libraries/slf4j/slf4j-api-1.7.12.jar")
compile files ("H:/Processes/Development/libraries/tom-commons/tom-commons.jar")
}
sourceSets {
main.java.srcDir "src/main/java"
main.resources.srcDir "src/main/resources"
}
jar {
manifest {
attributes(
"Class-Path": configurations.compile.collect { it.getName() }.join(' '))
}
from configurations.compile.collect { entry -> zipTree(entry) }
}
collect {}
parte para fazê-la funcionar para mim. Seu código assume que todas as dependências estão na mesma pasta que sua classe principal.Para tornar o
jar
arquivo executável (para que ojava -jar
comando funcione), especifique oMain-Class
atributo emMANIFEST.MF
.No Gradle, você pode fazer isso configurando a
jar
tarefa.tasks.withType<Jar> { manifest { attributes["Main-Class"] = "com.caco3.Main" } }
Por
mainClassName
que não funciona como esperado?Ou por
mainClassName
que não especifica o atributo no manifesto?A
mainClassName
propriedade vem doapplication
plugin . O plugin:Assim, o
application
plugin não visam produzir executáveisjar
sQuando uma
mainClassName
propriedade é definida, então:$ ./gradlew run
irá lançar omain
método na classe especificada no atributozip
/tar
archive construído usandodistZip
/distTar
tasks conterá um script, que iniciará omain
método da classe especificada anteriormente.Esta é a linha do script de shell definindo a classe principal:
$ grep Main2 gradletest eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLETEST_OPTS -classpath "\"$CLASSPATH\"" com.caco3.gradletest.Main2 "$APP_ARGS"
fonte
FWIW - Usei a seguinte tarefa jar para montar todas as minhas dependências de compilação no arquivo jar e usei a recomendação acima para obter o caminho da classe definido corretamente
apply plugin: 'java-library' jar { manifest { attributes( 'Class-Path': configurations.compile.collect { it.getName() }.join(' '), 'Main-Class': 'your.main.class.goes.here' ) } // You can reference any part of the dependency configurations, // and you can have as many from statements as you need from configurations.compile // I just copied them into the top of the jar, so it looks like the eclipse exported // runnable jar, but you could designate a lib directory, and reference that in the // classpath as "lib/$it.name" instead of it.getName() into '' }
fonte