Maven是一個項目管理和綜合工具。Maven提供了開發人員構建一個完整的生命週期框架。開發團隊能夠自動完成項目的基礎工具建設,Maven使用標準的目錄結構和默認構建生命週期。html
在多個開發團隊環境時,Maven能夠設置按標準在很是短的時間裏完成配置工做。因爲大部分項目的設置都很簡單,而且可重複使用,Maven讓開發人員的工做更輕鬆,同時建立報表,檢查,構建和測試自動化設置。java
歸納地說,Maven簡化和標準化項目建設過程。處理編譯,分配,文檔,團隊協做和其餘任務的無縫鏈接。 Maven增長可重用性並負責創建相關的任務。web
安裝須要Java支持(JDK >= 1.7)。apache
官方下載地址:http://maven.apache.org/download.cgitomcat
解壓壓縮包至目錄,個人安裝位置:D:\apache-maven-3.5.4app
『計算機』-->『右鍵屬性』-->『高級系統設置』-->『環境變量』-->『系統變量』框架
依次肯定,退出配置。yii
打開Maven目錄,./conf/settings.xmlwebapp
添加配置maven
<localRepository>D:/mavenRepository/repository</localRepository>
localRepository 標籤包含的就是本地存儲庫的地址。
因爲中央存儲庫在國外,國內可能打不開,因此在 mirrors 標籤中添加阿里雲鏡像倉庫配置。
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
打開CMD窗口,輸入命令: mvn -v
出現如下內容,說明Maven安裝成功。
首先說明Maven約定的目錄結構:
├─ src
│ ├─ main 存放主程序
│ │ ├─ java 存放Java源文件
│ │ ├─ resources 存放框架或其餘工具的配置文件
│ ├─ test 存放測試程序
│ │ ├─ java 存放Java測試的源文件
│ │ ├─ resources 存放測試的配置文件
├─pom.xml Maven工程的核心配置
這裏我直接使用IntelliJ IDEA建立Maven項目。
這裏能夠不勾選 create from archetype 直接建立,使用標準的模板(初始不作web測試,不須要使用此模板),這裏我選擇使用webapp模板(初始文件建立,能夠參考我下面的構建WEB項目)。
這裏在Properties中添加一個參數archetypeCatalog=internal
信息輸入完後點擊Finish,至此Maven項目就建立完了,由於咱們選擇的是webapp,全部有些Maven約定的目錄須要咱們手動建立補全。
建立Maven項目maven01
配置pom.xml
<?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.maven01</groupId> <artifactId>maven01</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>maven01 Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>maven01</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.0.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.20.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.0</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build> </project>
在maven01/src/main/java建立包 com.maven01.model
建立HelloWorld.java
package com.maven01.model; public class HelloWorld { public String sayHello() { return "Hello World !!"; } }
在maven01/src/test/java建立包 com.maven01.model
建立HelloWorldTest.java
package com.maven01.model; import org.junit.*; import org.junit.Assert.*; public class HelloWorldTest { @Test public void testHello() { Assert.assertEquals("Hello World !!", new HelloWorld().sayHello()); } }
打開CMD,跳轉當前位置至項目目錄。
運行命令: mvn compile
第一次運行會下載不少資源。
出現BUILD SUCCESS說明編譯成功:
運行命令: mvn test
第一次運行一樣會下載依賴資源。
出現BUILD SUCCESS說明運行成功:
建立Maven項目maven02
配置pom.xml
<?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.maven02</groupId> <artifactId>maven02</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>maven02 Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>maven02</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.0.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.20.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.0</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build> </project>
在maven02/src/main/java建立包 com.maven02.util
建立Speak.java
package com.maven02.util; import com.maven01.model.HelloWorld; public class Speak { public String sayHi() { return new HelloWorld().sayHello(); } }
在maven02/src/test/java建立包 com.maven01.util
建立SpeakTest.java
package com.maven02.util; import org.junit.Assert; import org.junit.Test; public class SpeakTest { @Test public void testsayHi() { Assert.assertEquals("Hello World !!", new Speak().sayHi()); } }
這時咱們使用編譯命令,嘗試編譯maven02會發現報錯:
跳轉盤符至maven01目錄
運行命令: mvn install
將maven01的jar包安裝到本地倉庫中
從新配置maven02的pom.xml
<?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.maven02</groupId> <artifactId>maven02</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>maven02 Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>com.maven01</groupId> <artifactId>maven01</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> <build> <finalName>maven02</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.0.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.20.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.0</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build> </project>
從新編譯maven02
運行命令: mvn dependency:tree
建立文件夾maven03
跳轉盤符至maven03目錄
運行命令: mvn archetype:generate
運行成功後會發現,目錄已經自動構建了出來:
├─maven0301-service
│ │ pom.xml
│ │
│ └─src
│ ├─main
│ │ └─java
│ │ └─com
│ │ └─maven0301
│ │ └─service
│ │ App.java
│ │
│ └─test
│ └─java
│ └─com
│ └─maven0301
│ └─service
│ AppTest.java
跳轉盤符至maven03目錄
運行命令: mvn archetype:generate -DgroupId=com.maven0302 -DartifactId=maven0302-demo -Dversion=1.0-SNAPSHOT -Dpackage=com.maven0302.demo
└─maven0302-demo
│ pom.xml
│
└─src
├─main
│ └─java
│ └─com
│ └─maven0302
│ └─demo
│ App.java
│
└─test
└─java
└─com
└─maven0302
└─demo
AppTest.java
在Maven中,任何一個依賴、插件或者項目構建的輸出,均可以稱之爲構件。
每一個構建的位置,表明了一個座標。
pom.xml的依賴配置 groupId 、 artifactId 、 version 便可標識一個座標。
關於倉庫的詳解你們能夠參考此博文,介紹的很詳細!
倉庫默認配置位置:%MAVEN_HOME%\lib\maven-model-builder-x.x.x.jar\org\apache\maven\model\pom-4.0.0.xml
關於生命週期和插件的詳解你們能夠參考此博文,介紹的很詳細!
maven 項目不一樣的階段引入到classpath中的依賴是不一樣的,例如,編譯時,maven 會將與編譯相關的依賴引入classpath中,測試時,maven會將測試相關的的依賴引入到classpath中,運行時,maven會將與運行相關的依賴引入classpath中,而依賴範圍就是用來控制依賴於這三種classpath的關係。
在pom.xml依賴管理 dependency 有個設置依賴範圍的標籤 scope
關於依賴範圍的設置,官方文檔有詳細說明。
我新建了三個項目分別爲:dependA、dependB、dependC
它們的依賴關係爲:dependC ----> dependB ----> dependA
dependA的pom.xml
<?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.maven.dependA</groupId> <artifactId>dependA</artifactId> <version>1.0-SNAPSHOT</version> </project>
dependB的pom.xml
<?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.maven.dependB</groupId> <artifactId>dependB</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.maven.dependA</groupId> <artifactId>dependA</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
dependC的pom.xml
<?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.maven.dependC</groupId> <artifactId>dependC</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.maven.dependB</groupId> <artifactId>dependB</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
我分別編譯安裝了它們,能夠看到間接依賴是傳遞的。
dependA的依賴:
dependB的依賴:
dependC的依賴:
所依賴工程中pom.xml能夠傳遞下去。
當第二依賴的範圍scope 爲compile 的時候, 依賴得以傳遞,傳遞性依賴的範圍與第一直接依賴的範圍一致。
當第二依賴的範圍scope 爲test 的時候, 依賴不會得以傳遞。
當第二依賴的範圍是provided的時候,只傳遞第一直接依賴範圍也爲provided的依賴,且傳遞性依賴的範圍一樣爲 provided。
當第二直接依賴的範圍是runtime的時候,傳遞性依賴的範圍與第一直接依賴的範圍一致,但compile例外,此時傳遞的依賴範圍爲runtime。
若是dependC只依賴dependB而不須要依賴dependA,那麼就須要進行依賴排除配置 exclusion
dependC的pom.xml
<?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.maven.dependC</groupId> <artifactId>dependC</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.maven.dependB</groupId> <artifactId>dependB</artifactId> <version>1.0-SNAPSHOT</version> <exclusions> <exclusion> <groupId>com.maven.dependA</groupId> <artifactId>dependA</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </project>
依賴衝突有兩個原則:
依賴關係:
dependA的依賴commons-io的版本爲2.0
dependB的依賴commons-io的版本爲2.1
dependC根據依賴所得到依賴commons-io的版本爲2.1,由於dependC得到commons-io最近爲dependB的依賴,因此使用dependB的版本2.1
依賴關係:
若是dependC同時依賴dependA、dependB,也就是dependC獲取依賴的路徑長度相同了,則誰先在pom.xml中聲明就優先獲取誰的依賴。
如何咱們的項目包含多個模塊咱們一個一個編譯,會太麻煩,咱們能夠建一個聚合項目,經過modules來統一操做。
新建一個Maven項目aggreationABC,這裏我使用 maven-archetype-quickstart
修改aggreationABC的pom.xml配置:
<?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.maven.aggreation</groupId> <artifactId>aggreationABC</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>aggreationABC</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <modules> <module>../dependA</module> <module>../dependB</module> <module>../dependC</module> </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.0.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.20.1</version> </plugin> <plugin> <artifactId>maven-jar-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build> </project>
對aggreationABC進行編譯,發現已經完成聚合了。
繼承能夠複用父類的pom,能夠爲咱們提升pom複用,子模塊能夠經過 parent 標籤來導入要繼承的pom。
依賴繼承採用 dependencyManagement 用來統一管理,在子模塊中須要那個依賴,只須要寫groupId和artifactId就能夠,採用依賴管理既能夠有效的控制依賴,有能在必定程度上避免依賴衝突。
新建一個Maven項目mavenParent:
<?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.maven.parent</groupId> <artifactId>mavenParent</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit.version>4.11</junit.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> </project>
使用dependA來繼承mavenParent,修改dependA的pom.xml添加 parent 標籤來管理繼承:
<?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.maven.dependA</groupId> <artifactId>dependA</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>com.maven.parent</groupId> <artifactId>mavenParent</artifactId> <version>1.0-SNAPSHOT</version> <relativePath>../mavenParent/pom.xml</relativePath> </parent> </project>
至此dependA已繼承mavenParent。
項目的建立能夠參考上面的方式,這裏我說明下具體過程,建立Maven項目,模板使用: maven-archetype-webapp
初始文件結構:
右鍵項目進行設置:
而後OK退出,開始配置tomcat
OK退出,啓動tomcat
mvn -v :查看maven版本
mvn compile :編譯
mvn test :測試
mvn package :打包
mvn clean :刪除target
mvn install :安裝jar包到本地倉庫中
mvn archetype:generate :自動構建目錄
mvn dependency:tree :查看依賴
https://maven.apache.org/index.html
https://www.imooc.com/learn/443
https://www.yiibai.com/maven/
https://www.cnblogs.com/1446358788-qq/articles/9597877.html
https://blog.csdn.net/shycx/article/details/7726600
https://blog.csdn.net/double_sweet1/article/details/79780308
https://www.cnblogs.com/bffc/p/3690993.html
http://how2j.cn/k/idea/idea-maven-web/1356.html
https://blog.csdn.net/wzx735481897/article/details/78158337
https://stackoverflow.com/questions/7600028/maven-error-in-opening-zip-file-when-running-maven
https://www.cnblogs.com/duanxz/p/5210189.html
https://www.cnblogs.com/luotaoyeah/p/3819001.html