Me estoy volviendo loco con este error que obtengo cuando ejecuto un archivo JAR creado en Gradle. El error dice "ningún atributo de manifiesto principal, en RxJavaDemo.jar" Intenté manipular la propiedad Manifest pero creo que me olvido de agregar las dependencias o algo. ¿Qué estoy haciendo mal exactamente?
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 {}porción para que funcionara para mí. Su código asume que todas las dependencias están en la misma carpeta que su clase principal.FWIW: utilicé la siguiente tarea jar para ensamblar todas mis dependencias de compilación en el archivo jar y utilicé la recomendación anterior para configurar correctamente la ruta de clase
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 '' }fuente
Para hacer que el
jararchivo sea ejecutable (para quejava -jarfuncione el comando), especifique elMain-Classatributo enMANIFEST.MF.En Gradle, puede hacerlo configurando la
jartarea.tasks.withType<Jar> { manifest { attributes["Main-Class"] = "com.caco3.Main" } }¿
mainClassNamePor qué no funciona como se esperaba?¿O por qué
mainClassNameno especifica el atributo en el manifiesto?los
mainClassNamepropiedad proviene delapplicationcomplemento . El complemento:Entonces el
applicationplug-in no tiene como objetivo producir ejecutablesjarsCuando un
mainClassNameestablece propiedad, entonces:$ ./gradlew runlanzará elmainmétodo en la clase especificada en el atributozip/tarconstruido usandodistZip/distTartasks contendrá un script, que lanzará elmainmétodo de la clase especificada anteriormente.Aquí está la línea de script de shell que configura la clase principal:
$ grep Main2 gradletest eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLETEST_OPTS -classpath "\"$CLASSPATH\"" com.caco3.gradletest.Main2 "$APP_ARGS"fuente