Manifest.mf ไม่ถูกต้องใน IntelliJ IDEA ที่สร้าง. jar


102

ฉันกำลังพยายามทำแพ็กเกจโปรเจ็กต์โดยใช้ไลบรารี OptaPlanner 6.0.1 ลงใน. jar ผ่านสิ่งประดิษฐ์ jar ของ IntelliJ IDEA แต่แทนที่จะเป็น manifest.mf ของฉันที่มีมาตรฐาน

Manifest-Version: 1.0
Main-Class: a.b.c.app

โถใช้อันที่ให้มาใน ecj-3.7.2.jar ซึ่งเป็นหนึ่งในไลบรารีที่รองรับของ OptaPlanner:

Manifest-Version: 1.0
Build-Jdk: 1.6.0_26
Built-By: ibrandt
Created-By: Apache Maven
Archiver-Version: Plexus Archiver

ด้วยเหตุนี้"no main manifest attribute, in appname.jar"ข้อผิดพลาดจึงเกิดขึ้นขณะพยายามเรียกใช้แอป หากฉันแทนที่รายการในไฟล์. jar ด้วยตนเองด้วยของฉันทุกอย่างทำงานได้อย่างถูกต้อง มีอะไรที่ฉันสามารถแก้ไขได้หรือไม่?

ฉันเก็บไลบรารีไว้ในไดเร็กทอรี / lib แยกต่างหากและถูกเพิ่มลงในรูทของ jar อาร์ติแฟกต์เป็น Extracted Directory, IntelliJ IDEA คือ v13.0.1


1
คุณรู้จักเครื่องมือสร้างเช่น ant, maven หรือ gradle หรือไม่?
MariuszS

ฉันรู้เกี่ยวกับพวกเขา แต่จนถึงตอนนี้ฉันใช้เฉพาะ make และ. NET (NAnt, MSBuild) ฉันควรเลือกอันไหนหากเครื่องมือสร้างของ IntelliJ ไม่ตัดออก
grudolf

1
โหวตในการแก้ไขปัญหานี้ที่นี่ ,
bigjosh

คำตอบ:


260

ผมมีปัญหาเหมือนกัน.

ตรวจสอบให้แน่ใจว่า MANIFEST.MF ของคุณอยู่ใน:

src/main/resources/META_INF/

ไม่

src/main/java/META_INF/

20
นี่เป็นคำตอบที่ถูกต้องจริงๆดูเหมือนว่า Intellij IDEA จะใส่โฟลเดอร์ META-INF ผิดเมื่อเทมเพลตโครงการคือ Maven
Kumait

ในกรณีของฉันฉันต้องเปลี่ยนเค้าโครงของโครงการของฉัน ก่อนหน้านี้ฉันมีโปรเจ็กต์ที่มีเลย์เอาต์ maven แต่ฉันลบการสนับสนุนของ maven ฉันสร้างโครงการใหม่ตั้งแต่เริ่มต้นและตอนนี้ก็ใช้งานได้แล้ว
Maxence

1
สิ่งนี้ไม่ได้ผลสำหรับฉันฉันต้องย้ายไฟล์ Mainfest ไปที่รูทของโปรเจ็กต์
racs

maven โง่มากที่วางไฟล์นี้เป็น dir ผิดหรือเปล่า? : ^)
ดาเรีย

@ คุมะอิทปัญหายังมีอยู่ใน IntelliJ 2017.1.5 ฉันสงสัยว่าทีม JetBrain ตระหนักถึงเรื่องนี้หรือไม่
fruqi

12

เพื่อแก้ไข:

  1. ไฟล์> โครงสร้างโครงการ
  2. ภายใต้การตั้งค่าโครงการทางด้านซ้ายเลือก "สิ่งประดิษฐ์"
  3. ค้นหานิยาม JAR ในบานหน้าต่างตรงกลางและเลือก
  4. ในบานหน้าต่างด้านซ้ายของแท็บ "เค้าโครงเอาต์พุต" ให้ค้นหาไฟล์ jar ในรายการและเลือก
  5. ที่ด้านล่างให้คลิกปุ่ม "ใช้ไฟล์ Manifest ที่มีอยู่" และเลือกไฟล์รายการที่อยู่ในแหล่งที่มาของโปรเจ็กต์ของคุณ
  6. คลิกตกลงและรันบิลด์

3
ไม่มีปุ่ม "ใช้ไฟล์ Manifest ที่มีอยู่" อย่างไรก็ตามไฟล์ Manifest ในเค้าโครงเอาต์พุตจะชี้ไปยังตำแหน่งที่ถูกต้อง (... \ src \ main \ java \ META-INF \ MANIFEST.MF)
grudolf

5
ตกลงต้องลบสิ่งประดิษฐ์ jar และสร้างขึ้นใหม่คราวนี้เป็น "Empty" แทน "จากโมดูลที่มีการอ้างอิง" มีปุ่ม "Create Manifest" และ "Use Existing Manifest" ชี้ไปที่ไลบรารีไฟล์ Manifest และที่อ่านแล้วและคอมไพล์เอาต์พุต มีความแตกต่างสองประการจากก่อนหน้านี้: ขณะนี้ META_INF \ MANIFEST.INF รวมอยู่ในโครงร่างเอาต์พุตอย่างชัดเจนและดูเหมือนว่าไฟล์ jar จะถูกสร้างขึ้นอย่างถูกต้อง :)
grudolf

สิ่งนี้ไม่ช่วยแก้ปัญหาอย่างน้อยสำหรับฉัน อย่างไรก็ตามคำตอบของ jamahn ได้ผล
Andrew Breksa

ความคิดเห็นที่เพิ่มเข้ามาจากผู้ใช้ที่มีตัวแทนต่ำ @ ds-Justice ดังต่อไปนี้ - ความคิดเห็นของ @ grudolf ด้านบนเกี่ยวกับการสร้าง Jar ที่ว่างเปล่าเป็นสิ่งเดียวที่ใช้ได้ผลสำหรับฉันหลังจากหลายชั่วโมงของการต่อสู้กับโครงการ Gradle ที่นำเข้า นี่เป็นคำถามที่สำคัญโปรดพิจารณาการโพสต์ความคิดเห็นของคุณใหม่เป็นคำตอบแยกต่างหาก
Shawn Mehan

10

ดังที่ระบุไว้ในความคิดเห็นของ @ grudolf ในหนึ่งในคำตอบอื่น ๆ วิธีหนึ่งในการทำเช่นนี้ (และวิธีเดียวที่เหมาะกับฉันในโครงการ Gradle ที่นำเข้า) คือการสร้างขวดเปล่าดังนี้:

  • โครงสร้างโครงการ -> สิ่งประดิษฐ์ -> + โถ -> ว่างเปล่า
  • ตอนนี้บานหน้าต่างตรงกลางมีปุ่ม Create Manifest และ Use Existing Manifest ใช้อย่างใดอย่างหนึ่งเหล่านี้
  • ฉันมีปัญหาถ้าฉันแยกไลบรารีที่ขึ้นต่อกันด้วยรายการของตัวเองลงในรูทเอาต์พุตดูเหมือนว่าจะเขียนทับไฟล์ Manifest ใหม่ที่สร้างขึ้นด้วยตนเองเป็นระยะ ๆ การยุ่งกับคำสั่งของการดำเนินการดูเหมือนจะทำให้ได้ผล

อัพเดท:

นี่เป็นข้อบกพร่องใน Idea อย่างแน่นอน คำตอบที่เชื่อมโยงนี้ทำงานได้อย่างน่าเชื่อถือเมื่อมีไดเร็กทอรีที่แยกออกมา โดยพื้นฐานแล้วคุณจะพบ .idea / JARNAME.xml ของคุณเพิ่มองค์ประกอบต่อไปนี้ที่ด้านบนสุดของ<root>องค์ประกอบสำหรับโถของคุณ องค์ประกอบใด ๆ ที่แยกออกมาเหนือสำเนาไฟล์ใหม่ของคุณที่มีไฟล์ Manifest จะบดบังไฟล์ Manifest ใหม่ของคุณ

  <element id="directory" name="/META-INF">
    <element id="file-copy" path="$PROJECT_DIR$/modulename/src/META-INF/MANIFEST.MF" />
  </element>

7

หากคุณต้องการระบุ Main Class คุณต้องเพิ่มปลั๊กอินนี้ใน pom.xml:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>Form</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

1

ฉันมีปัญหาที่คล้ายกัน

ปัญหาอยู่ในไฟล์ pom.xml

<archive>
  <manifestEntries>
    <Dependencies>one.jar,
                  two.rar, 
                  other.jar
    </Dependencies>
  </manifestEntries>
</archive>

ฉันไม่รู้ว่ารหัสนี้ทำงานในคราสด้วยเหตุผลใด แต่ไม่ใช่ใน IntelliJ

นี่มันถูกต้อง

<archive>
  <manifestEntries>
    <Dependencies>one.jar, two.rar, other.jar</Dependencies>
  </manifestEntries>
</archive>

Manifest.mf ทำงาน !!!

ฉันหวังว่านี่จะช่วยได้.


ฉันมีสถานการณ์ที่แน่นอนนี้และได้ข้อสรุปเช่นเดียวกับที่คุณทำ: บรรทัดใหม่ระหว่างรายการ <Dependencies> ทำงานใน Eclipse แต่ไม่ใช่ใน Intellij IDEA
Arion Krause

0

มีหลายวิธีในการสร้างขวดปฏิบัติการ การใช้ฟีเจอร์ GUI ของ IntelliJ เป็นวิธีที่ดีวิธีหนึ่ง อีกวิธีหนึ่งคือการใช้Maven (หรือในทำนองเดียวกันใน gradle, buildr ฯลฯ ) ซึ่งเป็นมิตรกับบิลด์เซิร์ฟเวอร์:

สามารถคัดลอกวางได้มากหรือน้อยจากตัวอย่างของ optaplanner maven build:

  1. ขวดของผู้ใช้ปลายทาง (optaplanner-ตัวอย่าง -. * ขวด) จะต้องรวมถึง classpath dependencies มันในที่ประจักษ์ของมัน
  2. จากนั้นสคริปต์ sh และ batจะต้องเรียกใช้ jar นั้นด้วยตามนั้น

0

เพื่อให้ไม่มีปัญหาเหมือน Manifest คุณควรมีไดเร็กทอรีชื่อ "META-INF" ในไดเร็กทอรี "src" สร้างมันขึ้นมาและใส่ไฟล์ชื่อ "MANIFEST.MF" ไว้ในนั้นโดยมีเนื้อหาดังนี้:

Manifest-Version: 1.0
Main-Class: <packageName>.Main

อย่าลืมเปลี่ยนชื่อแพ็กเกจที่มีคลาสหลักอยู่ด้านบน!


4
บันทึกแสดงว่าฉันตัดแต่งเนื้อหาทางศาสนาจากโพสต์ของคุณในเดือนสิงหาคม โปรดทราบว่าชุมชนได้หารือเกี่ยวกับการเพิ่มหัวข้อทางศาสนาลงในโพสต์และคำตอบก็คือเราอยากให้พวกเขาถูกละทิ้ง คุณสามารถเพิ่มลงในโปรไฟล์หรือรูปประจำตัวของคุณได้มากที่สุด
แขวน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.