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


969

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

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

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

"app.jar" में कोई मुख्य अभिव्यक्ति विशेषता नहीं

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


मुख्य विधियों की तलाश करें; आप वर्ग के नामों पर भरोसा नहीं कर सकते।
डेव न्यूटन

2
मुझे पता है, लेकिन जब से मेरे पास केवल .class फाइलें हैं, मैं वास्तव में तरीके नहीं देख सकता। या कर सकता हूं?
इवॉड

आप वास्तव में उद्धरण टाइप नहीं कर रहे हैं, क्या आप हैं? किसी भी मामले में, तरीकों को देखने के कई तरीके हैं, जिसमें शामिल हैं javap। आप इसे अन-जार करना चाहते हैं और यह देखना चाहते हैं कि क्या वास्तव में कोई प्रकट नहीं है, हालांकि।
डेव न्यूटन

संबंधित: निर्भरता के साथ: stackoverflow.com/a/23986765/360211
वेस्टन

क्या होगा अगर मेरे पास मुख्य वर्ग नहीं है जैसा कि मैं कमांडलाइनजोबरनर का उपयोग करके कोड चला रहा हूं
कामिनी

जवाबों:


946

पहले, यह अजीब तरह का है, यह देखने के लिए कि आप दौड़ते हैं java -jar "app"या नहींjava -jar app.jar

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

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

Main-Class: com.mypackage.MyClass

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

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

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

के लिए Maven निम्नलिखित स्निपेट की तरह कुछ चाल करना चाहिए। ध्यान दें कि यह केवल प्लगइन परिभाषा है, पूर्ण 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>

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

के लिए Gradle :

plugins {
    id 'java'
}

jar {
    manifest {
        attributes(
                'Main-Class': 'com.mypackage.MyClass'
        )
    }
}

15
चींटी में इसका <प्रकट> <विशेषता नाम = "मुख्य-वर्ग" मान = "com.mypackage.MyClass" /> </ अभिव्यक्ति> <जार> तत्व के भीतर
माइकल नीमैंड

1
धन्यवाद। बस यह जोड़ना चाहता था कि आप इस का उपयोग करके कामेच्छा फ़ोल्डर में निर्भरता को कॉपी कर सकते हैं: stackoverflow.com/a/996915/1121497 । चूंकि क्लासपाथ में वह libफ़ोल्डर शामिल है, तो आपको केवल जार को निष्पादित java -jar myproject.jarकरना होगा और यह निर्भरताएं ढूंढेगा।
फेरन मायलिनच

4
कैसे "एक फ़ाइल को META-INF / MANIFEST.MF कहा जाता है?" मेरे एक हाथ में .jar है और दूसरे पर एक .MF है, मैं उन्हें एक साथ कैसे जोड़ूं? मैं .jar के रूप में एक ही फ़ोल्डर में प्रकट डाल दिया, लेकिन यह काम नहीं करता है मैं अभी भी समस्या है!
विलेटो

4
जारिक फ़ाइल बनाते समय जार के लिए m ध्वज का उपयोग करते हुए एक विशिष्ट MANIFEST.MF फ़ाइल निर्दिष्ट करें । जैसे। jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
DVvrt

1
नोट: मावेन के लिए, मेरे पास पहले से ही maven-jar-pluginवीएससी-जनरेटेड मावेन फ़ाइल में एक आइटम था , इसलिए मैंने इसमें केवल <configuration>अनुभाग जोड़ा ।
एरोन फ्रेंके

279

java -jar app.jarइसके बजाय होना चाहिए था java -jar "app"

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

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

java -cp app.jar com.somepackage.SomeClass

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


3
आपके उत्तर के लिए धन्यवाद, लेकिन आपका समाधान केवल तभी काम करता है जब मैं उस वर्ग का नाम जानता हूं जिसमें मुख्य विधि शामिल है। और यह एक टाइपो था ... यह "app.jar" होना चाहिए था। लेकिन आप कैसे समझाते हैं कि यह फाइल को डबल क्लिक करके अन्य सिस्टम पर क्यों चलता है?
इवॉड

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

यदि यह एक सिस्टम पर नहीं चलता है, तो उस सिस्टम का शायद बहुत पुराना जावा संस्करण है। यदि उदाहरण जावा 7 के साथ संकलित किया गया है, तो आप इसे जावा 6 या पुराने सिस्टम पर नहीं चला सकते।
जेस्पर

यह मजेदार है क्योंकि दूसरी प्रणाली win7 चल रही है और समस्याओं के साथ यह पीसी win8 चलाता है।
इवॉड

2
@ जेस्पर नमस्ते, क्या होगा यदि ग्रहण डिफ़ॉल्ट पैकेज का उपयोग कर रहा है? क्या मैं सिर्फ कक्षा का नाम रख सकता हूं?
ओगेन

127

वैकल्पिक रूप से, आप मावेन-असेंबली-प्लगइन का उपयोग कर सकते हैं, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.package.MainClass</mainClass>
        </manifest>
      </archive>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
  </plugin> 

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


3
बिल्कुल सही, यह काम करता है। यह सभी निर्भरता को एक जार में बाँधता है, इस प्रकार आपको एक परियोजना को संकलित / निर्माण करने और इसे बॉक्स से बाहर चलाने की अनुमति मिलती है।
पॉल

2
छाया प्लगइन के संदर्भ में , किसी को निष्पादन योग्य जार में मदद का पालन करना होगा ।
कोपरपॉपर

3
इस के साथ maven-assembly-pluginकाम किया। maven-jar-pluginनहीं किया।
मार्टीनस जुसेविअस

नोट: इस कोड को अपनी pom.xmlफ़ाइल के अंदर रखें <build><plugins> PUT IT HERE </plugins></build>और फिर मावेन पैकेज निष्पादित करें (दाईं ओर IDEA खुले मावेन स्लाइडिंग मेनू में, प्रोजेक्ट> लाइफसाइकल> पैकेज देखें)। फिर आपकी जार फाइल टार्गेट फोल्डर में होगी। चीयर्स!
किरिल कर्मज़ीन

मैं वास्तव में इस मुद्दे से जूझ रहा था ... यह पूरी तरह से काम करता है। धन्यवाद!
जोजिको

60

ऐसा इसलिए है क्योंकि जावा MANIFEST.MF फ़ाइल में मुख्य विशेषता नहीं ढूँढ सकता है। मुख्य विशेषता जावा को यह बताने के लिए आवश्यक है कि इसे एप्लिकेशन के प्रवेश बिंदु के रूप में किस वर्ग का उपयोग करना चाहिए। जार फ़ाइल के अंदर, MANIFEST.MF फ़ाइल META-INF फ़ोल्डर में स्थित है। आश्चर्य है कि आप कैसे एक जार फ़ाइल के अंदर देख सकते हैं? 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.

यहां छवि विवरण दर्ज करें


32

मेरी भी यही समस्या थी। pom फ़ाइल में निम्न पंक्तियों को जोड़कर इसे काम किया गया। प्लगइन सभी आवश्यक चरणों के साथ आपके आवेदन की निर्माण प्रक्रिया को सुनिश्चित करेगा।

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

2
पूरी तरह से काम किया है, लेकिन अप्रैल 2018 के रूप में संस्करण जोड़ने पर विचार करें <plugin> <groupId> org.springframework.boot </ groupId> <विरूपण साक्ष्य> वसंत-बूट-मावेन-प्लगइन </ विरूपण साक्ष्य> <संस्करण> 2.0.1.RELEASE < / संस्करण> </ प्लगइन>
टेनफ्लेक्स

क्षमा करें, लेकिन यह एक समाधान नहीं है क्योंकि वह स्प्रिंग बूट के बारे में बात नहीं कर रहा है, यह जार निष्पादन के साथ सामान्य समस्या है :)
LAMRIN TAWSRAS

बहुत बहुत धन्यवाद, इसने स्प्रिंग बूट के लिए समस्या हल कर दी!
अलेक्जेंडर

मैं स्प्रिंग बूट 2.2.0 पर काम कर रहा हूं। कृपया। दुर्भाग्य से, यह समाधान मेरे लिए काम नहीं किया। हालाँकि, यह तब काम करता है जब आपने <parent>...</parent>pom.xml में किसी एप्लिकेशन से संदर्भित किया हो । मेरा अनुमान है, अगर हम parentएप्लिकेशन के pom.xml पर जाते हैं, तो हमें एक स्पष्ट विचार मिलेगा।
ट्यूसर

मैंने अंत में कस्टम के साथ अपने मुद्दे को हल किया repackage-classifier। कृपया docs.spring.io/spring-boot/docs/2.2.0.RELEASE/maven-plugin/…
tusar

30

ग्रैडल उत्तर को इस तरह से एक जार / प्रकट / विशेषता सेटिंग जोड़ना है:

apply plugin: 'java'

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

1
इस प्रकार सबसे सरल उत्तर।
लेसिक ०२०११ २१'१

29

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

मेरे लिए इसे हल करने के लिए जार विरूपण साक्ष्य को फिर से बनाना था, निर्भरता वाले मॉड्यूल से JAR> का चयन करना, लेकिन META-INF / MANIFEST.MF के लिए डिफ़ॉल्ट निर्देशिका को स्वीकार नहीं करना। इसे - / src / main / java से - / src / main / resource में बदलें।

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


इसने मेरे लिए IDEA 14.1.6 के साथ काम किया। मैंने pom.xml के लिए बिल्ड प्रॉपर्टी को भी जोड़ा, लेकिन इसका कोई असर नहीं हुआ। लेकिन आपके जवाब ने इसे हल कर दिया, धन्यवाद।
lsrom

3
मेरे डेस्कटॉप को काम करने की शुद्ध हताशा से मुक्त होने से बचाने के लिए धन्यवाद;) आपका लिंक टूटा हुआ लगता है, लेकिन मैं पुष्टि कर सकता हूं कि यह पूरी तरह से काम करता है। IntelliJ IDEA 2018.2.5 (सामुदायिक संस्करण) के साथ परीक्षण किया गया
Matthias Bö

पुष्टि की है कि यह काम करता है, भले ही मैं एक / संसाधन निर्देशिका नहीं है
lxknvlk

28

मावेन के लिए, यह वही है जो इसे हल करता है (मेरे लिए, गिटहब पर वेटल कोडबेस के लिए):

<build>
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.0</version>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
              <mainClass>org.lazydevs.veetle.api.VeetleAPI</mainClass>
            </transformer>
          </transformers>
        </configuration>
      </execution>
    </executions>
  </plugin>
 </plugins>
</build>

चीयर्स ...


मैंने पाया यह काम किया है, लेकिन मैं के रूप में निष्पादित करने के लिए किया था mvn package shade:shadeबस चलाने के mvn packageलिए शेड प्लगइन ट्रिगर नहीं था।
रेस्टोर्म

24

जार को शामिल करने के लिए इस कमांड का प्रयास करें:

java -cp yourJarName.jar your.package..your.MainClass

1
एक तरीका मुख्य वर्ग को pom.xml में शामिल करना और जावा -जार कमांड का उपयोग करना है, अन्य एक जावा-कमांड कमांड का उपयोग करना है।
गौरव खरे

15

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

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

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


11

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

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

3
किसने कहा कि यह एक स्प्रिंग बूट परियोजना थी?
james.garriss

2
@ james.garriss अच्छी तरह से मैं कहूंगा, मैं इस पोस्ट में no main manifest attributeत्रुटि के लिए खोज कर आया था लेकिन मैं स्प्रिंग बूट एप्लिकेशन पर काम कर रहा हूं इसलिए इसने मेरी मदद की। मुझे पहले से ही पता था कि META-INF/MANIFEST.MFफाइल कैसे बनाई जाती है, लेकिन यह नहीं कि स्प्रिंग-बूट कैसे बनाया जाता है।
विश्रांत

5
मुझे इस उत्तर को अस्वीकार करने का कोई कारण नहीं दिखता। अगर आप spring-bootइसे इग्नोर नहीं कर रहे हैं । स्टैकओवरफ़्लो आपके खुद के मुद्दे रिपॉजिटरी का निर्माण करने में भी मदद करता है जिसका आप प्रोग्रामिंग करते समय सामना करते हैं।
विश्रांत

@ मिश्री मुझे दूसरों के बारे में नहीं पता है, लेकिन मैं इस वजह से सवाल का जवाब नहीं देता, क्योंकि यह सवाल किया गया था। हो सकता है कि यह आपके प्रश्न का उत्तर देने के लिए हुआ हो, लेकिन आपका प्रश्न वास्तव में नहीं पूछा गया था।
बैन

@ यकीन है। लेकिन प्रश्न को एक व्यापक अर्थ में लिया जा सकता है और यह उत्तर इस पर लागू होता है और इस अर्थ में दूसरों की मदद कर सकता है जब वे स्प्रिंग बूट का उपयोग करेंगे।
विरान्त

10

मेरा आज भी यही मुद्दा था। मेरी समस्या का हल मेरे मेटा-इन को रिसोर्स फ़ोल्डर में करना था।


इसने मेरे लिए भी काम किया। अगर आप
Jetbrains

थैंक्यू ने वास्तव में मेरे लिए काम किया :)
सैयद मेहताब हसन

इसने मेरे लिए भी इंटेलीज पर काम किया। आपको धन्यवाद।
वकास

10

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

apply plugin: 'java'

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

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


यह मैं मदद की! Gradle ट्यूटोरियल शीर्ष स्तर के का उपयोग करके निर्दिष्ट किया था mainClassNameचर सेट है, लेकिन यह केवल के साथ मदद करता है gradle run, आदेश नहीं एक निष्पादन .jar बनाने के साथ
kevlarr

8

MAVEN समस्या यह है कि इसकी कोशिश हमारे OIF MANIFEST.MF के बजाय निर्भरता से पहली लाइब्रेरी से पहली MANIFEST.MF फ़ाइल को शामिल करने की है जब आप उपयोग करते हैं!

  1. Yourjar.jar का नाम बदलकर yourjar.zip करें
  2. META-INF \ MANIFEST.MF से MANIFEST.MF फ़ाइल खोलें
  3. वास्तविक MANIFEST.MF की प्रतिलिपि बनाएँ जो पहले से ही MAVEN द्वारा आपकी परियोजना में उत्पन्न करता है जिसमें somelike शामिल है:

    प्रकट-संस्करण: 1.0 मुख्य-वर्ग: yourpacket.yourmainclass (exmaple info.data.MainClass के लिए)

  4. MANIFEST.MF की सामग्री को youjar.zip से बदलें।

  5. Yourjar.zip का नाम बदलकर yourjar.jar पर रखें।
  6. अब java -jar yourjar.jar पूरी तरह से काम करता है।

या!

सरल आप खुद MANIFEST.MF और बनाएँ:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <archive>
            <manifestFile> Your path like: src/main/resources/META-INF/MANIFEST.MF </manifestFile>
            <index>true</index>
                <manifest>
                    <addClasspath>true</addClasspath>
                </manifest>
        </archive>
    </configuration>
</plugin>

लेकिन अगर आप मावेन पैनल (या मावेन कमांड लाइन) का उपयोग करते हैं, तो आप इसे स्वयं प्रकट करने के लिए बाध्य कर सकते हैं और इसे जार फ़ाइल में शामिल कर सकते हैं।

  1. इस कोड में आप pom.xml का निर्माण अनुभाग जोड़ें:

    <plugins>
        <plugin>
    
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.2.0</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
    
            <archive>
    
                <index>true</index>
    
                <manifest>
                    <addClasspath>true</addClasspath>
                    <mainClass> yourpacket.yourmainclass (for exmaple info.data.MainClass)</mainClass>
                </manifest>
                <manifestEntries>
                    <mode>development</mode>
                    <url>${project.url}</url>
                </manifestEntries>
            </archive>
        </configuration>
    </plugin>

  2. MAVEN पैनल खोलें (Intellij में) और "इंस्टॉल करें" निष्पादित करें। यह मैनिफ़ेस्ट फ़ाइल उत्पन्न करेगा और JAR फ़ाइल को "लक्ष्य" फ़ोल्डर में सभी निर्भरता के साथ संपत्ति संकलित करेगा। साथ ही इसे स्थानीय मावेन भंडार में स्थापित किया जाएगा।



5

मैंने एक ही मुद्दे का सामना किया और अब यह तय हो गया है :) बस नीचे दिए गए चरणों का पालन करें और त्रुटि कुछ भी हो सकती है, लेकिन नीचे दिए गए चरण प्रक्रिया को आसान बनाते हैं। मैं फिक्स को खोजने के लिए बहुत समय बिताता हूं।

1.Try को फिर से शुरू करें (यदि आप निर्मित JAR फ़ाइल के लिए ग्रहण का उपयोग कर रहे हैं) -> वास्तव में इसने JAR फ़ाइल को ठीक से निर्यात करने में मेरे मुद्दे की मदद की।

2. ग्रहण पुनः आरंभ करने के बाद, यह देखने की कोशिश करें कि क्या आपका ग्रहण आपके जावा प्रोजेक्ट द्वारा मुख्य वर्ग / पद्धति को पहचानने में सक्षम है -> राइट क्लिक -> रन के रूप में -> रन कॉन्फ़िगरेशन -> मुख्य -> ​​खोज बटन पर क्लिक करें यह देखने के लिए कि क्या आपका ग्रहण JAR फ़ाइल में आपके मुख्य वर्ग को देखने में सक्षम है। -> यह मान्यता के लिए है कि JAR फ़ाइल में मुख्य वर्ग का प्रवेश बिंदु होगा।

  1. इसके बाद, अपने जावा डायनेमिक प्रोजेक्ट को "रन करने योग्य जार" फ़ाइल के रूप में निर्यात करें, न कि जार फ़ाइल को।

  2. जावा लॉन्च कॉन्फ़िगरेशन में, अपना मुख्य वर्ग चुनें।

  3. जार फ़ाइल निर्यात करने के बाद, निष्पादित करने के लिए नीचे दिए गए आदेश का उपयोग करें। java -cp [आपका JAR] .jar [पूरा पैकेज]। MainClass उदा: java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAbit

  4. आपको असमर्थित जावा संस्करण त्रुटि का सामना करना पड़ सकता है। यह तय है कि ग्रहण में प्रोजेक्ट को संकलित करने के लिए उपयोग किए गए जावा संस्करण से मिलान करने के लिए अपने शेल बैश प्रोफाइल में java_home को बदलें।

उम्मीद है की यह मदद करेगा! कृपया मुझे बताएं कि क्या आपके पास अभी भी कोई समस्या है।


5

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

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

    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>/उस फोल्डर से क्लास फाइल्स प्राप्त करने के लिए आता है, फोल्डर स्ट्रक्चर को संरक्षित करता है।

    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

1
आपके उत्तर का चौथा चरण बहुत महत्वपूर्ण है! मेरे प्रकट होने की वजह से काम नहीं कर रहा था, क्योंकि मुझे नहीं पता था कि मुझे लगाना होगा। इस विषय (बहुत कुछ) पर मेरे द्वारा देखे गए सभी उत्तरों में इस बात का उल्लेख नहीं था, और किसी के लिए भी मावेन, चींटी, प्रवण और अन्य का उपयोग नहीं करना अनिवार्य है।
Maude

1
@ राय प्रतिक्रिया के लिए धन्यवाद। यही कारण है कि मैंने न्यूलाइन संकेत के साथ उत्तर को बोल्ड में जोड़ा है । मैंने उन दिनों की तलाश की, जब तक कि मुझे एक ऑटो-जनरेटेड मैनिफ़ेस्ट के साथ तुलना करके यह पता नहीं चल गया।
कोडमोंकी

हाह, धन्यवाद। मैं बस उस नई बात पर अपना सिर पीट रहा था।
रिचर्ड थॉमस

5

मुझे व्यक्तिगत रूप से लगता है कि यहाँ सभी उत्तर प्रश्न को समझने में गलत हैं। इसका उत्तर इस बात के अंतर में है कि स्प्रिंग-बूट कैसे बनाता है। हर कोई जानता है कि स्प्रिंग बूट इस तरह से प्रकट होता है, जो हर किसी से अलग होता है मान लें कि यह एक मानक .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

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


यह आशाजनक लगता है। जार्लाउन्चर को क्लासपाथ में कैसे जोड़ते हैं?
MarkHu

4

किसी भी निष्पादन योग्य जार फ़ाइल को java -jar app.jar जैसे कमांड प्रॉम्प्ट का उपयोग करके क्लिक करके या चलाकर उपयोग करना चाहिए (यदि जार के रास्ते में स्पेस है तो "- यानी जावा -जर" C: \ folder name \ app.jar ")। यदि आपका निष्पादन योग्य जार नहीं चल रहा है, जिसका अर्थ है कि यह ठीक से नहीं बनाया गया है।

बेहतर समझ के लिए, जार फ़ाइल को निकालें (या किसी भी टूल का उपयोग करके देखें, विंडोज़ 7-जिप के लिए अच्छा है) और /META-INF/MANIFEST.MF के तहत फ़ाइल की जांच करें। अगर आपको कोई प्रविष्टि पसंद है

मुख्य-वर्ग: your.package.name.ClaaswithMain - फिर यह ठीक है, अन्यथा आपको इसे प्रदान करना होगा।

MANIFEST.MF फ़ाइल पर मुख्य-वर्ग प्रविष्टि को लागू करने के बारे में जागरूक रहें, जांचें कि आप इसे कहाँ सहेज रहे हैं!


4

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

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

जार फ़ाइल को चलाते समय इस तरह से सरल रन करें

 java -cp jarfile-name main-classname

4

आपने जार फ़ाइल ठीक से नहीं बनाई होगी:

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

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

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

4

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

jar cfve app.jar TheNameOfClassWithMainMethod *.class

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


3

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


3

उपरोक्त उत्तर मेरे लिए केवल आंशिक रूप से सहायक थे। 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 में चलाने के लिए मुख्य वर्ग था। मुझे यकीन नहीं है कि अगर आप हमेशा उस वर्ग को मान सकते हैं जिसकी आपको जरूरत है तो वह पहला है, लेकिन यह मेरे लिए था। यदि ऐसा नहीं है, तो मैं कल्पना करूँगा कि पुस्तकालय से संबंधित परिणामों को एक प्रबंधनीय आकार तक नीचे लाने के लिए grep का उपयोग करना बहुत कठिन नहीं है।

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

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

यह हमेशा प्रथम श्रेणी नहीं है। शायद ही कभी। कमांड लाइन होनी चाहिए java -cp ... somepackage.App
user207421

2

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

और मेरा MANIFEST.MF यहाँ के रूप में

// 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

एह? आदेश सारहीन है। अस्पष्ट है कि आप क्या दावा कर रहे हैं।
user207421

2

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

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

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

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

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

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

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

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

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

2

मुझे खराब मैनिफ़ेस्ट जनरेशन का नया सॉल्यूशन मिला!

  1. WinRAR जैसे ज़िप संपादक के साथ जार फ़ाइल खोलें
  2. META-INF के लिए क्लिक करें

  3. जोड़ें या संपादित करें

    • जोड़ें:

      • META-INF नामक फ़ोल्डर में MANIFEST.MF नामक एक टेक्स्ट फ़ाइल बनाएं और निम्नलिखित पंक्ति जोड़ें:

        • घोषणापत्र-संस्करण: 1.0
        • मुख्य-वर्ग: package.ex.com.views.mainClassName
      • फ़ाइल को सहेजें और इसे ज़िप में जोड़ें

    • संपादित करें:

      • पिछली पंक्ति को जोड़ने के लिए MANIFEST.MF को संशोधित करके फ़ाइल को बाहर खींचें
  4. Cmd खोलें और टाइप करें: java -jar c: /path/JarName.jar

यह अब ठीक काम करना चाहिए!


2

अधिकांश समाधानों ने मेरे लिए काम नहीं किया लेकिन मेरे प्रशिक्षक ने मेरी मदद की मैं उनके समाधान को यहाँ साझा करना चाहता हूँ मैंने काली लाइनक्स टर्मिनल का उपयोग किया लेकिन सभी डेबियन में ठीक होना चाहिए

javac *.java
nano MANIFEST.MF

फ़ाइल प्रकार में

मुख्य-वर्ग: मुख्य या जो भी आपकी मुख्य फ़ाइल का नाम है (यदि वह मौजूद है तो पैकेज नाम जोड़ना सुनिश्चित करें)

jar -cvmf MANIFEST.MF new.jar *.class

अब फ़ाइल का उपयोग चलाने के लिए

java -jar new.jar

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

प्रोग्राम के रूप में फ़ाइल के निष्पादन की अनुमति दें

इस पर डबल क्लिक करें

इसने मेरी मदद की, जबकि ऊपर दिए गए अधिकांश उत्तर नहीं मिले


1

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

घोषणापत्र-संस्करण: 1.0

बनाया गया: 1.8.0_51 (ओरेकल कॉर्पोरेशन)

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

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

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

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


1

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

Netbeans परियोजना गुण

  1. पर जाने के गुण अपनी परियोजना की।
  2. रन पर क्लिक करें ।
  3. ब्राउज़ का उपयोग करके अपनी परियोजना के मुख्य वर्ग को निर्दिष्ट करें
  4. निर्माण औरजार फ़ाइल चलाएँ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.