java - जार फ़ाइल निष्पादित नहीं कर सकता: "कोई मुख्य अभिव्यक्ति विशेषता नहीं"




jar manifest (20)

(पहली पोस्ट - तो यह साफ नहीं हो सकता है)

यह ओएस एक्स 11.6, मेवेन-आधारित नेटबीन्स 8.2 प्रोग्राम के लिए मेरा फिक्स है। अब तक मेरा ऐप 100% नेटबीन है - कोई ट्वीकिंग नहीं है (केवल कुछ खोल असंभव के लिए बच निकलते हैं!)।

यहां और अन्य जगहों के अधिकांश उत्तरों का कोई फायदा नहीं हुआ, मैं "काम करता है" की कला में लौट आया।

यहां का शीर्ष उत्तर ( ) शुरू करने के लिए सही जगह की तरह दिखता था लेकिन मदद नहीं करता था।

काम करने वाली अन्य परियोजनाओं को देखते हुए, मैंने मैनिफेस्ट लाइनों में कुछ मामूली मतभेदों को देखा:

  1. addClasspath, classpathPrefix अनुपस्थित थे (उन्हें हटा दिया गया)
  2. मेन क्लास में "कॉम" गायब था। (एनबी -> परियोजना गुण-> रन-> मुख्य कक्षा-> निर्दिष्ट करने के लिए ब्राउज़ करें)

यकीन नहीं है कि क्यों (मैं जावा में केवल 3 महीने हूं) या कैसे, लेकिन केवल यह कह सकता है कि यह काम करता है।

यहां केवल संशोधित मेनिफेस्ट ब्लॉक का उपयोग किया गया है:

    <manifest>
        <mainClass>mypackage.MyClass</mainClass>
    </manifest>

मैंने एक एप्लिकेशन इंस्टॉल किया है, जब मैं इसे चलाने की कोशिश करता हूं (यह एक निष्पादन योग्य जार है) कुछ भी नहीं होता है। जब मैं इसे कमांडलाइन से चलाता हूं:

जावा -जर "app.jar"

मुझे निम्न संदेश मिलता है:

"app.jar" में कोई मुख्य मैनिफेस्ट विशेषता नहीं

आम तौर पर, अगर मैंने प्रोग्राम स्वयं बनाया था, तो मैंने मैनिफेस्ट फ़ाइल में एक मुख्य श्रेणी विशेषता जोड़ दी होगी। लेकिन इस मामले में, चूंकि फ़ाइल किसी एप्लिकेशन से है, इसलिए मैं ऐसा नहीं कर सकता। मैंने यह देखने के लिए जार निकालने का भी प्रयास किया कि क्या मुझे मुख्य वर्ग मिल सकता है, लेकिन कई वर्गों में हैं और इनमें से किसी के नाम में "मुख्य" शब्द नहीं है। इसे ठीक करने का एक तरीका होना चाहिए क्योंकि कार्यक्रम अन्य सिस्टम पर ठीक चलता है।


IntelliJ IDEA का उपयोग कर एक जार बनाने के दौरान मुझे यह समस्या थी। इस चर्चा को देखें।

मेरे लिए यह हल किया गया था कि जार आर्टिफैक्ट को फिर से बनाना, जार चुनना> निर्भरताओं वाले मॉड्यूल से, लेकिन मेटा-आईएनएफ / मैनिफ़ेस्ट.एमएफ के लिए डिफ़ॉल्ट निर्देशिका को स्वीकार नहीं करना था। इसे - / src / main / java से - / src / main / संसाधनों में बदलें।

अन्यथा यह जार में एक मेनिफेस्ट फ़ाइल भी शामिल था, लेकिन इसमें से एक / src / main / java में नहीं होना चाहिए।


आप बस इस चरण का पालन कर सकते हैं एक जार फ़ाइल का उपयोग कर बनाएँ

 jar -cfm jarfile-name manifest-filename Class-file name

जार फ़ाइल चलाने के दौरान इस तरह सरल चल रहा है

 java -cp jarfile-name main-classname

आपको वही समस्या हो सकती है जैसा मैं करता हूं। अपनी .jar फ़ाइल बनाने के बाद, jar xf app.jar META-INF/MANIFEST.MF लिखें। यह फ़ाइल की एक प्रति आपकी वर्तमान निर्देशिका में बना देगा ताकि आप इसे पढ़ सकें। अगर यह केवल कुछ कहता है:

मेनिफेस्ट-वर्जन: 1.0

द्वारा निर्मित: 1.8.0_51 (ओरेकल निगम)

और इसमें "मुख्य श्रेणी" घोषणा नहीं है, तो मुझे लगता है कि आपको अपनी समस्या मिली है।

मुझे नहीं पता कि इसे कैसे हल किया जाए, हालांकि। मैंने स्टैक ओवरफ्लो पर समान / समान समस्याओं वाले अन्य लोगों की जांच की और जवाब नहीं मिला। हालांकि इस जानकारी के साथ आप शायद कुछ बेहतर सहायता प्राप्त कर सकते हैं (इस तथ्य को देखते हुए कि आपके पास एक ही समस्या है)।

संपादित करें: मैंने एक मैनिफेस्ट फ़ाइल के साथ प्रयास किया था लेकिन इसे काम करने के लिए नहीं मिला, लेकिन मेरी गलती केवल जार-फाइल बनाने के दौरान कक्षाओं में से एक को नामित करना था। मैंने इसके बजाय * .class लिखा और यह अब काम करता है।

हालांकि मुझे नहीं पता कि एक मेनिफेस्ट-फाइल बनाने की आवश्यकता क्यों है। लेकिन मुझे लगता है कि यह तब तक ठीक है जब तक यह काम करता है।


उपर्युक्त उत्तर केवल मेरे लिए आंशिक रूप से सहायक थे। java -cp उत्तर का हिस्सा था, लेकिन मुझे चलाने के लिए कक्षा की पहचान करने के तरीके के बारे में अधिक विशिष्ट जानकारी की आवश्यकता थी। यहां मेरे लिए क्या काम किया गया है:

चरण 1: मुझे जिस वर्ग को चलाने की आवश्यकता है उसे ढूंढें

jar tf /path/to/myjar.jar | more

परिणाम की शीर्ष पंक्तियां थीं:

META-INF/
META-INF/MANIFEST.MF
somepath/
somepath/App.class
META-INF/maven/
...

App.class में मुख्य वर्ग चलाने के लिए निहित है। मैं 100% निश्चित नहीं हूं अगर आप हमेशा कक्षा को मान सकते हैं कि आपको पहले की आवश्यकता है, लेकिन यह मेरे लिए था। यदि ऐसा नहीं है, तो मुझे लगता है कि वर्ग सूची को प्रबंधित करने योग्य आकार में किराए पर लेने के लिए लाइब्रेरी से संबंधित परिणामों को बाहर करने के लिए grep का उपयोग करना बहुत मुश्किल नहीं है।

वहां से यह आसान था: मैं बस उस पथ का उपयोग करता हूं (".class" प्रत्यय घटाएं):

java -cp /path/to/myjar.jar somepath/App

ऐसा इसलिए है क्योंकि MANIFEST.MF फ़ाइल में जावा मुख्य विशेषता नहीं पा रहा है। जावा को यह बताने के लिए मुख्य विशेषता आवश्यक है कि किस वर्ग को इसे एप्लिकेशन के प्रवेश बिंदु के रूप में उपयोग करना चाहिए। जार फ़ाइल के अंदर, MANIFEST.MF फ़ाइल मेटा-आईएनएफ फ़ोल्डर में स्थित है। आश्चर्य है कि आप एक जार फ़ाइल के अंदर क्या देख सकते हैं? WinRAR के साथ जार फ़ाइल खोलें।

MANIFEST.MF के अंदर मुख्य विशेषता इस तरह दिखती है:

Main-Class: <packagename>.<classname>

MANIFEST.MF फ़ाइल से यह लाइन अनुपलब्ध होने पर आपको यह "कोई मुख्य अभिव्यक्ति विशेषता" त्रुटि नहीं मिलती है।

MANIFEST.MF फ़ाइल के अंदर यह विशेषता निर्दिष्ट करने के लिए यह वास्तव में एक बड़ी गड़बड़ है।

अद्यतन: मुझे ग्रहण में एप्लिकेशन के प्रवेश बिंदु को निर्दिष्ट करने के लिए वास्तव में एक साफ तरीका मिला है। जब आप निर्यात कहते हैं,

Select Jar and next 

[ give it a name in the next window ] and next

and next again

and you'll see " Select the class of the application entry point".

Just pick a class and Eclipse will automatically build a cool MANIFEST.MF for you.


ग्रैडल उत्तर इस तरह की एक जार / मैनिफेस्ट / विशेषताएँ सेट करना है:

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.package.app.Class'
    }
}

चूंकि आपने MANIFEST.MF जोड़ दिया है, मुझे लगता है कि आपको इस फ़ाइल में फ़ील्ड के क्रम पर विचार करना चाहिए। मेरा env java version "1.8.0_91"

और मेरे मैनिफ़ेस्ट.एमएफ यहाँ के रूप में

// MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.8.0_91 (Oracle Corporation)
Main-Class: HelloWorldSwing

// run
~ java -jar HelloWorldSwing.jar
no main manifest attribute, in HelloWorldSwing.jar

हालांकि, यह नीचे के रूप में चलाने के रूप में

Manifest-Version: 1.0
Main-Class: HelloWorldSwing
Created-By: 1.8.0_91 (Oracle Corporation)

//this run swing normally

मुझे अभी भी एक ही त्रुटि मिली है। यदि आप ग्रेडल का उपयोग कर रहे हैं, तो बस अपने gradle.build में अगला जोड़ें:

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'com.company.project.MainClass'
    }
}

जहां com.company.project.MainClass पथ public static void main(String[] args) विधि के साथ आपकी कक्षा के लिए पथ।


मुझे आज भी यही समस्या थी। मेरी समस्या को मेरे चलते मेटा-आईएनएफ को संसाधन फ़ोल्डर में हल किया गया था।


मुझे भी यही समस्या थी। यहां उल्लेखित कई समाधानों ने मुझे पूरी तस्वीर नहीं दी है, इसलिए मैं आपको कमांड लाइन से जार फ़ाइलों को पैक करने का सारांश देने का प्रयास करूंगा।

  1. यदि आप संकुल में अपनी .class फ़ाइलों को रखना चाहते हैं, तो .class की शुरुआत में पैकेज जोड़ें।

    Test.java

    package testpackage;
    
    public class Test
    {
        ...
    }
    
  2. पैकेज कोड नाम द्वारा दी गई संरचना के साथ समाप्त होने वाली अपनी .class फ़ाइलों के साथ अपना कोड संकलित करने के लिए:

    javac -d . Test.java
    

    -d . संकलक आपको इच्छित निर्देशिका संरचना बनाता है।

  3. .jar फ़ाइल को पैकेज करते समय, आपको इसे पैक करने के तरीके पर जार रूटीन को निर्देश देना होगा। यहां हम विकल्प सेट cvfeP उपयोग करते हैं। यह पैकेज संरचना (विकल्प P ) रखना है , प्रविष्टि बिंदु निर्दिष्ट करें ताकि मैनिफेस्ट फ़ाइल में सार्थक जानकारी (विकल्प e ) हो। विकल्प f आपको फ़ाइल नाम निर्दिष्ट करने देता है, विकल्प c एक संग्रह बनाता है और विकल्प v आउटपुट को वर्बोज़ पर सेट करता है। यहां ध्यान देने योग्य महत्वपूर्ण चीजें हैं P और e

    फिर जार का नाम आता है जिसे हम test.jar चाहते हैं।

    फिर प्रवेश बिंदु आता है।

    और फिर आता है- -C . <packagename>/ -C . <packagename>/ उस फ़ोल्डर से वर्ग फ़ाइलों को प्राप्त करने के लिए, फ़ोल्डर संरचना को संरक्षित करना।

    jar cvfeP test.jar testpackage.Test -C . testpackage/
    
  4. एक ज़िप कार्यक्रम में अपनी .jar फ़ाइल की जांच करें। इसमें निम्नलिखित संरचना होनी चाहिए

    test.jar

    META-INF
    | MANIFEST.MF
    testpackage
    | Test.class
    

    MANIFEST.MF में निम्नलिखित होना चाहिए

    Manifest-Version: 1.0
    Created-By: <JDK Version> (Oracle Corporation)
    Main-Class: testpackage.Test
    

    यदि आप हाथ से अपना मैनिफेस्ट संपादित करते हैं तो सुनिश्चित करें कि अंतराल को अंत में रखना है अन्यथा जावा इसे पहचान नहीं पाएगा।

  5. अपनी .jar फ़ाइल को निष्पादित करें

    java -jar test.jar
    

मुझे यह समस्या थी और मैंने हाल ही में Netbeans 8 में ऐसा करके इसे हल किया (नीचे दी गई छवि का संदर्भ लें):

  1. अपनी परियोजना के गुणों पर जाएं।
  2. रन पर क्लिक करें।
  3. ब्राउज़ का उपयोग कर अपने प्रोजेक्ट की मुख्य श्रेणी निर्दिष्ट करें
  4. जार फ़ाइल बनाएं और चलाएं

मेरे लिए यह त्रुटि बस इसलिए हुई क्योंकि मैं ग्रहण को भूल गया था कि मैं एक चलने योग्य जार फ़ाइल चाहता था और एक साधारण लाइब्रेरी जार फ़ाइल नहीं चाहता था। तो जब आप एक्लिप्स में जार फ़ाइल बनाते हैं तो सुनिश्चित करें कि आप सही रेडियो बटन पर क्लिक करें


मेरे लिए, किसी भी उत्तर में वास्तव में मदद नहीं मिली - मेरे पास मेनिफेस्ट फ़ाइल सही जगह पर थी, जिसमें मुख्य श्रेणी और सब कुछ शामिल था। मुझे क्या फिसल गया यह था:

चेतावनी: जिस पाठ फ़ाइल से आप मेनिफेस्ट बना रहे हैं उसे एक नई लाइन या कैरिज रिटर्न के साथ समाप्त होना चाहिए। आखिरी पंक्ति को ठीक से पार्स नहीं किया जाएगा यदि यह एक नई लाइन या कैरिज रिटर्न के साथ समाप्त नहीं होता है।

( source )। मैनिफेस्ट के अंत में एक नई लाइन जोड़ना इसे ठीक करता है।


मैं व्यक्तिगत रूप से सोचता हूं कि यहां सभी उत्तरों प्रश्न को गलत समझ रहे हैं। इसका उत्तर इस बात के अंतर में है कि वसंत-बूट कैसे .jar बनाता है। हर कोई जानता है कि स्प्रिंग बूट इस तरह एक मैनिफेस्ट सेट करता है, जो हर किसी के आकलन से भिन्न होता है कि यह एक मानक है .jar लॉन्च, जो यह हो सकता है या नहीं:

Start-Class: com.myco.eventlogging.MyService
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 1.4.0.RELEASE
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_131
Main-Class: org.springframework.boot.loader.JarLauncher

शायद इसे classpath पर org.springframework.boot.loader.JarLauncher साथ निष्पादित करने की आवश्यकता है?


यदि आप इकट्ठा करने के लिए कमांड लाइन का उपयोग कर रहे हैं .jar मैनिफेस्ट फ़ाइल को जोड़ने के बिना मुख्य को इंगित करना संभव है। उदाहरण:

jar cfve app.jar TheNameOfClassWithMainMethod *.class

(param "e" करता है: TheNameOfClassWithMainMethod विधि मुख्य () और app.jar के साथ कक्षा का नाम है - निष्पादन योग्य .jar और * .class का नाम - बस सभी वर्ग फ़ाइलों को इकट्ठा करने के लिए)


यदि मेवेन का उपयोग करते हैं, तो पोम में निम्नलिखित शामिल करें

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.2.RELEASE</version>
</parent>

<properties>
    <java.version>1.8</java.version>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

यह java -jar app.jar java -jar "app" बजाए java -jar "app" java -jar app.jar होना चाहिए था।

-jar विकल्प केवल तभी काम करता है जब JAR फ़ाइल निष्पादन योग्य JAR फ़ाइल है, जिसका अर्थ है कि इसमें एक Main-Class विशेषता वाला एक मेनिफेस्ट फ़ाइल होना चाहिए। एक निष्पादन योग्य जेएआर बनाने के तरीके को जानने के लिए जेएआर फाइलों में पैकेजिंग कार्यक्रम देखें।

यदि यह निष्पादन योग्य JAR नहीं है, तो आपको प्रोग्राम को इस तरह से चलाने की आवश्यकता होगी:

java -cp app.jar com.somepackage.SomeClass

जहां com.somepackage.SomeClass वह वर्ग है जिसमें प्रोग्राम चलाने के लिए main विधि शामिल है। (वह वर्ग क्या कार्यक्रम पर निर्भर करता है, आपके द्वारा प्रदान की गई जानकारी से बताना असंभव है)।


सबसे पहले, यह अजीब तरह का है, आपको java -jar "app" चलाने के लिए और java -jar app.jar

दूसरा, एक जार निष्पादन योग्य बनाने के लिए ... आपको मेटा-आईएनएफ / MANIFEST.MF नामक फ़ाइल को जार करना होगा

फ़ाइल में यह एक लाइनर होना चाहिए (कम से कम)

Main-Class: com.mypackage.MyClass

जहां com.mypackage.MyClass सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] तर्क) प्रविष्टि बिंदु धारण करने वाली कक्षा है।

ध्यान दें कि सीएलआई, मेवेन या चींटी के साथ ऐसा करने के कई तरीके हैं:

सीएलआई के लिए , निम्न आदेश करेगा: (tks @ dvvrt ) jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>

मेवेन के लिए , निम्न स्निपेट की तरह कुछ चाल चलाना चाहिए। ध्यान दें कि यह केवल प्लगइन परिभाषा है, पूर्ण pom.xml नहीं :

<build>
  <plugins>
    <plugin>
      <!-- Build an executable JAR -->
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>3.1.0</version>
      <configuration>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>com.mypackage.MyClass</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

(अपनी परियोजना के लिए उपयुक्त एक <version> चुनें।)

चींटी के लिए , नीचे स्निपेट मदद करनी चाहिए:

<jar destfile="build/main/checksites.jar">
  <fileset dir="build/main/classes"/>
  <zipfileset includes="**/*.class" src="lib/main/some.jar"/>
  <manifest>
    <attribute name="Main-Class" value="com.acme.checksites.Main"/>
  </manifest>
</jar>

क्रेडिट माइकल निमंद -


हो सकता है कि आपने जार फ़ाइल को ठीक से नहीं बनाया हो:

पूर्व: जार निर्माण में लापता विकल्प एम

निम्नलिखित कार्य करता है:

jar -cvfm MyJar.jar Manifest.txt *.class




main