一個 基於Java平臺 的 自動化構建工具 ,幫助咱們管理jar包和拆分項目,其餘相似的構建工具備 make-ant-maven-gradle。html
基於Java平臺:安裝maven前必定要配置好JDK環境。java
自動化構建工具:eclipse就是自動化構建工具,幫助咱們把java編譯爲class文件。spring
(1)下載JDK並配置環境變量apache
(2)下載maven(http://maven.apache.org/download.cgi)api
(3)解壓安裝包,並配置maven環境變量tomcat
a、配置MAVEN_HOME : D:\apache-maven-3.6.3\bineclipse
b、配置path:%MAVEN_HOME%\binmaven
ide
以上三步就已經成功安裝了maven,但爲了讓你的maven使用經歷更加暢快,你還須要作出如下一些小修改。工具
(1)增長Maven鏡像
Maven 倉庫默認在國外, 國內使用不免很慢,咱們能夠更換爲阿里雲的倉庫。
Maven安裝目錄下,找 conf ----->settings.xml,在 mirrors 標籤下加入下面內容
<mirror> <!--This sends everything else to /public --> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
(2)修改本地倉庫位置
Maven默認本地倉庫地址在C盤,隨着項目的增長,這無疑會使得C盤變的臃腫,能夠修改C盤的路徑。
Maven安裝目錄下,找 conf ----->settings.xml,修改 localRepository 標籤中的地址到你開心的位置。
<localRepository>F:/soft/MVN_repository</localRepository>
(3)修改IDE的配置,使本地倉庫生效
Eclipse:Windows---->Preferences---->Maven---->User Settings---->Global Settings選擇你以前配置的settings.xml
Idea:File---->Settings---->Maven---->User settings file選擇你以前配置的settings.xml
安裝完成後,不要先着急使用,還有一些知識須要你進行了解,以便於你更好的使用Maven。
Maven生命週期總的來分爲clean,build,site三大部分,其中build又依次包括validate--->compile--->Test--->package--->verify--->install--->deploy,本篇文章比較偏向於實踐,具體的生命週期的知識筆者再也不贅述(生命週期的知識比較偏理論,但也挺重要的,仍是但願你們自行了解下,https://www.runoob.com/maven/maven-build-life-cycle.html),生命週期的一些階段對應着Maven的一些經常使用命令,
命令 | 描述 |
---|---|
mvn clean | 刪除target目錄(刪除編譯文件的目錄) |
mvn compile | 只編譯main目錄中的java文件 |
mvn test | 執行test目錄下的測試用例 |
mvn package | 將編譯後的代碼打包成可分發格式的文件,好比JAR、WAR或者EAR文件。 |
mvn install | 安裝項目包到本地倉庫,這樣項目包能夠用做其餘本地項目的依賴 |
值得注意的是,每個命令執行時,該命令以前以及包括該命令在內的全部命令都會被執行,好比執行了mvn install,前邊的五條命令也都會被執行。
爲了方便理解,先對常見的pom文件結構進行講解,掌握了下邊的文件結構,基本上你就能夠關掉本篇博文,使用maven進行開發了,但若是你對此並不知足,能夠繼續向下看。
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <!--聲明項目描述符遵循哪個POM模型版本。模型自己的版本不多改變,
雖然如此,但它仍然是必不可少的,這是爲了當Maven引入了新的特性或者其餘模型變動的時候,確保穩定性。 --> <modelVersion>4.0.0</modelVersion> <!-- 公司或者組織的惟一標誌,而且配置時生成的路徑也是由今生成,
如com.liu.learning,maven會將該項目打成的jar包放本地倉庫下的:/com/liu/learning 目錄下下--> <groupId>com.liu.learning</groupId> <!-- 項目的惟一ID,一個groupId下面可能多個項目,就是靠artifactId來區分的 --> <artifactId>HelloWorld01</artifactId> <!-- 版本號 --> <version>0.0.1-SNAPSHOT</version> <!--項目的名稱, Maven產生的文檔用 --> <name>HelloWorld01</name> <!--項目產生的構件類型,例如jar、war、ear、pom。 --> <packaging>jar</packaging> <!--項目描述 --> <description>hello world</description> <!-- 統一JDK版本 --> <profiles> <profile> <id>jdk-1.8</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> </profile> </profiles> <dependencies> <!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <!-- jar包的做用範圍,相關知識會摘出來單獨講解 --> <scope>test</scope> </dependency> </dependencies> </project>
經常使用的三個分別是compile,test,provided 做用範圍以下表:
階段 \ scope | compile | test | provided |
---|---|---|---|
編譯 | √ | × | √ |
測試 | √ | √ | √ |
部署(運行) | √ | × | × |
缺省值,若是不顯式聲明默認爲compile,適用於全部階段,會隨着項目一塊兒發佈。
jar包只在測試階段須要,常見的jar好比說junit
jar包只在編譯和測試時須要,這種比較少見,好比說servlet-api.jar,編譯和測試時須要servlet 環境,但運行時由tomcat提供servlet環境,就不須要servlet-api.jar了
假如說咱們須要用到A.jar,可是A.jar中又用到了B.jar,Maven會自動幫咱們引入B.jar,最多見的例子就是spring-context.jar 了,你們能夠自行嘗試將下邊依賴引入,Maven不只會將spring-context.jar引入,還會將spring-aop.jar,spring-beans.jar等其餘jar包一併引入。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.6.RELEASE</version> </dependency>
但若是咱們確實用不到其餘jar但Maven又幫咱們引入了,那該怎們辦呢?
<!-- 方法一 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.6.RELEASE</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> </exclusion> </exclusions> </dependency> <!-- 方法二 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.6.RELEASE</version> <exclusions> <exclusion> <groupId>*</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency>
在數學上,若A依賴於B,B依賴於C,那麼A依賴於C成立,但在Maven中還須要添加一個條件,要使 A.jar依賴於C.jar,當且僅當 B.jar 依賴於C.jar的範圍是compile。
建立maven項目A,B,其中B中引入junit.jar,而後將B用mvn install安裝到本地倉庫,再將B引入到A,改變junit的scope觀察A中是否引入junit。
實驗過程如上,讀者可自行實驗。
咱們再來看下邊三個案例,
(1)同一POM中引入同一jar包的不一樣版本時(不推薦這樣作),會使用哪一個版本呢?
(2)項目A->B,B->junit.jar(scope爲compile),同時A->junit.jar,那麼A中又會使用哪一個jar呢?
(3)項目A依賴B和C,B和C都依賴了不一樣版本的junit.jar(scope爲compile),那麼A中會使用哪一個jar呢?
前兩個很好猜,第一個pom文件寫在後邊的jar會覆蓋前邊的jar。第二個會選擇離本身最近的jar,也就是A中本身的jar。第三個同時也遵循 離本身最近的原則,可是二者距離同樣,那怎麼辦呢?POM文件中對B和C的依賴聲明總有前後順序吧,那就採用先聲明那個中的jar。
咱們拋去第一個案例(開發中嚴禁這樣作),來總結下規則:
(1)路徑最近者優先。
(2)第一聲明者優先。
<!-- 第一步:父項目必須聲明爲pom --> <packaging>pom</packaging>
<!-- 第二步:dependencies外層套上dependencyManagement --> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>compile</scope> </dependency> </dependencies> </dependencyManagement>
<!-- 第一步:引入父項目的座標 --> <parent> <groupId>com.liu.learing</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 當前工程的Pom.xml到父工程的Pom.xml之間的 相對路徑 --> <!-- 父項目的pom.xml文件的相對路徑。相對路徑容許你選擇一個不一樣的路徑。默認值是../pom.xml。Maven首先在
構建當前項目的地方尋找父項 目的pom,其次在文件系統的這個位置(relativePath位置),而後在本地倉庫,最後
在遠程倉庫尋找父項目的pom。 --> <relativePath>../parent/pom.xml</relativePath> </parent> <!-- 第二步:寫出要用到父項目的jar包名稱,不用寫版本號 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies>
Maven項目可以識別自身和本地倉庫中的項目,若是項目A依賴項目B,必需要把項目B進行打包安裝放入本地倉庫,而後再在項目A中引入才能使用。可是若是項目A依賴不少個其餘項目,這樣一一打包安裝就比較麻煩了,這就引出了「聚合」。
<!-- 第一步:總項目必須聲明爲pom --> <packaging>pom</packaging> <!-- 第二步:總項目引入子項目地址,子項目 相對 總項目pom文件 的 相對地址 注意:這裏是 子項目 而不是 子項目的pom文件相對總項目pom文件 ,這一點和依賴繼承不一樣 --> <modules> <module>../one</module> <module>../two</module> </modules> <!-- 而後子項目就能夠正常互相引用,而省去了install的步驟 -->
有時候開發項目過程會遇到版本號統一升級的問題,例如junit版本從3.0版本升級成4.12版 這個時候有兩個處理辦法
在pom文件裏統一 ctrl+f 搜索替換一下。
使用pom裏的properties標籤,自定義一個 xxx 標籤,標籤內就是版本號,在須要使用的地方使用 ${xxx} 靈活取出上面定義的值,這個樣子就不用那樣修改多個地方啦
<properties> <junit>4.12</junit> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit}</version> <scope>compile</scope> </dependency> </dependencies>