一、報錯:xxx.jar中沒有主清單屬性
方式一、手動修改MANIFEST.MF 文件配置
-
通過 7z 等壓縮工具打開 jar 包
-
修改 META-INF 目錄中的 MANIFEST.MF 文件(選中文件后右鍵選擇編輯而不是打開)
-
在原有內容的末尾加上一行:
上圖為已經操作過的結果
Main-Class: com.zhiyin.screenshot.ScreenShotDemo(全限定名,不加后綴)
-
鍵值之間必須用英文冒號隔開,並且必須后接一個(僅有一個)空格
-
修改文件后記得保存,同時壓縮工具會提醒是否更新壓縮文件,選擇是(選擇否時修改不生效,該報錯還報錯)
-
方式二、使用插件並配置主函數
-
pom.xml 配置文件中加入以下配置(注意標簽的嵌套)
參考后續 pom.xml 配置文件中的主函數配置
-
待下載完成插件后,在項目的 Maven 窗口的 Plugins 下即可找到 assembly 插件(如果沒有請刷新)
-
使用 assembly:assembly 完成項目的打包
二、報錯:Invalid or corrupt jarfile xxx.jar
分析
使用步驟 1 中修改 MANIFEST.MF 文件的方式來設置主函數時是否配置正確,鍵和值之間是否有英文冒號加空格,且英文和符號必須全為半角狀態
三、報錯:java.lang.NoClassDefFoundError
分析
因為是通過 IDEA 中 Maven 項目的 Lifecycle 中的 package 操作完成打包的,所以該命令默認是不會把依賴的 jar 包構建到 target 中,導致程序啟動時找不到類報錯
解決
借助於 Maven 插件完成
-
pom.xml 文件中加入配置
注意標簽的嵌套
<project> <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <!-- 配置jar包主函數 --> <mainClass>com.zhiyin.screenshot.ScreenShotDemo</mainClass> </manifest> </archive> <!-- 生成的包含依賴jar的jar包名稱 --> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> </plugins> </build> </project>
-
加入配置后,等待插件完成下載后,在項目的 Maven 窗口 Plugs 下就會出現
-
通過 assembly 插件進行打包的操作后,再進入到 target 目錄中,會發現多出一個
descriptorRef
標簽中的指定名稱的 jar 包,打開 jar 包時會發現依賴的 jar 的也在其中
四、知識點
-
全限定名:包名 + 類名(不包括類的后綴名),包與包之間,包與類之間的層級關系用
.
表示,包的最頂層為程序中的源代碼目錄,Maven 項目中則為Sources Root
下的包 -
使用 assembly 插件進行打包操作時,會在 target 目錄中生成兩個 jar 包,一個為默認的 jar 包,一個為包含了程序依賴 jar 包的 jar 包