筆記來源:Maven零基礎入門教程(一套輕松搞定maven工具)
文章目錄
- 自動化構建工具:Maven
- 1、Maven 到底是啥?
- 2、什么是構建?
- 3、構建程序中的各個環節
- 4、自動化構建
- 5、安裝 Maven 核心程式
- 6、Maven 的核心概念
- 7、約定的目錄結構
- 8、常見的 Maven 命令
- 9、關于聯網問題
- 10、第一個 Maven 程式
- 目錄結構
- 撰寫代碼
- 編譯
- 測驗編譯
- 測驗
- 打包
- 清理
自動化構建工具:Maven
目前掌握的技術

目前技術在開發中存在的問題
-
一個專案就是一個工程
- 產生的問題:專案非常龐大時,就不適合使用 package 劃分模塊,最好是一個模塊對應一個工程,這樣利于分工協作
- 借助 Maven:可以將一個專案拆分成多個工程
-
專案所需 Jar 包需要手動復制粘貼至
WEB-INF/lib下- 產生的問題:同樣的 Jar 包重復出現在不同的專案工程中,一來占用存盤空間,二來顯得臃腫
- 借助 Maven:可以將 Jar 存盤在 倉庫 中,需使用的專案工程中只需 參考 即可,無需真正地復制 Jar 包
-
Jar 包需要別人替我們準備好,或是官網下載
- 產生的問題:不同技術的官網提供 Jar 包下載的形式是五花八門的,有些官網就是通過 Maven 或 SVN 等專門的工具提供下載的,如果下載的 Jar 包 來路不正 ,那么很可能其中的內容也是不正規的
- 借助 Maven:可以以規范的方式下載 Jar 包,因為所有知名框架或是第三方工具的 Jar 包已經按照統一規范存放在了 Maven 的中央倉庫中,其內容也是可靠的
- Tips:統一規范不僅對于 IT 開發領域非常之重要,對于整個人類社會也是非常之重要
-
一個 Jar 包所依賴的其他 Jar 包需要手動加入專案中
-
產生的問題:如果所有的 Jar 包依賴關系都需要程式員自己了解的特別清楚,就會極大地增加學習和開發成本
-
借助 Maven:自動將 Jar 包所需的依賴包匯入進來
FileUpload 組件 → IO 組件;commons-fileupload-1.3.jar 依賴于 commons-io-2.0.1.jar

-
1、Maven 到底是啥?
-
概念:Maven 是 Java 平臺上的自動化構建工具(Maven 本身也是使用 Java 撰寫的)
-
構建工具發展歷程:
Make??Ant??Maven??Gradle
2、什么是構建?
以 Java 源檔案、框架組態檔、HTML/CSS/JS/JSP、圖片等資源為 原材料,去 生產 一個可以運行的工程專案的程序
- 編譯:Java 源檔案 ?? 編譯 ?? Class 位元組碼檔案
- 部署:一個 BS 專案最終運行的并不是動態 Web 工程本身,而是動態 Web 工程編譯 后的結果
要深入地理解構建的含義,可以從以下三個層面來看:
-
純 Java 代碼
大家都知道,我們Java是一門編譯型語言,
.java擴展名的源檔案需要編譯成.class擴展名的位元組碼檔案才能夠執行,所以撰寫任何 Java 代碼想要執行的話就必須經過編譯得到對應的.class檔案 -
Web 工程
當我們需要通過瀏覽器訪問 Java 程式時就必須將包含 Java 程式的 Web 工程編譯的結果 拿 到服務器上的指定目錄,并啟動服務器才行,這個 拿 的程序我們叫部署,我們可以將未編譯的 Web 工程比喻為一只生的雞,編譯好的 Web 工程是一只煮熟的雞,編譯部署的程序就是將雞燉熟,即:動態 Web 工程 ?? 編譯、部署 ?? 編譯結果 <=> 生雞 ?? 煮熟 ?? 熟雞
Web 工程和其編譯結果的目錄結構對比見下圖

開發程序中,所有的路徑或組態檔中的類路徑都是以編譯結果的目錄結構為標準的
Tips:運行時環境

其實是一組 jar 包的參考,并沒有把 jar 包本身復制到工程中,所以并不是目錄
-
實際專案
在實際專案中整合第三方框架, Web 工程中除了 Java 程式和 JSP 頁面、圖片等靜態資源之外,還包括第三方框架的 jar 包以及各種各樣的組態檔,所有這些資源都必須按照正確的目錄結構部署到服務器上,專案才可以運行
所以綜上所述:構建就是以我們撰寫的 Java 代碼、框架組態檔、國際化等其他資源檔案、JSP 頁面和圖片等靜態資源作為 原材料,去 生產 出一個可以運行的專案的程序
3、構建程序中的各個環節
- 1?? 清理:講之前編譯得到的舊的
.class位元組碼檔案洗掉,為下一次編譯做準備 - 2?? 編譯:將 Java 源程式編譯成 Class 位元組碼檔案
- 3?? 測驗:自動測驗,呼叫 Junit 程式
- 4?? 報告:測驗程式執行的結果
- 5?? 打包:動態 Web 工程打成 War 包,Java 工程打成 Jar 包
- 6?? 安裝:講打包得到的檔案 復制 到 倉庫 中的特定位置
- 7?? 部署:將動態 Web 工程生成的 War 包 復制 到 Servlet 容器中的指定目錄下,使其可以運行
4、自動化構建
其實上述環節我們在 Eclipse 中都可以找到對應的操作,只是不太標準,那么既然 IDE 已經可以進行構建了我們為什么還要使用 Maven 這樣的構建工具呢?我們來看一個小故事:
這是陽光明媚的一天,托馬斯向往常一樣早早的來到了公司,沖好一杯咖啡,進入了自己的郵箱——很不幸,QA 小組發來了一封郵件,報告了他昨天提交的模塊的測驗結果——有BUG,
“好吧,反正也不是第一次”,托馬斯搖搖頭,進入 IDE,運行自己的程式,編譯、打包、部署到服務器上,然后按照郵件中的操作路徑進行測驗,
“嗯,沒錯,這個地方確實有問題”,托馬斯說道,于是托馬斯開始嘗試修復這個BUG,當他差不多有眉目的時候已經到了午飯時間,
下午繼續作業,BUG很快被修正了,接著托馬斯對模塊重新進行了編譯、打包、部署,測驗之后確認沒有問題了,回復了QA小組的郵件,
一天就這樣過去了,明媚的陽光化作了美麗的晚霞,托馬斯卻覺得生活并不像晚霞那樣美好啊,
讓我們來梳理一下托馬斯這一天中的作業內容

從中我們發現,托馬斯的很大一部分時間花在了“編譯、打包、部署、測驗”這些程式化的作業上面,而真正需要由“人”的智慧實作的分析問題和編碼卻只占了很少一部分
能否將這些程式化的作業交給機器自動完成呢?——當然可以!這就是自動化構建

此時 Maven 的意義就體現出來了,它可以自動地從構建程序的起點一直執行到終點
5、安裝 Maven 核心程式
-
檢查 JAVA_HOME 環境變數

-
解壓 Maven 核心程式的壓縮包,放在一個非中文無空格路徑下
-
配置 Maven 相關的環境變數
MAVEN_HOME或M2_HOME

PATH

-
驗證:運行
mvn -v查看 Maven 版本
6、Maven 的核心概念
- 1?? 約定的目錄結構
- 2?? POM
- 3?? 坐標
- 4?? 依賴
- 5?? 倉庫
- 6?? 生命周期 / 插件 / 目標
- 7?? 繼承
- 8?? 聚合
7、約定的目錄結構
- 根目錄:工程名
- |—— src 目錄:原始碼
- |—— pom.xml檔案:Maven 工程的核心組態檔
- |———— main 目錄:存放主程式
- |———————— java 目錄:存放 Java 源檔案
- |———————— resource 目錄:存放框架或其他工具的組態檔
- |———— test 目錄:存放測驗程式
- |———————— java 目錄:存放 Java 測驗源檔案
- |———————— resource 目錄:存放框架或其他工具的測驗組態檔
為什么要遵守約定的目錄結構呢?
- 巧婦難為無米之炊:Maven 要負責我們專案的自動化構建,以編譯為例,Maven 要想自動進行編譯,就必須要知道 Java 源檔案的位置
- 如果想讓框架或工具知道我們自定義的東西,方法有二:
- 以配置的方式指定:如
<param-value>classpath:spring-context.xml</param-value> - 遵守框架內部約定:如
log4j.properties/log4j.xml
- 以配置的方式指定:如
- JavaEE 的開發共識:約定 > 配置 > 編碼
8、常見的 Maven 命令
?? ?? ?? 注意:執行與構建程序相關的 Maven 命令,必須進入 pom.xml 所在的目錄
與構建程序相關:編譯、測驗、打包、.……
mvn clean:清理mvn compile:編譯主程式mvn test-compile:編譯測驗程式mvn test:執行測驗mvn package:打包
9、關于聯網問題
Maven 核心程式僅僅是定義了抽象的生命周期,但是具體的作業必須要由插件來完成,而插件本身并不包含在 Maven 核心程式中
- 執行的 Maven 命令需要用到某些插件時,Maven 核心程式會首先在本地倉庫中查找
- 本地倉庫的默認位置:
【系統當前用戶的家目錄】\.m2\repository(windows:C:\Users\[用戶名]\.m2\repository)
- 本地倉庫的默認位置:
- 修改本地倉庫的默認位置,Maven 核心程式會到我們事先準備好的目錄下查找插件
- 打開
[Maven解壓目錄]\conf\settings.xml,找到localRepository標簽,修改目錄
- 打開
- Maven 核心程式如果在本地倉庫中找不到需要的插件,會自動到中央倉庫下載,如果此時無法連接外網,則構建失敗
10、第一個 Maven 程式
目錄結構

撰寫代碼
public class Hello {
public String sayHello(String name) {
return "Hello " + name + "!";
}
}
public class HelloTest {
@Test
public void testHello() {
Hello hello = new Hello();
String results = hello.sayHello("world");
assertEquals("Hello world!", results);
}
}
編譯
mvn compile
執行程序

目錄內容:
classes目錄

測驗編譯
mvn test-compile
執行程序

目錄內容:
classes目錄:主程式編譯后的位元組碼檔案test-classes目錄:測驗程式編譯后的位元組碼檔案

測驗
mvn test
執行程序

目錄結構
surefire-reports:測驗報告,本例為com.vectorx.maven.HelloTest.txt- 測驗報告會統計所有測驗方法執行的最終結果


本例只有一個測驗方法,并且最終運行結果為:運行成功數:1,運行失敗數:0,運行錯誤數:0,跳過:0,總耗時:0.103 秒,說明本例中testHello測驗方法斷言正確,驗證通過
打包
mvn package
執行程序

目錄內容:
classes/test-classes:主程式 / 測驗程式編譯的位元組碼檔案surefire-reports:測驗報告Hello-0.0.1-SNAPSHOT.jar:jar 包檔案maven-archiver/maven-status等其他額外檔案

清理
mvn clean
執行程序

目錄內容:
- 清理會清空整個
target目錄及其內容

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/333743.html
標籤:其他
上一篇:1. Java POI 讀取、寫入Excel(包括樣式)的工具類Utils
下一篇:反向計算一個div內的孩子的數量
