ग्रेडल- कोई मुख्य अभिव्यक्ति विशेषता नहीं


91

मैं इस त्रुटि के साथ पागल हो रहा हूं, जब मुझे ग्रेड से निर्मित एक जार फ़ाइल चलती है। त्रुटि "RxJavaDemo.jar में" कोई मुख्य अभिव्यक्ति विशेषता नहीं पढ़ती है, मैंने मैनिफ़ेस्ट संपत्ति में हेरफेर करने की कोशिश की, लेकिन मुझे लगता है कि मैं निर्भरता या इसके साथ कुछ जोड़ना भूल रहा हूं। क्या मैं गलत कर रहा हूँ?

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

जवाबों:


142

अपनी प्रकट विशेषताओं को बदलने का प्रयास करें:

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

और फिर बस को बदलने 'hello.helloWorld'के लिए '<your packagename>.<the name of your Main class>'(जहां आपकी मुख्य वर्ग एक मुख्य विधि है)। इस मामले में, आप अपने गुणन को एक विशेषता बनाते हैं, जो इस वर्ग को इंगित करता है, फिर एक जार चल रहा है।


1
@ स्टानिस्लाव 'मुख्य-वर्ग' का मान मुख्य वर्ग है? आपके उदाहरण में हैलो और हेलोवर्ल्ड क्या हैं?
डेनियल मैया

2
@DanielaMaia यह सिर्फ एक पूर्ण योग्य वर्ग का नाम है, निश्चित रूप से इसे hello.HelloWorld के रूप में लिखा जाना है, जहां हैलो पैकेज है जहां हैलोवर्ल्ड वर्ग स्थित है
स्टैनिस्लाव

9
मुझे collect {}अपने काम करने के लिए इसे निकालने के लिए हिस्से को हटाने की जरूरत थी । आपका कोड मानता है कि सभी निर्भरताएं आपके मुख्य वर्ग के समान फ़ोल्डर में हैं।
ऑटोनॉमस

1

एफडब्ल्यूआईडब्ल्यू - मैंने जार फ़ाइल में अपनी सभी संकलन निर्भरताओं को इकट्ठा करने के लिए निम्नलिखित जार कार्य का उपयोग किया, और वर्ग-पथ को ठीक से सेट करने के लिए उपरोक्त सिफारिश का उपयोग किया

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

jarफ़ाइल को निष्पादन योग्य बनाने के लिए (ताकि java -jarकमांड काम करे), में Main-Classविशेषता निर्दिष्ट करें MANIFEST.MF

ग्रैडल में, आप इसे jarकार्य को कॉन्फ़िगर करके कर सकते हैं ।

  • के लिए ग्रूवी डीएसएल ये उत्तर देखना ( [1] , [2] )
  • के लिए Kotlin डीएसएल आप निम्नलिखित कोड का उपयोग कर सकते हैं:
tasks.withType<Jar> {
    manifest {
        attributes["Main-Class"] = "com.caco3.Main"
    }
}

mainClassNameउम्मीद के मुताबिक काम क्यों नहीं होता?

या mainClassNameप्रकट में विशेषता क्यों निर्दिष्ट नहीं करता है?

mainClassNameसंपत्ति से आता है applicationप्लगइन । प्लगइन:

विकास के दौरान एप्लिकेशन को स्थानीय रूप से शुरू करना आसान बनाता है , और ऑपरेटिंग सिस्टम विशिष्ट प्रारंभ स्क्रिप्ट सहित TAR और / या ज़िप के रूप में एप्लिकेशन को पैकेज करना है ।

इसलिए applicationप्लगइन निष्पादन योग्य jarएस के उत्पादन का लक्ष्य नहीं रखता है

जब एक mainClassNameसंपत्ति सेट, तब:

  1. $ ./gradlew runmainविशेषता में निर्दिष्ट वर्ग में विधि का शुभारंभ करेंगे
  2. zip/ tarका उपयोग कर बनाया संग्रह distZip/ distTarकार्य एक स्क्रिप्ट है, जो शुभारंभ करेंगे शामिल होंगे mainनिर्दिष्ट पहले वर्ग की विधि।

यहाँ शेल स्क्रिप्ट की लाइन मुख्य वर्ग को सेट कर रही है:

$ grep Main2 gradletest
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLETEST_OPTS -classpath "\"$CLASSPATH\"" com.caco3.gradletest.Main2 "$APP_ARGS"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.