當前位置:
首頁 > 知識 > 深入淺出 Maven 打包番外篇

深入淺出 Maven 打包番外篇

深入淺出 Maven 打包番外篇

maven package

前文說到Maven工程的起步,古語有云:


良好的開始是成功的一半,有開始就有結束.

本文來探討一下mvn package。Maven工程的收尾。特別指非Web工程。一般情況下需要將Java的編譯.class文件打包成一個可執行的jar包,然後通過Java命令啟動,如: java -jar xxx.jar

一個可執行的jar包,首先需要滿足以下條件:

  • 在jar包中的/META-INF/MANIFEST.MF元數據文件中必須指定Main-Class啟動入口類信息。

  • 運行所有依賴都必須包含在Classpath中。即依賴必須都被描述MANIFEST於.MF文件中的Class-Path下。


Maven 原理篇

如何使用mvn package去構建預定義部署包結構,需要先來弄懂一個問題Maven中的Build Lifecycle、 Phases以及Plugin的關係:

  1. A Build Lifecycle is Made Up of Phases

  2. A Build Phase is Made Up of Plugin Goals

深入淺出 Maven 打包番外篇

Maven將工程的構建過程分不同的生命周期(Lifecycle),Maven內置三個LifyCycle:default(build)構建,clean清理, site生成文檔與站點。這三個LifyCycle相互獨立,兩者之間沒有必然的聯繫。Phases是組成Lifecycle的基礎,在同一個Lifycycle中Phases有著明確的順序要求。Maven的Lifecycle和Phase都是抽象的概念,不涉及具體的功能,而功能的實現由插件(Plugin)負責。Goal是Maven中最小的任務單元。一個Plugin可以實現多個目標(Goal),Goal可以綁定到多個Phases上面,每個Phase下也可以包含多個Goal。我們也可以將Phase視為Goal的容器。

當執行mvn packeage的時候。依次執行validate、compile、test、package 四個Phases,進而觸發Phases上面的Goal。你可能會迷惑,我什麼插件也沒有配置它會執行什麼?Default!



Package 實戰

你可以參考mvner 別讓你的工程輸在起跑線上創建一個 Java (pom) 工程,作為本項目的練習。

深入淺出 Maven 打包番外篇

現在需要將上面的工程打包成一個可執行的Jar。

一個可執行的jar又可以分三類:


Simple Jar

只使用了JDK自身所提供的能力,而無其它的依賴。

使用插件:

深入淺出 Maven 打包番外篇

Plugin 配置:

深入淺出 Maven 打包番外篇

在本例子中,maven-jar-plugin處理Simple Jar 恰到好處。



Uber Jar

Uber一詞來自德語über。大意可以理解為 above 或者 over。社區還給它還有一個綽號 Fat Jar(胖Jar),指包含了所有運行依賴的可執行Jar包。

使用插件:

深入淺出 Maven 打包番外篇

(註:哪兒涼快哪兒待啊!)

在上面的例子中我們將:

System.out.println(new Date());

修改為使用Joda的Datetime,別忘了在工程中增加依賴!

System.out.println(DateTime.now());

現在工程已經有了依賴包Joda-time

深入淺出 Maven 打包番外篇

joda-time

如何我們使用maven-jar-plugin進行打包。構建的jar沒有辦法直接java -jar XX.jar因為缺少依賴的joda-time。

Plugin 配置:

深入淺出 Maven 打包番外篇

深入淺出 Maven 打包番外篇

執行

再來看一下打包後的jar:

深入淺出 Maven 打包番外篇

還有一種通過裝配插件:

深入淺出 Maven 打包番外篇 也可以完成,不過有一種「殺雞何用宰牛刀的感覺」。為啥?(往下看)

maven assembly plugin

配置方式如下:

深入淺出 Maven 打包番外篇



Deploy Jar

高大上的打包方式,package之後直接就是壓縮包,解壓之後的結構如下:

深入淺出 Maven 打包番外篇

來看一下pom配置:

深入淺出 Maven 打包番外篇

maven-jar

  1. 使用maven-jar-plugin構建jar。

  2. 構建的jar排除了相應的配置文件。

  3. 指定classpath的路徑在../lib/中

  4. 指定manifestEntries路徑../conf/

至此打包的jar還無法運行。因為lib/ conf/都沒有配置。

先來處理conf:

深入淺出 Maven 打包番外篇

maven resources plugin

使用插件maven-resources-plugin將src/main/resources中的配置文件copy到target/conf中。

深入淺出 Maven 打包番外篇

再指定裝配描述文件:

深入淺出 Maven 打包番外篇

裝配描述 zip.xml

深入淺出 Maven 打包番外篇

深入淺出 Maven 打包番外篇


  • 指定壓縮格式 zip
    src/scripts文件夾中將用到的腳本輸出到bin文件夾中。

  • 指主jar中也輸出到bin文件夾中。

  • maven-resources-plugin copy的conf文件夾複製到同名文件夾。

  • 依賴包輸出到lib文件中並排除主jar。

剩下最後一項工作:

src/scripts

中的腳本編寫:

寫個Windows的吧(伺服器都是linux,你寫個windows?), 是的,這個是用來練習的,檢驗你能否按本文的內容mvn package

深入淺出 Maven 打包番外篇

請關注!


關注「教授學苑」,期待帶給你快樂的開發知識!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 教授學苑 的精彩文章:

Java 8 函數式介面掃雷指南
Google Guava 筆記(一)-Collections
Google Guava 筆記(二)-深入探索
JavaScript中this常見的兩個坑
JavaScript 代碼規範,自帶 linter & 代碼自動修正

TAG:教授學苑 |

您可能感興趣

The Weeknd和Bella Hadid又分手了!北美意難忘番外篇?
Fragment 番外篇——TabLayout+ViewPager+Fragment
Snake Eyes 將成為《G.I. Joe》系列電影番外篇主角
華為P20登頂DxOMark Mobile榜單的故事——番外篇
flowers新刊推出海街diary番外篇和香蕉魚插圖日曆
造型特輯 | 番外篇 :澳門95後潮搭 Supreme。
強森發ins:"速激"番外篇殺青!
《偶像大師》番外篇《偶像大師 SideM 有理由mini》完結
flowers新刊推出「海街diary」番外篇和「香蕉魚」插圖的2019日曆
轉帖:CC機設番外篇 重裝轟鳴 一騎當千!SHF 蝙蝠摩托 Bat Pod
假面騎士時王確定是decade番外篇,王小明失憶的原因找到了
「BigBang」「新聞」190627 Ds house 第十五集及金澤一日游番外篇,26日上線啦??
《延禧攻略》一眾主演襲港,TVB「番外篇」顛覆大結局
<>里最火點心之番外篇:蛋黃酥
《延禧攻略》將推出番外篇
CEO日記——番外篇 我是話外音
火箭番外篇
陰陽師不止遊戲BUG滿天飛,番外篇的BUG也是一籮筐啊
2018年VR/AR十大關鍵詞(番外篇):移動AR
吉田秋生「海街diary」最終第9捲髮售,收錄番外篇