java - no main manifest attribute




لا يمكن تنفيذ jar- file: "no manifest attribute attribute" (20)

لقد قمت بتثبيت تطبيق ، عندما أحاول تشغيله (إنه جرة قابلة للتنفيذ) لا يحدث شيء. عندما أقوم بتشغيلها من سطر الأوامر مع:

java -jar "app.jar"

أتلقى الرسالة التالية:

لا توجد سمة مميزة في "app.jar"

عادةً ، إذا كنت قد أنشأت البرنامج بنفسي ، فقد قمت بإضافة سمة صنف رئيسي إلى ملف البيان. لكن في هذه الحالة ، بما أن الملف من تطبيق ، لا يمكنني القيام بذلك. كما أنني حاولت استخراج الجرة لمعرفة ما إذا كان بإمكاني العثور على الصف الرئيسي ، ولكن هناك العديد من الفصول الدراسية ، وليس لدى أي منهم كلمة "main" في اسمه. يجب أن يكون هناك طريقة لإصلاح هذا لأن البرنامج يعمل بشكل جيد على أنظمة أخرى.


(أول مشاركة - لذا قد لا تكون نظيفة)

هذا هو إصلاحي لنظام OS X 11.6 ، برنامج Netbeans 8.2 القائم على Maven. حتى الآن تطبيقي هو 100 ٪ Netbeans - لا التغيير والتبديل (فقط عدد قليل من قذيفة يهرب من المستحيل!).

بعد أن جربت معظم الإجابات هنا وفي أماكن أخرى دون جدوى ، عدت إلى فن "استخدم ما هو ناجح".

يبدو أن الإجابة الأعلى هنا ( thanx) هي المكان المناسب للبدء ولكن لم تساعد.

بالنظر إلى المشروعات الأخرى التي نجحت ، لاحظت بعض الاختلافات الطفيفة في الخطوط الظاهرة:

  1. addClasspath ، classpathPrefix كانت غير موجودة (تم حذفها)
  2. كان mainClass يفتقد "com". (استخدم NB -> خصائص المشروع-> Run-> Main Class-> Browse to specify)

لست متأكدا لماذا (أنا فقط 3 أشهر في جافا) أو كيف ، ولكن يمكن القول فقط هذا العمل.

هنا هو مجرد كتلة البيان المعدلة المستخدمة:

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

أتيحت لي هذه المشكلة وحلت في الآونة الأخيرة عن طريق القيام بذلك في Netbeans 8 (الرجوع إلى الصورة أدناه):

  1. اذهب إلى خصائص مشروعك.
  2. انقر على تشغيل .
  3. حدد الفئة الرئيسية لمشروعك باستخدام التصفح .
  4. بناء وتشغيل الملف جرة.

أولا ، إنه لأمر غريب ، أن أراك تقوم بتشغيل java -jar "app" وليس java -jar app.jar

ثانيًا ، لجعل الجرة قابلة للتنفيذ ... تحتاج إلى jar ملف يسمى META-INF / MANIFEST.MF

يجب أن يكون الملف نفسه (على الأقل) هذه الخطوط الملاحية المنتظمة:

Main-Class: com.mypackage.MyClass

حيث com.mypackage.MyClass هي الفئة التي تحتفظ com.mypackage.MyClass العامة (String [] args) .

لاحظ أن هناك عدة طرق لتنفيذ ذلك إما مع CLI أو Maven أو Ant:

بالنسبة لـ CLI ، سيقوم الأمر التالي بما يلي: (tks @ 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> المناسب لمشروعك.)

بالنسبة إلى Ant ، يجب أن يساعد المقتطف أدناه في:

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

قروض مايكل نيماند -


أي ملف جرة قابل للتنفيذ يجب تشغيل إما عن طريق النقر أو تشغيل باستخدام موجه الأوامر مثل java -jar app.jar (استخدم "إذا كان مسار الجرة يحتوي على مساحة" - أي java -jar "C: \ folder name \ app.jar"). إذا لم يتم تشغيل جرة قابلة للتنفيذ ، مما يعني أنه لم يتم إنشاؤه بشكل صحيح.

للحصول على فهم أفضل ، قم باستخراج ملف jar (أو عرض باستخدام أي أداة ، لأن ويندوز 7-Zip هو واحد لطيف) وتحقق من الملف تحت / META-INF/MANIFEST.MF. إذا وجدت أي إدخال مثل

الفئة الرئيسية: your.package.name.ClaaswithMain - ثم لا بأس ، وإلا عليك تقديمها.

كن على دراية بإلحاق إدخال فئة رئيسية على ملف MANIFEST.MF ، تحقق من مكان حفظه!


إذا كنت تستخدم Maven ، فقم بتضمينها في pom

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

إذا كنت تستخدم سطر الأوامر لتجميع. jar فمن الممكن للإشارة إلى الرئيسي دون إضافة ملف Manifest. مثال:

jar cfve app.jar TheNameOfClassWithMainMethod *.class

(المعلمة "e" يفعل ذلك: TheNameOfClassWithMainMethod هو اسم للفئة مع الأسلوب الرئيسي () و app.jar - اسم الملف التنفيذي القابل للتنفيذ. و * .class - فقط كل ملفات الطبقات لتجميعها)


بالنسبة إلى مخضرم ، هذا ما حَلَّه (بالنسبة لي ، للحصول على كود برنامج Vetle على GitHub):

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

في صحتك...


بالنسبة لي ، لم يساعد أي من الإجابات بالفعل - كان لدي ملف البيان في المكان الصحيح ، ويحتوي على الفئة الرئيسية وكل شيء. ما تعثرت بي كان هذا:

تحذير: يجب أن ينتهي الملف النصي الذي تقوم بإنشائه بالظهور بخط جديد أو سطر إرجاع. لن يتم تحليل السطر الأخير بشكل صحيح إذا لم ينتهي بخط جديد أو حرف إرجاع.

( source ). إضافة سطر جديد في نهاية البيان المحدد.


بدلاً من ذلك ، يمكنك استخدام maven-assembly-plugin ، كما هو موضح في المثال التالي:

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

في هذا المثال ، سيتم تضمين جميع جرار التبعية كما هو محدد في القسم تلقائيًا في وعاء واحد. لاحظ أنه يجب وضع معاملات التبعثر بصيغة حرفيًا ، لا أن يتم استبدالها بأسماء ملفات jar التي تريد تضمينها.


بما أنك قمت بإضافة 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

تحقق direcory المحلي الخاص بك .m2 لدليل فرعي من هذه الأداة. إذا exixts - حذفه ، وإجراء تحديث Maven مرة أخرى


تحقق من ملف jar الخاص بك داخل MANIFEST.MF تتوفر الفئة الرئيسية أو لا

first.java

class first
{
        public static void main (String arg[ ])
        {
           System.out.println("Welcome to the world of Java");
        }
}

قبل :

Manifest-Version: 1.0
Created-By: 1.7.0_80 (Oracle Corporation)

[email protected]:~/Documents$ java -jar first.jar
no main manifest attribute, in first.jar

بعد:

Manifest-Version: 1.0
Created-By: 1.7.0_80 (Oracle Corporation)
Main-Class: first

[email protected]:~/Documents$ java -jar first.jar 
Welcome to the world of Java

حصلت على نفس الخطأ الآن. إذا كنت تستخدم gradle ، gradle سوى إضافة التالي في gradle.build :

apply plugin: 'java'

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

حيث com.company.project.MainClass path to ur class with public static void main(String[] args) method.


ربما لم تقم بإنشاء ملف jar بشكل صحيح:

مثال: خيار مفقود m في إنشاء jar

الأعمال التالية:

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

كان عندي هذه المشكلة عند إنشاء وعاء باستخدام IntelliJ IDEA. انظر هذا النقاش .

ما حل لي بالنسبة لي هو إعادة إنشاء جرة القطع الأثرية ، واختيار JAR> من وحدات مع التبعيات ، ولكن لا تقبل الدليل الافتراضي ل META-INF / MANIFEST.MF. تغييره من - / src / main / java إلى - / src / main / resources.

خلاف ذلك كان يتضمن ملف بيان في الجرة ، ولكن ليس في - / src / main / java التي يجب أن يكون لها.


كان لي نفس القضية. عن طريق إضافة الخطوط التالية إلى ملف بوم جعلها تعمل. سيتأكد المكون الإضافي من عملية إنشاء التطبيق مع جميع الخطوات اللازمة.

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

كان لي نفس المشكلة. الكثير من الحلول المذكورة هنا لم تعطني الصورة كاملة ، لذا سأحاول أن أقدم لك ملخصًا عن كيفية حزم ملفات jar من سطر الأوامر .

  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>/ -C . <packagename>/ للحصول على ملفات الفصل من هذا المجلد ، مع الحفاظ على بنية المجلد.

    jar cvfeP test.jar testpackage.Test -C . testpackage/
    
  4. تحقق من ملف .jar الخاص بك في برنامج zip. يجب أن يكون الهيكل التالي

    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
    

كان يجب أن يكون ذلك 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 لتشغيل البرنامج. (ما يعتمد عليه هذا الفصل على البرنامج ، من المستحيل معرفة ذلك من المعلومات التي قدمتها).


وهذا لأن Java لا يمكن العثور على السمة الرئيسية في ملف MANIFEST.MF. السمة الرئيسية ضرورية لإخبار جافا التي يجب استخدامها كنقطة دخول للتطبيق. داخل ملف jar ، يوجد ملف MANIFEST.MF في مجلد META-INF. هل تتساءل كيف يمكنك النظر إلى ما يوجد داخل ملف جرة؟ افتح ملف jar باستخدام 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.


يمكنك ببساطة اتباع هذه الخطوة إنشاء ملف jar باستخدام

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

بينما تشغيل تشغيل ملف جرة بسيطة مثل هذا

 java -cp jarfile-name main-classname




main