本來地址:Maven入門,讀完這篇就夠了
博客地址:tengj.top/php
夜空中最亮的星,2018請照亮我前行~ Maven是咱們平常開發都會用到的,新年第一天,把看過的Maven基礎概念作了整理,做爲入門和查閱使用。java
Maven做爲一個構建工具,不只能幫咱們自動化構建,還可以抽象構建過程,提供構建任務實現;它跨平臺,對外提供了一致的操做接口,這一切足以使它成爲優秀的、流行的構建工具。mysql
Maven不只是構建工具,仍是一個依賴管理工具和項目管理工具,它提供了中央倉庫,能幫我自動下載構件。git
一:由於本人是window系統,因此這裏只介紹window下如何安裝,在安裝Maven以前,先確認已經安裝了JDK. 程序員
二:接着去Maven官網下載界面下載想要的版本解壓到你想要的目錄就行 github
三:最後設置一下環境變量,將Maven安裝配置到操做系統環境中,主要就是配置M2_HOME 和PATH兩項,如圖 web
都搞定後,驗證一下,打開doc輸入 mvn -v如何獲得下面信息就說明配置成功了 spring
**mvn clean:**表示運行清理操做(會默認把target文件夾中的數據清理)。 **mvn clean compile:**表示先運行清理以後運行編譯,會將代碼編譯到target文件夾中。 **mvn clean test:**運行清理和測試。 **mvn clean package:**運行清理和打包。 **mvn clean install:**運行清理和安裝,會將打好的包安裝到本地倉庫中,以便其餘的項目能夠調用。 **mvn clean deploy:**運行清理和發佈(發佈到私服上面)。sql
上面的命令大部分都是連寫的,你們也能夠拆分分別執行,這是活的,看我的喜愛以及使用需求,Eclipse Run as對maven項目會提供經常使用的命令。apache
編輯seeting.xml文件 有時候你所在的公司基於安全因素考慮,要求你使用經過安全認證的代理訪問因特網。這種狀況下,就須要爲Maven配置HTTP代理,才能讓它正常訪問外部倉庫,如下載所須要的資源。首先確認本身沒法直接訪問公共的maven中央倉庫,直接運行命令ping repo1.maven.org能夠檢查網絡。若是真的須要代理,先檢查一下代理服務器是否暢通。好比如今有一個IP地址爲218.14.227.197,端口爲3128的代理服務,咱們能夠運行telnet 218.14.227.197 3128來檢測該地址的該端口是否暢通。若是獲得出錯信息,須要先獲取正確的代理服務信息,若是telnet鏈接正確,則輸入ctrl+],而後q,回車,退出便可。
檢查完畢以後,編輯~/.m2/settings.xml文件(若是沒有該文件,則複製$M2_HOME/conf/settings.xml)。添加代理配置以下:
<settings>
...
<proxies>
<proxy>
<id>my-proxy</id>
<active>true</active>
<protocol>http</protocol>
<host>218.14.227.197</host>
<port>3128</port>
<!-- <username>***</username> <password>***</password> <nonProxyHosts> repository.mycom.com|*.google.com </nonProxyHosts> -->
</proxy>
</proxies>
...
</settings>
複製代碼
這段配置十分簡單,proxies下能夠有多個proxy元素,若是聲明瞭多個proxy元素,則默認狀況下第一個被激活的proxy會生效。這裏聲明瞭一個id爲my-proxy的代理,active的值爲true表示激活該代理,protocol表示使用的代理協議,這裏是http。固然,最重要的是指定正確的主機名(host元素)和端口(port元素)。上述xml配置中註釋掉了username,password,nonProxyHosts幾個元素。當代理服務須要認證時,就須要配置username和password。nonProxyHost元素用來指定哪些主機不須要代理,可使用"|"符號來分隔多個主機名。此外,該配置也支持通配符,如:*.google.com表示全部以google.com結尾的域名訪問都不要經過代理。
博主如今使用IDEA來開發的,因此這裏介紹一下IDEA中如何配置引入咱們上面下載好的Maven
<?xml version="1.0" encoding="UTF-8"?>
<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.tengj</groupId>
<artifactId>springBootDemo1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springBootDemo1</name>
</project>
複製代碼
代碼的第一行是XML頭,指定了該xml文檔的版本和編碼方式。 project是全部pom.xml的根元素,它還聲明瞭一些POM相關的命名空間及xsd元素。 根元素下的第一個子元素modelVersion指定了當前的POM模型的版本,對於Maven3來講,它只能是4.0.0 代碼中最重要是包含了groupId,artifactId和version了。這三個元素定義了一個項目基本的座標,在Maven的世界,任何的jar、pom或者jar都是以基於這些基本的座標進行區分的。
groupId定義了項目屬於哪一個組,隨意命名,好比谷歌公司的myapp項目,就取名爲 com.google.myapp
artifactId定義了當前Maven項目在組中惟一的ID,好比定義hello-world。
version指定了項目當前的版本0.0.1-SNAPSHOT,SNAPSHOT意爲快照,說明該項目還處於開發中,是不穩定的。
name元素生命了一個對於用戶更爲友好的項目名稱,雖然這不是必須的,但仍是推薦爲每一個POM聲明name,以方便信息交流
<project>
...
<dependencies>
<dependency>
<groupId>實際項目</groupId>
     <artifactId>模塊</artifactId>
     <version>版本</version>
     <type>依賴類型</type>
     <scope>依賴範圍</scope>
     <optional>依賴是否可選</optional>
     <!—主要用於排除傳遞性依賴-->
     <exclusions>
     <exclusion>
        <groupId>…</groupId>
          <artifactId>…</artifactId>
       </exclusion>
     </exclusions>
  </dependency>
<dependencies>
...
</project>
複製代碼
根元素project下的dependencies能夠包含一個或者多個dependency元素,以聲明一個或者多個項目依賴。每一個依賴能夠包含的元素有:
依賴範圍就是用來控制依賴和三種classpath(編譯classpath,測試classpath、運行classpath)的關係,Maven有以下幾種依賴範圍:
<dependency>
<groupId>javax.sql</groupId>
<artifactId>jdbc-stdext</artifactId>
<Version>2.0</Version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
複製代碼
好比一個account-email項目爲例,account-email有一個compile範圍的spring-code依賴,spring-code有一個compile範圍的commons-logging依賴,那麼commons-logging就會成爲account-email的compile的範圍依賴,commons-logging是account-email的一個傳遞性依賴
有了傳遞性依賴機制,在使用Spring Framework的時候就不用去考慮它依賴了什麼,也不用擔憂引入多餘的依賴。Maven會解析各個直接依賴的POM,將那些必要的間接依賴,以傳遞性依賴的形式引入到當前的項目中。
假設A依賴於B,B依賴於C,咱們說A對於B是第一直接依賴,B對於C是第二直接依賴,A對於C是傳遞性依賴。第一直接依賴和第二直接依賴的範圍決定了傳遞性依賴的範圍,以下圖所示,最左邊一行表示第一直接依賴範圍,最上面一行表示第二直接依賴範圍,中間的交叉單元格則表示傳遞依賴範圍。
從上圖中,咱們能夠發現這樣的規律:
## 依賴調解 有時候,當傳遞性依賴形成爲題的時候,就須要清楚地知道該傳遞性依賴是從哪條依賴路徑引入的。這就是依賴調解的做用,依賴調解有兩大原則: 1. 路徑最近者優先 好比項目有A有這樣的依賴關係:A->B->C->X(1.0)、A->D->X(2.0),X是A的傳遞性依賴,可是兩條依賴路徑上有兩個版本的X,因此根據第一原則,A->D->X(2.0)路徑短,因此X(2.0)會被解析使用 2. 第一聲明者優先 若是路徑都同樣長的話,第一原則就不行了,好比 A->B->Y(1.0)、A->C->Y(2.0),Y(1.0)和Y(2.0)的路徑同樣,因此這時候根據第二原則,先聲明的被解析。
## 可選依賴
如圖,項目中A依賴B,B依賴於X和Y,若是全部這三個的範圍都是compile的話,那麼X和Y就是A的compile範圍的傳遞性依賴,可是若是我想X,Y不做爲A的傳遞性依賴,不給他用的話。就須要下面提到的配置可選依賴。
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.juvenxu.mvnbook</groupId>
<artifactId>project-b</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</groupId>
<version>8.4-701.jdbc3</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>
複製代碼
配置也簡單,在依賴裏面添加
<optional>true</optional>
複製代碼
就表示可選依賴了,這樣A若是想用X,Y就要直接顯示的添加依賴了。
有時候你引入的依賴中包含你不想要的依賴包,你想引入本身想要的,這時候就要用到排除依賴了,好比下圖中spring-boot-starter-web自帶了logback這個日誌包,我想引入log4j2的,因此我先排除掉logback的依賴包,再引入想要的包就好了
排除依賴代碼結構:
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
複製代碼
這裏注意:聲明exclustion的時候只須要groupId和artifactId,而不須要version元素,這是由於只須要groupId和artifactId就能惟必定位依賴圖中的某個依賴。
有時候咱們引入的不少依賴包,他們都來自同一個項目的不一樣模塊,因此他們的版本號都同樣,這時候咱們能夠用屬性來統一管理版本號
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.juven.mvnbook.account</groupId>
<artifactId>accout-email</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<springframework.version>1.5.6</springframework.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${springframework.version}</version>
</dependency>
</dependencies>
</project>
複製代碼
如圖所示,先經過
</properties>
這裏定義你先要的版本
</properties>
複製代碼
來定義,而後在下面依賴使用${}來引入你的屬性。
這節將介紹倉庫的由來、佈局、分類、配置、內部工做機制、鏡像等概念
在Maven世界中,任何一個依賴、插件或者項目構建的輸出,均可以稱爲構件。得益於座標機制,任何Maven項目使用任何一個構件的方式都是徹底相同的。在此基礎上,Maven能夠在某個位置統一存儲全部Maven項目共享的構件,這個統一的位置就是倉庫。
實際的Maven項目將再也不各自存儲其依賴文件,它們只須要聲明這些依賴的座標,在須要的時候(例如,編譯項目的時候須要將依賴加入到classpath中),Maven會自動根據座標找到倉庫中的構件,並使用它們。
爲了實現重用,項目構建完畢後可生成的構件也能夠安裝或者部署到倉庫中,供其餘項目使用。
任何一個構件都有其惟一的座標,根據這個座標能夠定義其在倉庫中的惟一存儲路徑,這即是Maven的倉庫佈局方式。 該路經與座標對應關係爲groupId/artifactId/version/artifactId-version.packaging。 舉個例子,好比下面這個分頁插件依賴以下:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
複製代碼
那他對應的倉庫的路徑就是這樣:
Maven倉庫是基於簡單文件系統存儲的,咱們也理解其存儲方式、所以,當遇到一些與倉庫相關的問題時,能夠很方便的查找相關文件,方便定位問題。
通常來講,在Maven項目目錄下,沒有諸如lib/這樣用來存放依賴文件的目錄。當Maven在執行編譯或測試時,若是須要使用依賴文件,它老是基於座標使用本地倉庫的依賴文件。
默認狀況下,無論在Window仍是Linux下,每一個用戶在本身用戶目錄下都有一個路徑名爲.m2/repository/的倉庫目錄。 若是你想自定義本地倉庫目錄地址。你能夠編輯文件~/.m2/settings.xml,設置localRepository元素的值爲想要的倉庫地址,例如:
<settings>
<localRepository>D:\java\repository\</localRepository>
</settings>
複製代碼
這樣,該用戶的本地倉庫地址就被設置成了 D:\java\repository\。 須要注意的是,默認狀況下,~/.m2/settings.xml文件不存在,用戶須要從Maven安裝目錄複製$M2_HOME/conf/settings.xml文件再進行編輯。
因爲最原始的本地倉庫是空的,Maven必須知道至少一個可用的遠程倉庫,才能在執行Maven命令的時候下載到須要的構件。中央倉庫就是這樣一個默認的遠程倉庫,Maven的安裝文件自帶了中央倉庫的配置。
中央倉庫包含了這個世界上絕大多數流行的開源Java構件,以及源碼、做者信息、SCM,信息、許可證信息等,每月這裏都會接受全世界Java程序員大概1億次的訪問,它對全世界Java開發者的貢獻因而可知一斑。
私服是一種特殊的遠程倉庫,它是架設在局域網內的倉庫服務,私服代理廣域網上的遠程倉庫,供局域網內的Maven用戶使用。當Maven須要下載構件的時候,它從私服請求,若是私服上不存在該構件,則從外部的遠程倉庫下載,緩存在私服上以後,再爲Maven的下載請求提供服務。所以,一些沒法從外部倉庫下載到的構件也能從本地上傳到私服上供你們使用。 私服的好處:
在平時的開發中,咱們每每不會使用默認的中央倉庫,默認的中央倉庫訪問的速度比較慢,訪問的人或許不少,有時候也沒法知足咱們項目的需求,可能項目須要的某些構件中央倉庫中是沒有的,而在其餘遠程倉庫中有,如JBoss Maven倉庫。這時,能夠在pom.xml中配置該倉庫,代碼以下:
<!-- 配置遠程倉庫 -->
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.com/maven2/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
<layout>default</layout>
</repository>
</repositories>
複製代碼
大部分的遠程倉庫不須要認證,可是若是是本身內部使用,爲了安全起見,仍是要配置認證信息的。 配置認證信息和配置遠程倉庫不一樣,遠程倉庫能夠直接在pom.xml中配置,可是認證信息必須配置在settings.xml文件中。這是由於pom每每是被提交到代碼倉庫中供全部成員訪問的,而settings.xml通常只存在於本機。所以,在settings.xml中配置認證信息更爲安全。
<settings>
2 ...
3 <!--配置遠程倉庫認證信息-->
4 <servers>
5 <server>
6 <id>releases</id>
7 <username>admin</username>
8 <password>admin123</password>
9 </server>
10 </servers>
11 ...
12 </settings>
複製代碼
這裏除了配置帳號密碼以外,值關鍵的就是id了,這個id要跟你在pom.xml裏面配置的遠程倉庫repository的id一致,正是這個id將認證信息與倉庫配置聯繫在了一塊兒。
咱們本身搭建遠程倉庫的目的就是爲了能夠方便部署咱們本身項目的構件以及一些沒法從外部倉庫直接獲取的構件。這樣才能在開發時,供其餘對團隊成員使用。 Maven除了能對項目進行編譯、測試、打包以外,還能將項目生成的構件部署到遠程倉庫中。首先,須要編輯項目的pom.xml文件。配置distributionManagement元素,代碼以下:
<distributionManagement>
<repository>
<id>releases</id>
<name>public</name>
<url>http://59.50.95.66:8081/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Snapshots</name>
<url>http://59.50.95.66:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
複製代碼
看代碼,從命名上就看的出來區別,repository表示表示發佈版本(穩定版本)構件的倉庫,snapshotRepository表示快照版本(開發測試版本)的倉庫。這兩個元素都須要配置id、name和url,id爲遠程倉庫的惟一標識,name是爲了方便人閱讀,關鍵的url表示該倉庫的地址。
配置好了就運行命令mvn clean deploy,Maven就會將項目構建輸出的構件部署到配置對應的遠程倉庫,若是項目當前的版本是快照版本,則部署到快照版本的倉庫地址,不然就部署到發佈版本的倉庫地址。 當前項目是快照仍是發佈版本是經過 true 這個來區分的。忘記的同窗在看看上面的## 遠程倉庫的配置。
若是倉庫X能夠提供倉庫Y存儲的全部內容,那麼就能夠認爲X是Y的一個鏡像。用過Maven的都知道,國外的中央倉庫用起來太慢了,因此選擇一個國內的鏡像就頗有必要,我推薦國內的阿里雲鏡像。 阿里雲鏡像:配置很簡單,修改conf文件夾下的settings.xml文件,添加以下鏡像配置:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
複製代碼
上例子中,的值爲central,表示該配置爲中央庫的鏡像,任何對於中央倉庫的請求都會轉至該鏡像,用戶也能夠用一樣的方法配置其餘倉庫的鏡像
這裏介紹下<mirrorOf>
配置的各類選項
<mirrorOf>*<mirrorOf>
:匹配全部遠程倉庫。<mirrorOf>external:*<mirrorOf>
:匹配全部遠程倉庫,使用localhost的除外,使用file://協議的除外。也就是說,匹配全部不在本機上的遠程倉庫。<mirrorOf>repo1,repo2<mirrorOf>
:匹配倉庫repo1h和repo2,使用逗號分隔多個遠程倉庫。<mirrorOf>*,!repo1<mirrorOf>
:匹配全部遠程倉庫,repo1除外,使用感嘆號將倉庫從匹配中排除。須要注意的是,因爲鏡像倉庫徹底屏蔽了被鏡像倉庫,當鏡像倉庫不穩定或者中止服務的時候,Maven仍將沒法訪問被鏡像倉庫,於是將沒法下載構件。
這裏介紹2個提供倉庫服務搜索的地址:
暫時先這樣,後面繼續補充更新本篇,關於私服搭建的會另外開一片介紹。 本篇基於《Maven實戰》整理提煉。須要電子書小夥伴可關注博主微信公衆號:嘟爺java超神學堂(javaLearn)回覆關鍵字 maven
獲取電子書。