Maven 是一個項目管理和構建工具
Maven是基於項目對象模型(pom),可以通過一小段描述信息來管理項目的構建,報告和文檔的軟件項目管理工具。
---------------------------------------------------------------------------
Maven :
Bin目錄:包含mvn命令運行的腳本
Boot :包含一個類加載器的框架,maven用它來加載自己的類庫
Conf :配置文件
Lib:maven運行依賴的類庫
----------------------------------------------------------------------------
maven的目錄結構:
Maven的目錄結構
Src(源代碼目錄)
-main
-java
-package
-test
-java
-package
-resource(存放資源文件)
------------------------------------------------------------------------------------------
Maven中的基礎知識
Mvn –v 查看maven版本
mvn -compile 編譯
mvn -test測試
mvn -package 打包
Mvn –clean:y用來刪除target(項目經過編譯的字節碼文件和測試報告)文件
mvn -install:安裝jar到本地倉庫中(可以將jar包發佈到本地倉庫中)
我們通過mvn –compile這個命令來編譯源代碼,如果在編譯的過程中程序用到了其他的支持包,他會去pom.xml查找是否引入該依賴包的座標,如果引入了,那麼maven會先按照在dependency的座標到本地倉庫中去找,如果有,maven將會把該jar加載到該項目classpath中,如果沒有找到該jar包,會按照網上的地址到maven的中央倉庫去找並且下載,下載到本地倉庫,供我們的項目進行使用,如果中央倉庫也找不到就會報錯
----------------------------------------------------------------------------------------------
常用的構建命令的框架
自動創建目錄骨架(maven提供了archetype插件,用於創建符合maven規定的目錄骨架)
創建目錄的兩種方式:
1. archetype:generate 按照提示進行選擇
2. archetype:generate –DgroupId=組織名
-DartifactId=
-Dversion=版本號
-Dpackage=代碼所存在的包
Maven中賦座標和倉庫:(所有構建通過座標做爲其唯一標識)
座標:groupId,artifactId(項目名和模塊名),version
倉庫:用來管理項目的依賴,倉庫分爲本地倉庫,遠程倉庫,maven所有的pom.xml都會繼承一個超級的pom.xml(lib下的maven-model-builder.3.3.3.jar裏面的pom.xml),url標籤裏的地址就是中央倉庫的地址(包含了絕大多數的開源jar)
鏡像倉庫:(鏡像就是a提供和b一樣的功能)maven的中央倉庫的服務器在國外,有時可能無法訪問外網,但是國內有它的鏡像倉庫。
如何修改鏡像倉庫位置,
Maven 中Conf下的settings文件修改mirror
如何更改本地倉庫的位置:修改settings,找到localRepository,把路徑放進去即可
-------------------------------------------------------------------------------------------------
在eclispse中裝maven插件,加載好插件後,建立一個maven項目,
步奏爲new-maven project-next-選擇。。。quickstart,next填寫groupId,artifactId,version,
運行項目:選中Pom.xml右鍵run as maven build,在goals裏面輸入maven命令:如compile編譯項目,package,打包項目(在項目的target目錄下:class文件,測試報告,jar文件)
--------------------------------------------------------------------------------------------------
maven的生命週期
Maven的生命週期
完整的項目構建過程:清理,編譯,測試,打包,集成測試,驗證,部署
Maven生命週期:(定義了三套相互獨立的生命週期,每個生命週期中又包括一些階段,其階段是有順序的,且後面的階段依賴前面的階段,執行某個階段時,其前面的階段會順序執行,但不會觸發另外兩套生命週期的任何階段,例如運行compile這個階段時,package,test會自動的執行)
Clean:清理項目
Default:構建項目
Site:生成項目站點
(1) clean清理項目
階段:pre-clean 執行清理前的工作,
Clean 清理上一次構建生成的所有文件,
Post-clean執行清理後的工作,
(2)Default:構建項目
常用的階段:compile,test,package,install(在運行package這個階段時,是先運行compile和test階段的)
(3) Site:生成項目站點
Site:生成項目站點文檔
Post-site:生成項目站點後要完成的工作
Site-deploy:發佈生成站點到服務----------------------------------------------------------------------------------
Pom.xml常用元素
<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><!-- 指定了當前pom的版本 -->
<!-- 座標元素 -->
<groupId>com.imooc.hi</groupId><!-- 反寫的公司網址+項目名 -->
<artifactId>hi</artifactId><!-- 項目名+模塊名 例如 struts2_01 -->
<version>0.0.1-SNAPSHOT</version><!-- 版本號:一般由三個數字組成,第一個表示大版本號,第二個表示分支版本號,第三個表示小版本號 -->
<packaging>jar</packaging><!-- maven項目的打包方式,默認是jar -->
<name>hi</name><!-- 項目的描述名,產生項目文檔時會使用 -->
<url>http://maven.apache.org</url><!-- 項目的地址 -->
<description></description><!-- 項目的描述 -->
<developers></developers><!-- 開發人員 -->
<licenses></licenses>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 依賴列表 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope><!-- 依賴的範圍,junit的jar只在我們的測試的依賴範圍內有用 -->
<!--maven提供的三種classpath值:編譯,測試,運行,
依賴的範圍就是用來控制依賴與三種classpath的關係的,scope的屬性compile(默認的,對於三種classpath都有效),test(測試範圍有效,如junit),
runtime(測試和運行有效,如jdbc的驅動實現)
,system(編譯和測試有效,與本地系統相關聯),import(只用於dependencyManagement,表示從其他pom繼承過來的依賴),
provided(編譯和測試有效,如當我們構建一個web項目時,
編譯和測試時可以依賴 servlet API,運行時並不會被加入,因爲web容器已經包含servlet API),具體查看maven官網文檔
-->
<optional></optional><!-- true 和false用來設置依賴是否可選,默認是false,如果是false,子項目默認是繼承的 -->
<exclusions><!-- 排除依賴傳遞的列表 -->
<exclusion></exclusion><!-- 比如a依賴b,b依賴c,那麼c對於a來說就是傳遞依賴,如果a不想依賴c,就可以使用這個標籤 -->
<!-- -->
</exclusions>
</dependency>
</dependencies>
<!-- 依賴的管理,它不會被運行 ,不會被引入到實際的依賴中,主要是定義在父模塊中,供子模塊所繼承用的,即公共的 -->
<dependencyManagement>
<dependencies></dependencies>
</dependencyManagement>
<!-- ,對構建的行爲提供相應的支持-->
<build>
<!-- 插件 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
<!-- 運行package命令時就能將source的源碼打包,綁定source到default生命週期的package階段 -->
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!-- 通常用於子模塊中對父模塊的pom的繼承 -->
<!-- <parent></parent> -->
<!-- 是用來聚合運行多個的maven項,如果有很多的maven模塊需要編譯,就不需要一個個編譯 -->
<modules></modules>
</project>
------------------------------------------------------------------------------------------------
依賴的範圍scope
maven提供的三種classpath值:編譯,測試,運行,
依賴的範圍就是用來控制依賴與三種classpath的關係的,scope的屬性compile(默認的,對於三種classpath都有效),test(測試範圍有效,如junit),
runtime(測試和運行有效,如jdbc的驅動實現)
,system(編譯和測試有效,與本地系統相關聯),import(只用於dependencyManagement,表示從其他pom繼承過來的依賴),
provided(編譯和測試有效,如當我們構建一個web項目時,
編譯和測試時可以依賴 servlet API,運行時並不會被加入,因爲web容器已經包含servlet API),具體查看maven官網文檔
------------------------------------------------------------------------------------------------------
依賴衝突:短路優先,例如:
A->B->C->X(jar)
A->D->X(jar)這個會優先解析
在依賴路徑長度相同的情況下,先聲明dependency先優先
------------------------------------------------------------------------------------------------------
聚合與繼承
聚合:是用來聚合運行多個的maven項,如果有很多的maven模塊需要編譯,就不需要一個個編譯
<modules>
<module>../hongxing-nage</module>
<module>../hongxing-bge</module>
<module>../hongxing-shanji</module>
</modules>
繼承:
<parent>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
----------------------------------------------------------------------------------------------------
使用maven構建web項目:
使用maven新建maven項目,發佈到tomcat中
首先在建立時選擇maven-archetype-webapp
2. 導入servlet依賴
3. 檢查classes文件的輸出路徑,項目輸出路徑在項目的target目錄的classes(項目右鍵->bulidpath->config build path->source)
4. 將項目轉換爲web項目並添加文件夾構建maven目錄結構:
項目右鍵->properties-project facets->dynamic web module(勾選)
5. 更改項目部署時的默認配置:
項目右鍵->properties->deployment Assemby-> (部署時不需要發佈test文件,如果有,則移除)
6.添加tomcat
可以使用項目右鍵-run as –maven build..-tomcat:run(或 clean package)啓動tomcat服務
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sj.webapp</groupId>
<artifactId>webDemo2</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>webDemo2 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>webDemo2</finalName>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<!-- 在打包成功後使用tomcat:run來運行tomcat服務 -->
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>