ไม่สามารถเรียกใช้ไฟล์ jar-:“ ไม่มีแอตทริบิวต์รายการหลัก”


970

ฉันติดตั้งแอปพลิเคชั่นแล้วเมื่อฉันพยายามเรียกใช้ (มันเป็นขวดปฏิบัติการ) ไม่มีอะไรเกิดขึ้น เมื่อฉันเรียกใช้จาก commandline ด้วย:

java -jar "app.jar"

ฉันได้รับข้อความต่อไปนี้:

ไม่มีแอตทริบิวต์รายการหลักใน "app.jar"

โดยปกติถ้าฉันสร้างโปรแกรมด้วยตัวเองฉันจะเพิ่มคุณสมบัติคลาสหลักลงในไฟล์ Manifest แต่ในกรณีนี้เนื่องจากไฟล์มาจากแอปพลิเคชันฉันจึงไม่สามารถทำได้ ฉันยังลองแยก jar เพื่อดูว่าฉันสามารถหาคลาสหลักได้หรือไม่ แต่มีหลายคลาสและไม่มีชื่อใดในนั้นที่มีคำว่า "main" ต้องมีวิธีในการแก้ไขปัญหานี้เนื่องจากโปรแกรมทำงานได้ดีบนระบบอื่น


มองหาวิธีการหลัก คุณไม่สามารถพึ่งพาชื่อคลาสได้
Dave Newton เมื่อ

2
ฉันรู้ แต่เนื่องจากฉันมีไฟล์. class เท่านั้นฉันจึงไม่เห็นวิธีการจริงๆ หรือฉัน
Ewoud

คุณไม่ได้พิมพ์คำพูดจริงๆใช่ไหม? ในกรณีใด ๆ javapมีหลายวิธีที่จะเห็นวิธีการรวมถึงการใช้ คุณอาจต้องการที่จะถอดออกจากขวดและดูว่าไม่มีรายการใด ๆ ออกมาหรือไม่
Dave Newton เมื่อ

ที่เกี่ยวข้อง: with dependencies: stackoverflow.com/a/23986765/360211
weston

ถ้าฉันไม่มีคลาสหลักเพราะฉันใช้งานรหัสโดยใช้ CommandLineJobRunner
Kamini

คำตอบ:


946

ก่อนอื่นมันแปลกดีที่เห็นคุณวิ่งหนีjava -jar "app"และไม่java -jar app.jar

ประการที่สองเพื่อให้ jar ปฏิบัติการ ... คุณต้อง jar ไฟล์ชื่อ META-INF / MANIFEST.MF

ไฟล์ควรมี (อย่างน้อย) หนึ่งซับนี้:

Main-Class: com.mypackage.MyClass

ในกรณีที่com.mypackage.MyClassเป็นชั้นที่ถือmain (String args []) ประชาชนเป็นโมฆะคงจุดเริ่มต้น

โปรดทราบว่ามีหลายวิธีในการทำสิ่งนี้ให้สำเร็จด้วย CLI, Maven, Ant หรือ Gradle:

สำหรับ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>

เครดิต Michael Niemand -

สำหรับGradle :

plugins {
    id 'java'
}

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

15
ใน Ant <manifest> <attribute name = "Main-Class" value = "com.mypackage.MyClass" /> </manifest> ภายในองค์ประกอบ <jar>
Michael Niemand

1
ขอบคุณ. แค่อยากจะเพิ่มที่คุณสามารถคัดลอกไปอ้างอิง lib โฟลเดอร์โดยใช้นี้: stackoverflow.com/a/996915/1121497 เนื่องจาก classpath มีlibโฟลเดอร์นั้นคุณจะต้องใช้งาน jar ด้วยjava -jar myproject.jarและมันจะค้นหาการพึ่งพา
Ferran Maylinch

4
จะ "ไห้ไฟล์ชื่อ META-INF / MANIFEST.MF" ได้อย่างไร? ฉันมี. jar บนมือข้างหนึ่งและ. M.F ในอีกด้านหนึ่งฉันจะเชื่อมโยงพวกเขาเข้าด้วยกันได้อย่างไร ฉันใส่ไฟล์ Manifest ไว้ในโฟลเดอร์เดียวกับ. jar แต่มันใช้งานไม่ได้ฉันยังเจอปัญหาอยู่!
Wicelo

4
@Wicelo หากต้องการระบุไฟล์ MANIFEST.MF เฉพาะขณะที่สร้างไฟล์ jar ให้ใช้แฟล็กmสำหรับ jar เช่น. jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
dvvrt

1
หมายเหตุ: สำหรับ Maven ฉันมีmaven-jar-pluginรายการอยู่ในไฟล์ Maven ที่สร้างโดย VSC แล้วดังนั้นฉันจึงเพิ่งเพิ่ม<configuration>ส่วนเข้าไป
Aaron Franke

279

ที่ควรจะได้รับแทนjava -jar app.jarjava -jar "app"

-jarตัวเลือกที่ทำงานได้เฉพาะในกรณีที่ไฟล์ JAR เป็นไฟล์ JAR ปฏิบัติการซึ่งหมายความว่ามันจะต้องมีไฟล์ Manifest มีMain-Classแอตทริบิวต์ในนั้น ดูที่โปรแกรมโปรแกรมในไฟล์ JARเพื่อเรียนรู้วิธีสร้าง JAR ที่ทำงานได้

หากไม่ใช่ JAR ที่รันได้คุณจะต้องเรียกใช้โปรแกรมด้วยสิ่งต่อไปนี้:

java -cp app.jar com.somepackage.SomeClass

โดยที่com.somepackage.SomeClassเป็นคลาสที่มีmainวิธีการเรียกใช้โปรแกรม (คลาสนั้นขึ้นอยู่กับโปรแกรมเป็นไปไม่ได้ที่จะบอกจากข้อมูลที่คุณให้มา)


3
ขอบคุณสำหรับการตอบกลับของคุณ แต่วิธีการแก้ปัญหาของคุณใช้งานได้เฉพาะถ้าฉันรู้ชื่อของชั้นเรียนที่มีวิธีการหลัก และมันก็เป็นตัวพิมพ์ผิด ... มันควรจะเป็น "app.jar" แต่คุณจะอธิบายได้อย่างไรว่าทำไมมันถึงทำงานบนระบบอื่นโดยเพียงแค่ดับเบิลคลิกไฟล์?
Ewoud

หากเป็น JAR ที่สามารถเรียกใช้งานได้จริงคุณสามารถแตกไฟล์ Manifest (อยู่ในMETA-INFไดเรกทอรีภายในไฟล์ JAR) มันควรมีMain-Classแอตทริบิวต์ที่ให้ชื่อของคลาสหลัก
Jesper

ถ้ามันไม่ทำงานในระบบเดียวระบบนั้นอาจมี Java เวอร์ชันเก่าเกินไป หาก JAR เป็นตัวอย่างที่คอมไพล์ด้วย Java 7 แสดงว่าคุณไม่สามารถรันบนระบบที่มี Java 6 ขึ้นไป
Jesper

มันตลกเพราะระบบอื่นกำลังใช้งาน win7 และพีซีเครื่องนี้ที่มีปัญหารัน win8
Ewoud

2
@Jesper สวัสดีจะเกิดอะไรขึ้นหาก eclipse ใช้แพ็คเกจเริ่มต้น ฉันเพิ่งใส่ชื่อชั้นเรียนหรือไม่
Ogen

127

อีกทางหนึ่งคุณสามารถใช้ 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-with-dependencies ควรถูกวางอย่างแท้จริงไม่ควรแทนที่ด้วยชื่อไฟล์ jar ที่คุณต้องการรวม


3
สมบูรณ์แบบใช้งานได้ มันรวมการพึ่งพาทั้งหมดไว้ในขวดเดียวจึงช่วยให้คุณสามารถรวบรวม / สร้างโครงการและเรียกใช้มันออกมาจากกล่อง
Paul

2
ในบริบทของปลั๊กอินที่ร่มเงาหนึ่งต้องทำตามความช่วยเหลือที่JARดำเนินการ
koppor

3
สิ่งนี้กับการmaven-assembly-pluginทำงาน maven-jar-pluginไม่ได้.
Martynas Jusevičius

หมายเหตุ: ใส่รหัสนี้ลงในpom.xmlไฟล์ของคุณ<build><plugins> PUT IT HERE </plugins></build>จากนั้นเรียกใช้ maven Package (ในเมนูเลื่อนของ IDEA ที่เปิดอยู่ทางด้านขวาให้มองหาโครงการ> ระยะเวลา> แพคเกจ) จากนั้นไฟล์ jar ของคุณจะอยู่ในโฟลเดอร์ Target ไชโย!
คิริลล์คาร์มาซิน

ฉันกำลังดิ้นรนกับปัญหานี้จริงๆ ... มันทำงานได้อย่างสมบูรณ์แบบ ขอบคุณ!
jmojico

60

นั่นเป็นเพราะ Java ไม่พบคุณลักษณะหลักในไฟล์ MANIFEST.MF แอ็ตทริบิวต์ Main เป็นสิ่งจำเป็นในการบอก java ว่าควรใช้คลาสใดเป็นจุดเข้าใช้งานของแอปพลิเคชัน ภายในไฟล์ jar ไฟล์ MANIFEST.MF จะอยู่ในโฟลเดอร์ META-INF สงสัยว่าคุณจะดูสิ่งที่อยู่ในไฟล์ jar ได้อย่างไร เปิดไฟล์ jar ด้วย WinRAR

แอตทริบิวต์หลักภายใน MANIFEST.MF มีลักษณะดังนี้:

Main-Class: <packagename>.<classname>

คุณจะได้รับข้อผิดพลาด "ไม่มีแอตทริบิวต์รายการหลัก" นี้เมื่อบรรทัดนี้หายไปจากไฟล์ MANIFEST.MF

เป็นเรื่องใหญ่มากที่จะระบุแอตทริบิวต์นี้ในไฟล์ MANIFEST.MF

อัปเดต: ฉันเพิ่งค้นพบวิธีที่เป็นระเบียบในการระบุจุดเข้าใช้งานของแอปพลิเคชันใน eclipse เมื่อคุณพูดว่าส่งออก

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> <artifactId> spring-boot-maven-plugin </artifactId> <version> 2.0.1.RELEASE < / version> </plugin>
Tenflex

ขออภัย แต่มันก็ไม่ได้แก้ปัญหาเพราะเขาไม่ได้พูดคุยเกี่ยวกับฤดูใบไม้ผลิบูตมันเป็นปัญหาทั่วไปกับการดำเนินขวด :)
LAMRIN TAWSRAS

ขอบคุณมากมันช่วยแก้ปัญหาสำหรับการบูทสปริง!
AleksandarT

ฉันกำลังทำงานกับ spring boot 2.2.0.Release น่าเสียดายที่โซลูชันนี้ใช้ไม่ได้สำหรับฉัน อย่างไรก็ตามมันจะทำงานเมื่อคุณอ้างอิงจาก<parent>...</parent>แอปพลิเคชันใน pom.xml ฉันเดาว่าถ้าเราไปที่parentpom.xml ของแอปพลิเคชันเราจะได้แนวคิดที่ชัดเจน
tusar

repackage-classifierในที่สุดผมก็แก้ไขปัญหาของฉันกับที่กำหนดเอง กรุณาเยี่ยมชมdocs.spring.io/spring-boot/docs/2.2.0.RELEASE/maven-plugin/…
tusar

30

คำตอบ Gradle คือการเพิ่มการตั้งค่า jar / manifest / attributes เช่นนี้

apply plugin: 'java'

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

1
คำตอบที่ง่ายที่สุดป่านนี้
lasec0203

29

ฉันมีปัญหานี้เมื่อสร้างขวดโดยใช้ IntelliJ IDEA ดูการสนทนานี้

สิ่งที่แก้ไขได้สำหรับฉันคือการสร้างสิ่งประดิษฐ์ jar ใหม่เลือก JAR> จากโมดูลที่มีการพึ่งพา แต่ไม่ยอมรับไดเรกทอรีเริ่มต้นสำหรับ META-INF / MANIFEST.MF เปลี่ยนจาก - / src / main / java เป็น - / src / main / resources

มิฉะนั้นจะรวมไฟล์รายการใน jar แต่ไม่ใช่ไฟล์ใน - / src / main / java ที่ควรมี


สิ่งนี้ใช้ได้กับฉันด้วย IDEA 14.1.6 ฉันยังเพิ่มคุณสมบัติการสร้างสำหรับ pom.xml แต่มันไม่มีผลกระทบ แต่คำตอบของคุณแก้ไขได้แล้วขอบคุณ
lsrom

3
ขอบคุณสำหรับการบันทึกเดสก์ท็อปของฉันจากการถูกเว้าแหว่งด้วยความหงุดหงิดอย่างแท้จริงจากการทำงานอย่างอื่น) ลิงก์ของคุณดูเสีย ทดสอบกับ IntelliJ IDEA 2018.2.5 (Community Edition)
Matthias Bö

ยืนยันว่าใช้งานได้แม้ว่าฉันไม่มีไดเรกทอรี / resources
lxknvlk

28

สำหรับ maven นี่คือสิ่งที่แก้ไขได้ (สำหรับฉันสำหรับ Veetle codebase บน 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>

ไชโย ...


ฉันพบสิ่งนี้ใช้งานได้ แต่ฉันต้องดำเนินการเพราะการmvn package shade:shadeทำงานเพียงอย่างmvn packageเดียวไม่ทำให้ปลั๊กอินที่ร่มทำงาน
Raystorm

24

ลองคำสั่งนี้เพื่อรวมไห:

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

1
วิธีหนึ่งคือการรวมคลาสหลักใน pom.xml และใช้คำสั่ง java -jar อีกวิธีหนึ่งคือการใช้คำสั่ง java -cp
Gaurav Khare

15

สำหรับฉันไม่มีคำตอบที่ช่วยได้จริง ๆ - ฉันมีไฟล์รายการที่ถูกต้องซึ่งมี Main-Class และทุกอย่าง สิ่งที่ทำให้ฉันสะดุดคือ:

คำเตือน: ไฟล์ข้อความที่คุณกำลังสร้างรายการจะต้องลงท้ายด้วยบรรทัดใหม่หรือการขึ้นบรรทัดใหม่ บรรทัดสุดท้ายจะไม่ถูกวิเคราะห์คำอย่างถูกต้องหากบรรทัดนั้นไม่ได้จบด้วยบรรทัดใหม่หรือการขึ้นบรรทัดใหม่

( แหล่งที่มา ) การเพิ่มบรรทัดใหม่ที่ท้ายรายการจะแก้ไข


11

หากใช้ 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>

3
ใครบอกว่านี่เป็นโครงการสปริงบูต
james.garriss

2
@ james.garriss ดีฉันจะบอกว่าฉันมาที่โพสต์นี้เพื่อค้นหาno main manifest attributeข้อผิดพลาด แต่ฉันกำลังทำงานกับแอพพลิเคชั่นสปริงบูตดังนั้นคำตอบนี้ช่วยฉัน ฉันรู้วิธีสร้างMETA-INF/MANIFEST.MFไฟล์แล้ว แต่ไม่ใช่วิธีที่จะทำให้ spring-boot จัดการไฟล์โดยอัตโนมัติ
Vishrant

5
ฉันไม่เห็นเหตุผลใด ๆ สำหรับ downvoting คำตอบนี้ หากคุณไม่ได้ใช้spring-bootก็แค่เพิกเฉย Stackoverflow ยังช่วยในการสร้างที่เก็บปัญหาของคุณเองซึ่งคุณเผชิญในขณะที่เขียนโปรแกรม
Vishrant

@Vishrant ฉันไม่รู้เกี่ยวกับคนอื่น แต่ฉัน downvoted เพราะคำตอบนี้ไม่ได้ตอบคำถามตามที่โพสต์ไว้ อาจเกิดขึ้นเพียงเพื่อตอบคำถามของคุณ แต่คำถามของคุณไม่ใช่สิ่งที่ถูกถามจริงๆ
สารพิษ

@ ได้รับแน่นอน แต่คำถามสามารถนำไปใช้ได้อย่างกว้างขวางและคำตอบนี้ใช้ได้กับมันและสามารถช่วยเหลือผู้อื่นในแง่ที่ว่าพวกเขาจะใช้สปริงบูท
Vishrant

10

ฉันมีปัญหาเดียวกันวันนี้ ปัญหาของฉันได้รับการแก้ไขแล้วการย้าย META-INF ไปยังโฟลเดอร์ทรัพยากร


มันก็ใช้ได้กับฉันเช่นกัน ลองใช้ถ้าคุณกำลังใช้ Jetbrains IntelliJ
NickSoft

ขอบคุณที่ใช้งานได้ดีสำหรับฉัน :)
Syed Mehtab Hassan

สิ่งนี้ได้ผลกับฉันเช่นกันในระบบ Intellij ขอบคุณชาย
Waqas

10

ฉันได้รับข้อผิดพลาดเดียวกันตอนนี้ หากคุณกำลังใช้gradleอยู่ให้เพิ่มอันถัดไปใน ur gradle.build:

apply plugin: 'java'

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

โดยที่com.company.project.MainClasspath ไปยังคลาส ur ด้วยpublic static void main(String[] args)เมธอด


สิ่งนี้ช่วยฉัน! บทเรียน gradle ได้ระบุไว้โดยใช้mainClassNameชุดตัวแปรระดับบนสุดแต่สิ่งนี้ช่วยได้เฉพาะกับgradle runคำสั่งเท่านั้นไม่ใช่การสร้างไฟล์ปฏิบัติการ. jar
kevlarr

8

ปัญหา MAVEN คือการพยายามรวมไฟล์ MANIFEST.MF ไฟล์แรกจากไลบรารี่แรกจากการอ้างอิงแทน MANIFEST.MF ของเราเองเมื่อคุณใช้ ARTIFACTS! .

  1. เปลี่ยนชื่อ yourjar.jar เป็น yourjar.zip
  2. เปิดไฟล์ MANIFEST.MF จาก META-INF \ MANIFEST.MF
  3. คัดลอก MANIFEST.MF จริงที่สร้างไว้แล้วในโครงการของคุณโดย MAVEN ซึ่งรวมถึงสิ่งที่คล้ายกัน:

    Manifest-Version: 1.0 Main-Class: 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>

แต่ถ้าคุณใช้พาเนล maven (หรือบรรทัดคำสั่ง maven) คุณสามารถบังคับให้สร้างรายการของตัวเองและรวมไว้ในไฟล์ JAR

  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 ที่มีการอ้างอิงทั้งหมดลงในโฟลเดอร์ "เป้าหมาย" นอกจากนี้มันจะถูกติดตั้งในที่เก็บ maven โลคัล



5

ฉันประสบปัญหาเดียวกันและได้รับการแก้ไขแล้วในตอนนี้ :) เพียงทำตามขั้นตอนด้านล่างและข้อผิดพลาดอาจเป็นอะไรก็ได้ แต่ขั้นตอนด้านล่างทำให้กระบวนการราบรื่นขึ้น ฉันใช้เวลามากมายในการค้นหาวิธีแก้ไข

1. ลองรีสตาร์ท Eclipse (หากคุณใช้ Eclipse เพื่อสร้างไฟล์ JAR) -> ที่จริงแล้วสิ่งนี้ช่วยให้ปัญหาของฉันในการส่งออกไฟล์ JAR อย่างถูกต้อง

2. หลังจาก eclipse รีสตาร์ทแล้วลองดูว่า eclipse ของคุณสามารถจดจำคลาส / เมธอดหลักโดยโปรเจ็กต์ Java ของคุณ -> คลิกขวา -> รันเป็น -> รันคอนฟิกูเรชัน -> รันคอนฟิกูเรชัน -> Main -> คลิกปุ่มค้นหา เพื่อดูว่า eclipse ของคุณสามารถค้นหาคลาสหลักของคุณในไฟล์ JAR ได้หรือไม่ -> นี้ใช้สำหรับการตรวจสอบความถูกต้องของไฟล์ JAR ว่าจะมีจุดเริ่มต้นที่คลาสหลัก

  1. หลังจากนี้ให้เอ็กซ์พอร์ตโปรเจ็กต์ Java Dynamic ของคุณเป็นไฟล์ "Runnable JAR" และไม่ใช่ไฟล์ JAR

  2. ในการกำหนดค่าการเรียกใช้ Java เลือกคลาสหลักของคุณ

  3. เมื่อส่งออกไฟล์ jar ให้ใช้คำสั่งด้านล่างเพื่อดำเนินการ java -cp [JAR ของคุณ] .jar [แพ็คเกจที่สมบูรณ์] .MainClass เช่น: java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit

  4. คุณอาจประสบกับข้อผิดพลาดของเวอร์ชัน Java ที่ไม่รองรับ การแก้ไขคือการเปลี่ยน java_home ในโปรไฟล์ shell bash ของคุณเพื่อให้ตรงกับรุ่น java ที่ใช้ในการรวบรวมโครงการใน eclipse

หวังว่านี่จะช่วยได้! กรุณาแจ้งให้เราทราบหากคุณยังคงมีปัญหาใด ๆ


5

ผมมีปัญหาเดียวกัน. จำนวนมากของการแก้ปัญหาที่กล่าวถึงที่นี่ไม่ให้ฉันภาพรวมดังนั้นฉันจะพยายามที่จะให้ข้อมูลสรุปของวิธีการแพ็คไฟล์ jar จากบรรทัดคำสั่ง

  1. หากคุณต้องการที่จะมีคุณไฟล์ในแพคเกจเพิ่มแพคเกจในการเริ่มต้นของ.class.java

    Test.java

    package testpackage;
    
    public class Test
    {
        ...
    }
  2. ในการรวบรวมรหัสของคุณกับ.classไฟล์ที่ลงท้ายด้วยโครงสร้างที่กำหนดโดยชื่อแพ็คเกจให้ใช้:

    javac -d . Test.java

    -d .ทำให้คอมไพเลอร์สร้างโครงสร้างไดเรกทอรีที่คุณต้องการ

  3. เมื่อทำแพ็กเกจ.jarไฟล์คุณจะต้องสั่งรูทีน jar ในวิธีแพ็คไฟล์ cvfePที่นี่เราใช้ตั้งค่าตัวเลือก นี่คือการรักษาโครงสร้างแพคเกจ (ตัวเลือกP) ระบุจุดเริ่มต้นเพื่อให้ไฟล์รายการมีข้อมูลที่มีความหมาย (ตัวเลือกe) ตัวเลือกfให้คุณระบุชื่อไฟล์ตัวเลือกcสร้างไฟล์เก็บถาวรและตัวvเลือกตั้งค่าเอาต์พุตเป็น verbose สิ่งสำคัญที่ควรทราบที่นี่Pและeและ

    ถ้าอย่างนั้นชื่อของขวดที่เราต้องการมา test.jarมา

    จากนั้นมาถึงจุดเริ่มต้น

    และจากนั้นมา-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

    หากคุณแก้ไขไฟล์ Manifest ด้วยตนเองให้แน่ใจว่าได้ขึ้นบรรทัดใหม่ในตอนท้ายมิฉะนั้น java จะไม่รู้จัก

  5. ดำเนินการ.jarไฟล์ของคุณด้วย

    java -jar test.jar

1
ขั้นตอนที่ 4 ของคำตอบของคุณสำคัญมาก! รายการของฉันไม่ทำงานเนื่องจากขึ้นบรรทัดใหม่ในตอนท้ายฉันไม่รู้ว่าต้องใส่ คำตอบทั้งหมดที่ฉันเข้าชมในหัวข้อนี้ (มาก) ไม่ได้พูดถึงเรื่องนี้และเป็นข้อบังคับสำหรับทุกคนที่ไม่ได้ใช้ Maven, Ant, Gradle และอื่น ๆ
ม้อด

1
@Maude ขอบคุณสำหรับข้อเสนอแนะ นั่นเป็นเหตุผลที่แม่นยำผมเพิ่มคำตอบที่มีคำใบ้ขึ้นบรรทัดใหม่ในตัวหนา ฉันค้นหาหลายวันจนกระทั่งฉันพบสิ่งนี้โดยเปรียบเทียบกับรายการที่สร้างขึ้นอัตโนมัติ
CodeMonkey

ฮะขอบคุณ ฉันเพิ่งต่อสู้กับสิ่งที่ขึ้นบรรทัดใหม่
Richard Thomas

5

โดยส่วนตัวฉันคิดว่าคำตอบทั้งหมดที่นี่มีความเข้าใจผิดในคำถาม คำตอบของเรื่องนี้อยู่ที่ความแตกต่างของการที่ spring-boot สร้าง. jar ทุกคนรู้ว่า Spring Boot ตั้งค่ารายการเช่นนี้ซึ่งแตกต่างจากทุกคนสันนิษฐานว่านี่คือการเปิดตัว. 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.JarLauncherclasspath หรือไม่


ฟังดูมีแนวโน้ม คุณเพิ่ม JarLauncher ใน classpath ได้อย่างไร?
MarkHu

4

ไฟล์ jar ที่สามารถเรียกใช้งานได้ควรรันโดยคลิกหรือเรียกใช้โดยใช้ command prompt เช่น java -jar app.jar (ใช้ "ถ้าพา ธ ของ jar มีช่องว่าง" - เช่น java -jar "C: \ folder name \ app.jar") หาก jar ที่สามารถใช้งานได้ของคุณไม่ทำงานซึ่งหมายความว่ามันสร้างไม่ถูกต้อง

เพื่อความเข้าใจที่ดีขึ้นให้แตกไฟล์ jar (หรือดูโดยใช้เครื่องมือใด ๆ สำหรับ windows 7-Zip เป็นไฟล์ที่ดี) และตรวจสอบไฟล์ภายใต้ /META-INF/MANIFEST.MF หากคุณพบรายการใด ๆ เช่น

ชั้นหลัก: your.package.name.ClaaswithMain - แล้วก็ไม่เป็นไรมิฉะนั้นคุณต้องจัดเตรียมให้

ระวังการต่อท้ายรายการ Main-Class ในไฟล์ MANIFEST.MF ตรวจสอบตำแหน่งที่คุณบันทึกไว้!


4

คุณสามารถทำตามขั้นตอนนี้เพียงสร้างไฟล์ jar โดยใช้

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

ในขณะที่เรียกใช้ไฟล์ jar ทำงานอย่างง่ายเช่นนี้

 java -cp jarfile-name main-classname

4

คุณอาจสร้างไฟล์ jar ไม่ถูกต้อง:

เช่นตัวเลือก m หายไปในการสร้างขวด

ผลงานดังต่อไปนี้:

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

4

หากคุณกำลังใช้บรรทัดคำสั่งเพื่อรวบรวม. jar มันเป็นไปได้ที่จะชี้ไปที่หน้าหลักโดยไม่ต้องเพิ่มไฟล์มานิเฟสต์ ตัวอย่าง:

jar cfve app.jar TheNameOfClassWithMainMethod *.class

(param "e" ทำเช่นนั้น: TheNameOfClassWithMainMethod เป็นชื่อของคลาสที่มีเมธอด main () และ app.jar - ชื่อของ executable .jar และ * .class - ไฟล์คลาสทั้งหมดที่ต้องการรวบรวม)


3

สำหรับฉันข้อผิดพลาดนี้เกิดขึ้นเพียงเพราะฉันลืมบอก Eclipse ว่าฉันต้องการไฟล์ jar ที่รันได้และไม่ใช่ไฟล์ jar ไลบรารีอย่างง่าย ดังนั้นเมื่อคุณสร้างไฟล์ jar ใน Eclipse ตรวจสอบให้แน่ใจว่าคุณคลิกปุ่มตัวเลือกที่ถูกต้อง


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 มีคลาสหลักที่จะเรียกใช้ ฉันไม่แน่ใจ 100% ถ้าคุณสามารถสมมติชั้นเรียนที่คุณต้องการเป็นคนแรกเสมอ แต่สำหรับฉัน หากไม่เป็นเช่นนั้นฉันคิดว่าไม่ยากเกินไปที่จะใช้ 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

(โพสต์แรก - ดังนั้นจึงอาจไม่สะอาด)

นี่คือการแก้ไขของฉันสำหรับโปรแกรม OS X 11.6, Netbeans-based Maven ถึงตอนนี้แอพของฉันคือ Netbeans 100% - ไม่มีการปรับแต่ง (เพียงไม่กี่เชลล์ที่จะหนีไปไม่ได้!)

หลังจากที่ได้ลองคำตอบทั้งหมดที่นี่และที่อื่น ๆ เพื่อหาประโยชน์ฉันกลับสู่ศิลปะของ "ใช้สิ่งที่ได้ผล"

คำตอบยอดนิยมที่นี่ ( olivier-refalo thanx) ดูเหมือนว่าสถานที่ที่เหมาะสมในการเริ่มต้น แต่ไม่ได้ช่วย

เมื่อดูโครงการอื่น ๆ ที่ใช้งานได้ฉันสังเกตเห็นความแตกต่างเล็กน้อยบางประการในรายการ:

  1. addClasspath, classpathPrefix ขาดไป (ลบออก)
  2. mainClass ไม่มีคำว่า "com" (ใช้ NB -> คุณสมบัติโครงการ -> Run-> Main Class-> เรียกดูเพื่อระบุ)

ไม่แน่ใจว่าทำไม (ฉันแค่ 3 เดือนสู่จาวา) หรืออย่างไร แต่พูดได้แค่นี้เท่านั้น

นี่เป็นเพียงแค่บล็อกการแก้ไขที่ใช้:

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

2

ฉันพบทางออกใหม่ในการสร้างรายการที่ไม่ดี!

  1. เปิดไฟล์ jar ด้วยตัวแก้ไข zip เช่น WinRAR
  2. คลิกที่สำหรับ META-INF

  3. เพิ่มหรือแก้ไข

    • เพิ่ม:

      • สร้างไฟล์ข้อความชื่อ MANIFEST.MF ในโฟลเดอร์ชื่อ META-INF และเพิ่มบรรทัดต่อไปนี้:

        • Manifest-Version: 1.0
        • ชั้นหลัก: package.ex.com.views.mainClassName
      • บันทึกไฟล์และเพิ่มลงในไฟล์ zip

    • แก้ไข:

      • ลากไฟล์ออกแก้ไข MANIFEST.MF เพื่อเพิ่มบรรทัดก่อนหน้า
  4. เปิด cmd และพิมพ์: java -jar c: /path/JarName.jar

มันควรจะทำงานได้ดีในขณะนี้!


2

วิธีแก้ปัญหาส่วนใหญ่ไม่ได้ผลสำหรับฉัน แต่ผู้สอนของฉันช่วยฉันออกฉันอยากจะแบ่งปันวิธีแก้ปัญหาของเขาที่นี่ฉันใช้ kali linux terminal แต่ควรจะดีใน debian ทั้งหมด

javac *.java
nano MANIFEST.MF

ในประเภทไฟล์

ระดับหลัก: หลักหรือชื่อไฟล์หลักของคุณคืออะไร (ตรวจดูให้แน่ใจว่าได้เพิ่มชื่อแพ็คเกจหากมีอยู่)

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

ตอนนี้เพื่อเรียกใช้ไฟล์

java -jar new.jar

หรือคุณสามารถไปที่ไฟล์และตรวจสอบ

อนุญาตให้เรียกใช้ไฟล์เป็นโปรแกรม

ดับเบิลคลิกที่มัน

มันช่วยฉันในขณะที่คำตอบข้างต้นส่วนใหญ่ไม่ได้


1

คุณอาจมีปัญหาเช่นเดียวกับฉัน jar xf app.jar META-INF/MANIFEST.MFหลังจากที่สร้างไฟล์ขวดของคุณเขียน สิ่งนี้จะสร้างสำเนาของไฟล์ไปยังไดเรกทอรีปัจจุบันของคุณเพื่อให้คุณสามารถอ่านได้ ถ้ามันพูดอะไรบางอย่างเช่น:

Manifest-Version: 1.0

สร้างโดย: 1.8.0_51 (Oracle Corporation)

และไม่มีการประกาศ "ชั้นหลัก" จากนั้นฉันคิดว่าคุณพบปัญหาของคุณ

ฉันไม่ทราบวิธีการแก้ปัญหาแม้ว่า ฉันตรวจสอบบุคคลอื่นที่มีปัญหาแบบเดียวกัน / คล้ายกันใน StackOverflow และไม่พบคำตอบ อย่างไรก็ตามด้วยข้อมูลนี้คุณอาจได้รับความช่วยเหลือที่ดีขึ้น (จากข้อเท็จจริงที่ว่าคุณมีปัญหาเช่นเดียวกับฉัน)

แก้ไข: ฉันได้ลองกับไฟล์ manifest แต่ไม่สามารถใช้งานได้ แต่ความผิดพลาดของฉันคือการตั้งชื่อคลาสใดคลาสหนึ่งเมื่อสร้างไฟล์ jar ฉันเขียน * .class แทนและใช้งานได้ในขณะนี้

แม้ว่าฉันจะไม่รู้ว่าทำไมจึงมีความจำเป็นต้องสร้างไฟล์รายการ แต่ฉันเดาว่ามันใช้ได้ดีตราบใดที่มันใช้งานได้


1

ฉันมีปัญหานี้และฉันได้แก้ไขมันเมื่อไม่นานมานี้โดยทำสิ่งนี้ใน Netbeans 8 (อ้างอิงจากภาพด้านล่าง):

คุณสมบัติของโครงการ Netbeans

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