Springboot解決no main manifest attribute錯(cuò)誤
0. 背景
在開發(fā)Spring boot項(xiàng)目的時(shí)候,有時(shí)候會需要使用java -jar test-1.0-SNAPSHOT.jar指令來運(yùn)行開發(fā)的java應(yīng)用,但是很不幸,會遇到這樣的錯(cuò)誤
no main manifest attribute, in test-1.0-SNAPSHOT.jar
為什么會產(chǎn)生這樣的錯(cuò)誤呢?如何解決呢?
1. java程序如何運(yùn)行
在接觸java開發(fā)的第一天,我們就知道,在編寫完Java程序之后
public class Hello { public static void main(String[] args) { System.out.println("Hello World"); } }
需要使用指令將.java文件編譯成class文件
javac Hello.java
然后就可以使用命令就可以執(zhí)行這個(gè)Java程序
java Hello Hello World
程序運(yùn)行的入口是main方法,當(dāng)我們使用java Hello命令,虛擬機(jī)就可以根據(jù)Hello.class文件中的main方法,來運(yùn)行程序。但是使用的 java -jar 指令是如何使程序運(yùn)行起來的呢?
2. jar是什么
JAR(Java Archive)文件是一種打包文件格式,它允許你將多個(gè) Java 類文件、相關(guān)的元數(shù)據(jù)和資源(如文本、圖片等)打包到一個(gè)單一的文件中,以便于分發(fā)和部署。
JAR中包含了類文件,元數(shù)據(jù)和資源。類文件和資源文件很清楚,那元數(shù)據(jù)是什么呢?
元數(shù)據(jù)主要指的是清單文件(MANIFEST.MF) ,這是一個(gè)可選文件,用來提供關(guān)于jar文件的額外信息。清單文件的主要功能:
指定主類:在清單文件中,可以指定包含main方法的類,這是Java應(yīng)用程序的入口點(diǎn)。這允許用戶通過java -jar命令直接運(yùn)行JAR文件。
定義屬性:清單文件可以包含屬性,這些屬性可以是鍵值對的形式,用于存儲關(guān)于JAR文件的額外信息,比如版本號、作者信息等。
指定類路徑:在清單文件中可以定義類路徑(Class-Path)屬性,指定在運(yùn)行JAR文件時(shí)需要包含的其他JAR文件或目錄。
安全設(shè)置:清單文件可以包含安全相關(guān)的設(shè)置,比如指定需要哪些權(quán)限。
擴(kuò)展名映射:可以定義文件擴(kuò)展名到類名的映射,這樣當(dāng)運(yùn)行具有特定擴(kuò)展名的文件時(shí),JAR文件中的特定類將被用來處理這些文件。
其他自定義信息:開發(fā)者可以根據(jù)需要在清單文件中添加自定義的元數(shù)據(jù)。
這里可以解壓一個(gè)jar來看一下:
這里解壓一下spring-core-5.3.27.jar來看一下,jar中有什么內(nèi)容:
這里可以看到,org目錄下,放的就是類文件,META-INF放的就是資源文件:
這里再看一下MANIFEST. MF里的內(nèi)容
Manifest-Version: 1.0 Implementation-Title: spring-core Automatic-Module-Name: spring.core Implementation-Version: 5.3.27 Created-By: 1.8.0_345 (Oracle Corporation) Dependencies: jdk.unsupported
Manifest-Version 表示清單文件的版本。
Created-By 表示創(chuàng)建JAR文件的Java版本和提供者。
Permissions 指定了JAR文件的權(quán)限。
這個(gè)文件中沒有包含指定main的方法,一般這樣添加:
Main-Class: com.example.MainApp
3. java -jar test-1.0-SNAPSHOT.jar:
這樣已經(jīng)可以知道,java -jar就是去找指定jar包里的main方法來執(zhí)行,如何找main方法?根據(jù)MANIFEST.MF中的Main-Class類來找。
遇到的錯(cuò)誤是沒有no main manifest attribute,那就打開看一下。
Manifest-Version: 1.0 Implementation-Title: test Implementation-Version: 1.0-SNAPSHOT Build-Jdk-Spec: 1.8 Created-By: Maven JAR Plugin 3.2.2
這里沒有這個(gè)main attribute,那如何添加這個(gè)attribute呢?
以上面的Hello.java為例,來手動(dòng)打一個(gè)jar包。先編寫這個(gè)MANIFEST. MF
Manifest-Version: 1.0 Build-Jdk-Spec: 1.8 Main-Class: Hello
這樣再使用這個(gè)文件打一個(gè)jar包:
jar cvfm test-hello.jar MANIFEST.MF .
這里的參數(shù)作用是
- c:創(chuàng)建新的 JAR 文件。
- v:在打包過程中顯示詳細(xì)輸出。
- f:后面跟著的是要?jiǎng)?chuàng)建的 JAR 文件的名稱。
- m:指定清單文件的名稱。
這個(gè)時(shí)候就可以使用java -jar愉快的玩耍了。
那上面Springboot程序如何添加這個(gè)程序執(zhí)行入口呢?
4. 添加執(zhí)行入口
這里的程序打包是使用的maven,那就使用maven的插件來完成就好了!
在pom文件中添加如下插件:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
這個(gè)時(shí)候,再使用mvn package指令,就可以得到一個(gè)可以正確執(zhí)行的jar包了。直接java -jar test-1.0-SNAPSHOT.jar愉快玩耍。
到此這篇關(guān)于Springboot解決no main manifest attribute錯(cuò)誤的文章就介紹到這了,更多相關(guān)Springboot no main manifest attribute內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中枚舉的實(shí)現(xiàn)與應(yīng)用詳解
這篇文章主要介紹了Java中枚舉的實(shí)現(xiàn)與應(yīng)用詳解,EnumTest中還有一個(gè)VALUES數(shù)組,里面存儲著所有的枚舉實(shí)例,調(diào)用values方法時(shí)返回VALUES數(shù)組的clone,需要的朋友可以參考下2023-12-12Spring?Boot項(xiàng)目部署命令java?-jar的各種參數(shù)及作用詳解
這篇文章主要介紹了Spring?Boot項(xiàng)目部署命令java?-jar的各種參數(shù)及作用的相關(guān)資料,包括設(shè)置內(nèi)存大小、垃圾回收器、線程棧大小、系統(tǒng)屬性等,還介紹了SpringBoot專用參數(shù),如修改端口、指定配置文件等,需要的朋友可以參考下2025-04-04Mybatis?List列表In查詢實(shí)現(xiàn)的注意事項(xiàng)說明
這篇文章主要介紹了Mybatis?List列表In查詢實(shí)現(xiàn)的注意事項(xiàng)說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Java+Nginx實(shí)現(xiàn)POP、IMAP、SMTP郵箱代理服務(wù)
本篇文章的內(nèi)容是介紹Java+Nginx如何實(shí)現(xiàn)POP、IMAP、SMTP郵箱代理服務(wù),步驟詳細(xì),思路清新,需要的朋友可以參考下2015-07-07idea項(xiàng)目文件夾橫向顯示,縱向顯示的解決方法
這篇文章主要介紹了idea項(xiàng)目文件夾橫向顯示,縱向顯示的解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08maven下mybatis-plus和pagehelp沖突問題的解決方法
這篇文章主要介紹了maven下mybatis-plus和pagehelp沖突的解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08Java中自動(dòng)裝箱、拆箱引起的耗時(shí)詳解
這篇文章主要給大家介紹了關(guān)于Java中自動(dòng)裝箱、拆箱引起的耗時(shí)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04