Maven 項目打包及啟動時的報錯解決


一、報錯:xxx.jar中沒有主清單屬性

方式一、手動修改MANIFEST.MF 文件配置

  1. 通過 7z 等壓縮工具打開 jar 包

  2. 修改 META-INF 目錄中的 MANIFEST.MF 文件(選中文件后右鍵選擇編輯而不是打開)

  3. 在原有內容的末尾加上一行:

    上圖為已經操作過的結果

    Main-Class: com.zhiyin.screenshot.ScreenShotDemo(全限定名,不加后綴)
    
    • 鍵值之間必須用英文冒號隔開,並且必須后接一個(僅有一個)空格

    • 修改文件后記得保存,同時壓縮工具會提醒是否更新壓縮文件,選擇(選擇否時修改不生效,該報錯還報錯)

方式二、使用插件並配置主函數

  1. pom.xml 配置文件中加入以下配置(注意標簽的嵌套)

    參考后續 pom.xml 配置文件中的主函數配置

  2. 待下載完成插件后,在項目的 Maven 窗口的 Plugins 下即可找到 assembly 插件(如果沒有請刷新)

  3. 使用 assembly:assembly 完成項目的打包

二、報錯:Invalid or corrupt jarfile xxx.jar

分析

使用步驟 1 中修改 MANIFEST.MF 文件的方式來設置主函數時是否配置正確,鍵和值之間是否有英文冒號加空格,且英文和符號必須全為半角狀態

三、報錯:java.lang.NoClassDefFoundError

分析

因為是通過 IDEA 中 Maven 項目的 Lifecycle 中的 package 操作完成打包的,所以該命令默認是不會把依賴的 jar 包構建到 target 中,導致程序啟動時找不到類報錯

解決

借助於 Maven 插件完成

  1. 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>
    
  2. 加入配置后,等待插件完成下載后,在項目的 Maven 窗口 Plugs 下就會出現

  3. 通過 assembly 插件進行打包的操作后,再進入到 target 目錄中,會發現多出一個 descriptorRef 標簽中的指定名稱的 jar 包,打開 jar 包時會發現依賴的 jar 的也在其中

四、知識點

  • 全限定名:包名 + 類名(不包括類的后綴名),包與包之間,包與類之間的層級關系用 . 表示,包的最頂層為程序中的源代碼目錄,Maven 項目中則為 Sources Root 下的包

  • 使用 assembly 插件進行打包操作時,會在 target 目錄中生成兩個 jar 包,一個為默認的 jar 包,一個為包含了程序依賴 jar 包的 jar 包


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM