Maven核心概念

項目對象模型(POM)
座標
依賴管理
倉庫管理
生命週期
插件和目標

聚合繼承




什麼是座標?
›在平面幾何中座標(x,y)可以標識平面中唯一的一點
Maven座標主要組成
›groupId:定義當前Maven項目隸屬項目
›artifactId:定義實際項目中的一個模塊
›version:定義當前項目的當前版本
›packaging:定義該項目的打包方式
Maven爲什麼使用座標?
›Maven世界擁有大量構建,我們需要找一個用來唯一標識一個構建的統一規範
›擁有了統一規範,就可以把查找工作交給機器


依賴配置

依賴聲明主要包含如下元素:


<dependencies>


<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>

</dependencies>


其中依賴範圍scope 用來控制依賴和編譯,測試,運行的classpath的關係. 主要的是三種依賴關係如下:


1.compile: 默認編譯依賴範圍。對於編譯,測試,運行三種classpath都有效
2.test:測試依賴範圍。只對於測試classpath有效
3.provided:已提供依賴範圍。對於編譯,測試的classpath都有效,但對於運行無效。因爲由容器已經提供,例如servlet-api
4.runtime:運行時提供。例如:jdbc驅動


傳遞性依賴:


見傳遞依賴圖




傳遞性依賴原則:


A-->B
A-->C


1.路徑最近者優先
2.路徑相同,第一聲明者優先


注意:
1.dependencyManagement中定義的依賴子module不會共享
2.dependencies中定義的依賴子module可以共享




可選依賴不被傳遞




依賴優化:mvn dependency:list



倉庫管理


何爲Maven倉庫?
用來統一存儲所有Maven共享構建的位置就是倉庫
Maven倉庫佈局
根據Maven座標定義每個構建在倉庫中唯一存儲路徑
大致爲:groupId/artifactId/version/artifactId-version.packaging
倉庫的分類
本地倉庫
~/.m2/repository/
每個用戶只有一個本地倉庫
遠程倉庫
中央倉庫:Maven默認的遠程倉庫
http://repo1.maven.org/maven2
私服:是一種特殊的遠程倉庫,它是架設在局域網內的倉庫

鏡像:用來替代中央倉庫,速度一般比中央倉庫快

生命週期

何爲生命週期?
Maven生命週期就是爲了對所有的構建過程進行抽象和統一
包括項目清理,初始化,編譯,打包,測試,部署等幾乎所有構建步驟
Maven三大生命週期
clean:清理項目的
default:構建項目的
site:生成項目站點的

生命週期Maven有三套相互獨立的生命週期,請注意這裏說的是“三套”,而且“相互獨立”,這三套生命週期分別是:

Clean Lifecycle 在進行真正的構建之前進行一些清理工作。
Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。
Site Lifecycle 生成項目報告,站點,發佈站點。
再次強調一下它們是相互獨立的,你可以僅僅調用clean來清理工作目錄,僅僅調用site來生成站點。當然你也可以直接運行 mvn clean install site 運行所有這三套生命週期。

clean生命週期每套生命週期都由一組階段(Phase)組成,我們平時在命令行輸入的命令總會對應於一個特定的階段。比如,運行mvn clean ,這個的clean是Clean生命週期的一個階段。有Clean生命週期,也有clean階段。Clean生命週期一共包含了三個階段:

pre-clean 執行一些需要在clean之前完成的工作
clean 移除所有上一次構建生成的文件
post-clean 執行一些需要在clean之後立刻完成的工作
mvn clean 中的clean就是上面的clean,在一個生命週期中,運行某個階段的時候,它之前的所有階段都會被運行,也就是說,mvn clean 等同於 mvn pre-clean clean ,如果我們運行 mvn post-clean ,那麼 pre-clean,clean 都會被運行。這是Maven很重要的一個規則,可以大大簡化命令行的輸入。

Site生命週期pre-site 執行一些需要在生成站點文檔之前完成的工作
site 生成項目的站點文檔
post-site 執行一些需要在生成站點文檔之後完成的工作,並且爲部署做準備
site-deploy 將生成的站點文檔部署到特定的服務器上
這裏經常用到的是site階段和site-deploy階段,用以生成和發佈Maven站點,這可是Maven相當強大的功能,Manager比較喜歡,文檔及統計數據自動生成,很好看。

Default生命週期Default生命週期是Maven生命週期中最重要的一個,絕大部分工作都發生在這個生命週期中。這裏,只解釋一些比較重要和常用的階段:

validate
generate-sources
process-sources
generate-resources
process-resources 複製並處理資源文件,至目標目錄,準備打包。
compile 編譯項目的源代碼。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 複製並處理資源文件,至目標測試目錄。
test-compile 編譯測試源代碼。
process-test-classes
test 使用合適的單元測試框架運行測試。這些測試代碼不會被打包或部署。
prepare-package
package 接受編譯好的代碼,打包成可發佈的格式,如 JAR 。
pre-integration-test
integration-test
post-integration-test
verify
install 將包安裝至本地倉庫,以讓其它項目依賴。
deploy 將最終的包複製到遠程的倉庫,以讓其它開發人員與項目共享。
運行任何一個階段的時候,它前面的所有階段都會被運行,這也就是爲什麼我們運行mvn install 的時候,代碼會被編譯,測試,打包。此外,Maven的插件機制是完全依賴Maven的生命週期的,因此理解生命週期至關重要。 

聚合與繼承

何爲聚合?
如果我們想一次構建多個項目模塊,那我們就需要對多個項目模塊進行聚合
<modules><module>…</module></modules>
何爲繼承?
繼承爲了消除重複,我們把很多相同的配置提取出來
例如:grouptId,version等
聚合與繼承的關係
聚合主要爲了快速構建項目
繼承主要爲了消除重複


一,聚合配置代碼:


<modules>
  <module>../Hello</module>  
  <module>../HelloFriend</module>
  <module>../MakeFriends</module>
</modules>


其中module的路徑爲相對路徑。




二,繼承配置代碼:


<parent>  
      <groupId>cn.itcast.maven</groupId>
  <artifactId>Project</artifactId>
  <version>0.0.1-SNAPSHOT</version>
        <relativePath>../Project/pom.xml</relativePath>  
</parent>


三,繼承代碼過程中,可以定義屬性


<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <junit.version>4.9</junit.version>
    <maven.version>0.0.1-SNAPSHOT</maven.version>
</properties>


訪問屬性的方式爲${junit.version},例如:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>




四,將父模塊中將用dependencyManagement進行管理


<dependencyManagement>
    <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
    <groupId>cn.itcast.maven</groupId>
    <artifactId>HelloFriend</artifactId>
    <version>${maven.version}</version>
    <type>jar</type>
    <scope>compile</scope>
  </dependency>
   
     </dependencies>
  </dependencyManagement>


這樣的好處是子模塊可以有選擇行的繼承,而不需要全部繼承。

依賴管理
依賴聲明主要包含如下元素:


<dependencies>


<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>

</dependencies>


其中依賴範圍scope 用來控制依賴和編譯,測試,運行的classpath的關係. 主要的是三種依賴關係如下:


1.compile: 默認編譯依賴範圍。對於編譯,測試,運行三種classpath都有效
2.test:測試依賴範圍。只對於測試classpath有效
3.provided:已提供依賴範圍。對於編譯,測試的classpath都有效,但對於運行無效。因爲由容器已經提供,例如servlet-api
4.runtime:運行時提供。例如:jdbc驅動


傳遞性依賴:


見傳遞依賴圖


傳遞性依賴原則:


A-->B
A-->C


1.路徑最近者優先
2.路徑相同,第一聲明者優先


注意:
1.dependencyManagement中定義的依賴子module不會共享
2.dependencies中定義的依賴子module可以共享




可選依賴不被傳遞


依賴優化:mvn dependency:list



Maven插件

插件目標
Maven的核心僅僅定義了抽象的生命週期,具體的任務都是交由插件完成的
每個插件都能實現多個功能,每個功能就是一個插件目標
Maven的生命週期與插件目標相互綁定,以完成某個具體的構建任務
例如compile就是插件maven-compiler-plugin的一個插件目標

Maven與Eclipse整合

如何安裝?
zest插件安裝
m2e插件安裝
m2e-extras插件安裝

Maven安裝

配置maven


如何使用?
新建項目

javaProject

第一步:首先導入前面命令行建立的兩個maven項目Hello和HelloFriend。
方法:選擇file-->import-->Existing MAVEN PROJECTS選項選擇對應項目路徑導入即可

第二步:按順序先後執行Hello和HelloFriend項目的的構建
方法:右擊各自項目pom.xml文件,選擇run as中的maven install命令將構件安裝至倉庫中


第三步:通過eclipse新建第三個maven項目。選擇file-->new-->other-->MAVEN PROJECT選項

第四步:在src/main/java中新建文件cn.itcast.maven.MakeFriends.java

package cn.itcast.maven;

public class MakeFriends {

public String makeFriends(String name){

HelloFriend friend = new HelloFriend();
friend.sayHelloToFriend("litingwei");
String str = "Hey,"+friend.getMyName()+" make a friend please.";
System.out.println(str);
return str;
}
}


第五步:在src/test/java中新建文件cn.itcast.maven.MakeFriendsTest.java

package cn.itcast.maven;

import static junit.framework.Assert.assertEquals;
import static org.junit.Assert.*;

import org.junit.Test;

public class MakeFriendsTest {

@Test
public void testMakeFriends(){
MakeFriends makeFriend = new MakeFriends();
String str = makeFriend.makeFriends("litingwei");
assertEquals("Hey,John make a friend please.",str);

}
}

第六步:點擊根目錄pom.xml添加依賴

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.itcast.maven</groupId>
<artifactId>HelloFriend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
</dependency>

</dependencies>

第七步:右擊pom.xml選擇run as 中的命令執行即可

WebProject

第一步:
創建maven web工程

第二步:
繼承parent
修改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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.itcast.maven</groupId>
<artifactId>web</artifactId>
<packaging>war</packaging>
<name>web Maven Webapp</name>
<url>http://maven.apache.org</url>

<parent>
<groupId>cn.itcast.maven</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-RELEASE</version>
<relativePath>../Parent/pom.xml</relativePath>
</parent>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>cn.itcast.maven</groupId>
<artifactId>MakeFriends</artifactId>
</dependency>
</dependencies>

</project>

第三步:
建立測試jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="cn.itcast.maven.MakeFriends.*"%>
<%
MakeFriends makeFriends=new MakeFriends();
out.println(makeFriends.makeFriends("wanglipeng"));
%>

第四步:
自動部署到tomcat下面
<build>
<finalName>web</finalName>
<plugins>
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.2.3</version>
<configuration>
<container>
<containerId>tomcat5x</containerId>
<home>D:/Program Files/Apache Software Foundation/Tomcat 5.0</home>
</container>
<configuration>
<type>existing</type>
<home>D:/Program Files/Apache Software Foundation/Tomcat 5.0</home>
</configuration>
</configuration>
<executions>
<execution>
<id>cargo-run</id>
<phase>install</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

第五步:
模塊聚合
修改parent.pom

導入Maven項目


執行mvn命令




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章