Gradle- ana açık özellik yok


92

Gradle'dan oluşturulan bir JAR dosyası çalıştırırken aldığım bu hatayla biraz deliriyorum. Hata "RxJavaDemo.jar'da ana manifest özniteliği yok" yazıyor Manifest özelliğini değiştirmeyi denedim, ancak bağımlılıkları veya ona bir şey eklemeyi unuttuğumu düşünüyorum. Tam olarak neyi yanlış yapıyorum?

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) }
}

Yanıtlar:


143

Aşağıdaki gibi manifest niteliklerinizi değiştirmeye çalışın:

jar {
  manifest {
    attributes(
      'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
      'Main-Class': 'hello.HelloWorld'
    )
  }
}

Ve sonra sadece değiştirmek 'hello.helloWorld'için '<your packagename>.<the name of your Main class>'(sizin Ana sınıfı bir ana yöntem vardır yerde). Bu durumda, manifestinizde bu sınıfa işaret eden bir nitelik yaparsınız, sonra bir kavanoz çalışır.


1
@Stanislav 'Main-Class' değeri ana sınıf mı? Örneğinizde merhaba ve merhaba dünya nedir?
Daniela Maia

2
@DanielaMaia bu sadece tam nitelikli bir sınıf adı, kesinlikle merhaba olarak yazılması gerekiyor MerhabaWorld, merhaba HelloWorld sınıfının bulunduğu pakettir
Stanislav

9
Benim collect {}için çalışması için kısmı kaldırmam gerekiyordu . Kodunuz, tüm bağımlılıkların ana sınıfınızla aynı klasörde olduğunu varsayar.
AutonomousApps

1

FWIW - Tüm derleme bağımlılıklarımı jar dosyasına birleştirmek için aşağıdaki jar görevini kullandım ve sınıf yolunu düzgün bir şekilde ayarlamak için yukarıdaki öneriyi kullandım

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 ''   
}

0

jarDosyayı çalıştırılabilir yapmak için (böylece java -jarkomut çalışır), Main-Classiçinde niteliği belirtin MANIFEST.MF.

Gradle'da, jargörevi yapılandırarak bunu yapabilirsiniz .

  • için Groovy DSL bu cevapları (bkz [1] , [2] )
  • için Kotlin DSL aşağıdaki kod parçacığını kullanabilirsiniz:
tasks.withType<Jar> {
    manifest {
        attributes["Main-Class"] = "com.caco3.Main"
    }
}

Neden mainClassNamebeklendiği gibi çalışmıyor?

Ya da neden mainClassNamemanifestteki özniteliği belirtmiyor?

mainClassNameMülkiyet gelen applicationeklenti . Eklenti:

geliştirme sırasında uygulamanın yerel olarak başlatılmasını ve uygulamanın işletim sistemine özgü başlatma komut dosyaları dahil TAR ve / veya ZIP olarak paketlenmesini kolaylaştırır .

Bu nedenle applicationeklenti çalıştırılabilir jarURL'ler üretmeyi amaçlamaz.

Bir mainClassNamemülk ayarlandığında, o zaman:

  1. $ ./gradlew runmainyöntemi öznitelikte belirtilen sınıfta başlatacak
  2. zip/ tarkullanılarak oluşturulan arşivi distZip/ distTarbaşlatacak bir komut dosyası, içerecektir görevleri mainbelirtilmiş, daha önce sınıfın metodunu.

İşte ana sınıfı ayarlayan kabuk betiği satırı:

$ grep Main2 gradletest
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLETEST_OPTS -classpath "\"$CLASSPATH\"" com.caco3.gradletest.Main2 "$APP_ARGS"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.