學Maven看這一篇部落格就夠
Maven的簡介
Apache Maven,是一個軟體專案管理及自動構建工具,由Apache軟體基金會所提供。基於專案物件模型概念,Maven利用一箇中央資訊片斷能管理一個專案的構建、報告和文件等步驟。 Maven也可被用於構建和管理各種專案,例如C#,Ruby,Scala和其他語言編寫的專案。
使用Maven的好處有哪些
- 依賴管理,對jar包進行統一管理,大幅度縮小工程的大小,因為可以使用pom.xml來匯入依賴即可,而依賴也只是一個引用所以不佔用很大空間
- 將一個工程可以拆分成多個子模組,有利於分工開發提高效率
- 一鍵構建
- 可以跨平臺
安裝
第一步:Maven 是由 Java 語言開發所以需要依賴於 JDK,所以進入終端使用“java -version”檢查自己電腦是否已經裝好 JDK,如果沒有請自行百度 第二步:到 Maven 的官網下載 https://maven.apache.org/download.cgi# 第三步:解壓 Maven 核心程式壓縮包 第四步:配置 Maven 相關的環境變數 1.新建使用者變數 變數名:MAVEN_HOME 變數值:解壓Maven的根目錄如D:\apache-maven-3.2.2 2.編輯使用者變數 變數名:path 變數值:解壓Maven\bin目錄 第五步:驗證 執行mvn -v命令檢視 Maven版本
注意:Maven3.3以上的版本需要依賴 JDK 1.7或者更高版本,安裝Mavne本身大約 10MB,但Maven還有本地庫的使用會需要額外空間,所以至少需要 500MB
修改本地倉庫位置
一般預設位置是在 C:\Users|[登入當前系統的使用者名稱].m2\repository
但是我們為了以後方便所以修改預設本地倉庫位置,換成我們自己準備好的倉庫
- 找到Maven解壓目錄\conf]settings.xml
- 在settings.xml檔案中找到 localRepository標籤
- 將/path/to/local/repo從註釋中取出
- 將標籤體內修改為已經準備好的 Maven 倉庫目錄
<localRepository>D:\RepMaven</localRepository>
倉庫
說到依賴首先通過依賴的座標去找我們的本地倉庫,如果本地倉庫沒有找到就回去遠端倉庫去下載,因此如果自己的本地倉庫沒有這個依賴,那麼就必須要聯網才可以進行下載
倉庫的分類
- 本地倉庫:當前電腦上部署的倉庫目錄,為當前電腦上所有Maven工程服務
- 遠端倉庫
- 私服:搭建在區域網環境中,為區域網範圍內的所有Maven工程服務
- 中央倉庫:假設在 Internet 上,為全世界所有Maven工程服務
- 中央倉庫映象:為了分擔中央倉庫的流量,提升訪問速度
構建Maven的各個環節
- 清理:將以前編譯得到的舊的class位元組碼檔案刪除,為下一次編譯做準備
- 編譯:將Java源程式編譯成class位元組碼檔案
- 測試:自動測試,自動呼叫junit程式
- 報告:測試程式執行的結果
- 打包:動態Web工程打war包,Java工程打jar包
- 安裝:將打包得到的檔案複製到“倉庫”中的指定位置
- 部署:將動態web工程生成的war包複製到servlet容器的指定目錄下,使其可以執行
Maven命令
- mvn clean:清理
- mvn compile:編譯主程式
- mvn test-compile:編譯測試程式
- mvn test:執行猜測程式
- mvn package:打包
- mvn install:安裝
- mvn site:生成站點
Maven工程
現在對Maven也有些瞭解了那麼我們就可以搭建自己的Maven工程了,但在搭建之前我們要知道 Maven工程跟Java工程的結構有些不同,下面是Maven工程的目錄結構我們可以按照下面來建立目錄
my-app
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- com
| `-- mycompany
| `-- app
| `-- App.java
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java
建立好之後我們需要引入pom.xml 下面解釋一下各個標籤的含義,然後我們在App.java寫程式碼,在AppTest.java裡面寫測試程式碼即可
-
groupId :公司或組織域名倒序 + 專案名
-
artifactid:模組名
-
version:版本 如字尾帶有SNAPSHOT表示是一個分支版本可能不穩定所以儘量使用字尾RELEASE表示正式版
-
packaging:表示Maven對這個模組用什麼方式進行打包
- pom:表示為父類工程
- jar :為packaging的預設型別表示maven 將該專案打包jar包
- war:一般用於是web工程
-
properties:對專案用於版本號的統一管理
-
dependencies:管理整個專案的所有依賴
-
dependency:對一個jar包的依賴將其引用到專案當中groupId、artifactId、version相當於是座標
-
scope:作用域,maven解析依賴資訊會到本地倉庫中查詢依賴的jar包,對於自己開發的maven專案,使用 mvn install命令安裝後就可以進入倉庫,此時就需要依賴的範圍進行把控
- compile:對主程式、測試程式都有效,並且參與打包和部署(spring-core)
- test:對於主程式無效、測試程式有效,並且不參與打包和部署(junit)
- provided :對主程式、測試程式有效,並且不參與打包和部署,如果正常使用compile會報錯原因是我們的tomcat容器會提供servlet-api所以有衝突(servlet-api)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- packaging>jar</packaging -->
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
依賴
上面的 dependency 標籤就是新增依賴,除了新增依賴的方法之外,還需要強調的是依賴的傳遞性
場景一:Maven工程A和B,B依賴於spring-core的jar包,A依賴於B,那麼A不用引入spring-core就有了jar包,這就是maven的傳遞性
這樣我們可以通過傳遞性不必再每個模組工程都重複宣告,在“最下面”的工程中依賴一次就行,上面的工程來依賴下面的工程,那麼上面的工程也就擁有了下面的jar包
注意:非compile範圍的依賴不能傳遞,所以各個工程模組中,如果有需要就得重複宣告依賴
依賴排除
通過依賴的方式我們引入了別的maven工程就相當於引入了它們的jar包,如果我們不想要引入它們jar包中的某一個不穩定的包我們可以這樣來設定將它從中排除
場景二:如我們不想引入B工程spring-core中的commons-logging包
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
依賴的原則
依賴的原則的作用其實就是解決模組工程之間jar包的衝突
- 原則一:最短路徑原則
- 原則二:路徑相同時先宣告者優先
A->B->C,B和C都有log4j,B的是1.2.14,C的是1.2.17,A最後依賴的版本就是log4j1.2.14也就是B的這就是原則一中的最短路徑原則
A——>B
|
——>C 此時A到B的路徑與A到C的路徑相等,這就要看在A的pom.xml檔案中是B模組先宣告還是C模組先宣告,誰先宣告就依賴誰
注意:上面兩句話很重要面試問到Maven必問的知識點,你 get 到了嗎
統一版本號
在開發過程中如果有很多個依賴,當我們要對這些依賴升級事就會發現很頭疼的事情,比如我們要升級spring要對其所有的jar包都進行依次升級這樣就會很麻煩,作為程式猿的我們肯定希望要是隻改動一個地方就可以修改大部分相同的版本號該多好,Maven提供了properties標籤我們可以對其進行定義,然後引入到version標籤當中。
<properties>
<spring.version>4.0.0.RELEASE<spring.version>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
繼承
繼承其實就是建立maven工程的時候父類在選擇型別的時候選擇pom打包的方式,子類可以是別的型別如jar,然後在子類當中宣告父類工程
子類pom.xml中宣告如下:
<parent>
<groupId>父類組織</groupId>
<artifactId>父類模組名</artifactId>
<version>父類版本號</version>
</parent>
因為子類宣告父類的工程,在子類工程的座標依賴中就會有很多重複的會出現黃色的波浪線我們就可以刪除掉,父類就可以統一的管理版本號
聚合
有了繼承我們在install到本地倉庫的時候如果不是按照一定的順序,我們會發現安裝會失敗,原因是有些模組依賴於上一個模組。所以我們採用聚合的方式,不用考慮順序隨便在一個“總的聚合工程”中配置各個參與聚合的模組
<!-- 配置聚合 -->
<modules>
<!-- 指定各個子工程的相對路徑 -->
<module>../B工程名</module>
<module>../C工程名</module>
</modules>
注意上面程式碼的"點點"實際是從要聚合的工程的pom.xml來算的所以要先 點點 出去這個工程然後才能找到要聚合的工程