日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

彻底理解maven

發(fā)布時(shí)間:2025/3/8 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 彻底理解maven 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言
最近解決jar包沖突問題時(shí),很頭疼,發(fā)現(xiàn)自己對(duì)maven的理解太膚淺了,很多細(xì)節(jié)都一知半解,于是最近又學(xué)習(xí)了一把maven,總結(jié)如下:
基本概念
maven有兩個(gè)最基本的概念: pom和lifecycle, 這里的pom不是maven構(gòu)建過程中使用的pom文件,但他們之間有聯(lián)系。 pom全稱為Project Object Model, 簡單說就是要對(duì)構(gòu)建的項(xiàng)目進(jìn)行建模,將要構(gòu)建的項(xiàng)目看成是一個(gè)對(duì)象Object,既然是一個(gè)對(duì)象,這個(gè)對(duì)象有哪些屬性呢? 在maven中一個(gè)項(xiàng)目使用唯一的坐標(biāo)來表示,它包括groupId, artifactId, version, classifier, type(也叫packaging)這五部分,另外一個(gè)方面,一個(gè)項(xiàng)目肯定不是孤立存在的,可能會(huì)依賴其他項(xiàng)目,也就是說這個(gè)對(duì)象應(yīng)該還有dependencies屬性,用PO表示構(gòu)建對(duì)象,使用java代碼描述這個(gè)對(duì)象的話:

class PO{private String groupId;private String artifactId;private String version;private String classifier;private String type;private Set<PO> dependencies; }

xml具有很強(qiáng)的表達(dá)能力,一個(gè)java對(duì)象可以用xml來描述,用xml表達(dá)上面這個(gè)java對(duì)象可以為:

<PO><groupId></groupId><artifactId></artifactId><version></version><classifier><classifier><type></type><dependencies><PO></PO><PO></PO>...</dependencies> </PO>

這個(gè)是不是和pom.xml很類似? 其實(shí)pom.xml就是PO對(duì)象的xml描述,上面這個(gè)PO定義還不完整,我們知道在java中類是可以繼承的,PO也有繼承關(guān)系,PO對(duì)象存在父類父類對(duì)象,用parent表示,它會(huì)繼承父類對(duì)象的所有屬性。 另一方面,一個(gè)項(xiàng)目可能根據(jù)不同職責(zé)分為多個(gè)模塊(module),所有模塊其實(shí)也就是一個(gè)單獨(dú)的項(xiàng)目,只不過這些項(xiàng)目會(huì)使用其父對(duì)象的一些屬性來進(jìn)行構(gòu)建。我們將這些新的屬性加到PO的定義中去:

class PO{private String groupId;private String artifactId;private String version;private String classifier;private String type;private Set<PO> dependencies;private PO parent;private Set<PO> modules; }

再將這個(gè)定義用XML語言表示一下:

<PO><parent></parent><groupId></groupId><artifactId></artifactId><version></version><classifier><classifier><type></type><dependencies><PO></PO><PO></PO>...</dependencies><modules>...</modules> </PO>

是不是更像pom.xml了? pom.xml其實(shí)就是對(duì)PO對(duì)象的xml描述!!
構(gòu)建
項(xiàng)目的構(gòu)建過程對(duì)應(yīng)的是PO對(duì)象的build屬性,對(duì)應(yīng)pom.xml中也就是<build>元素中的內(nèi)容,這里就有引入maven中第二個(gè)核心概念:Lifecycle。Lifecycle直譯過來就是生命周期。我們平常會(huì)接觸到哪些周期呢?一年中春夏秋冬就是一個(gè)周期。一個(gè)周期中可能分為多個(gè)階段,比如這里的春夏秋冬。在maven中一個(gè)構(gòu)建過程就對(duì)應(yīng)一個(gè)Lifecycle,這個(gè)Lifecycle也分為多個(gè)階段,每個(gè)階段叫做phase。你可能會(huì)問,那這個(gè)Lifecycle中包含多少個(gè)phase呢?一個(gè)標(biāo)準(zhǔn)的構(gòu)建Lifecycle包含了如下的phase:

validate: 用于驗(yàn)證項(xiàng)目的有效性和其項(xiàng)目所需要的內(nèi)容是否具備 initialize:初始化操作,比如創(chuàng)建一些構(gòu)建所需要的目錄等。 generate-sources:用于生成一些源代碼,這些源代碼在compile phase中需要使用到 process-sources:對(duì)源代碼進(jìn)行一些操作,例如過濾一些源代碼 generate-resources:生成資源文件(這些文件將被包含在最后的輸入文件中) process-resources:對(duì)資源文件進(jìn)行處理 compile:對(duì)源代碼進(jìn)行編譯 process-classes:對(duì)編譯生成的文件進(jìn)行處理 generate-test-sources:生成測試用的源代碼 process-test-sources:對(duì)生成的測試源代碼進(jìn)行處理 generate-test-resources:生成測試用的資源文件 process-test-resources:對(duì)測試用的資源文件進(jìn)行處理 test-compile:對(duì)測試用的源代碼進(jìn)行編譯 process-test-classes:對(duì)測試源代碼編譯后的文件進(jìn)行處理 test:進(jìn)行單元測試 prepare-package:打包前置操作 package:打包 pre-integration-test:集成測試前置操作 integration-test:集成測試 post-integration-test:集成測試后置操作 install:將打包產(chǎn)物安裝到本地maven倉庫 deploy:將打包產(chǎn)物安裝到遠(yuǎn)程倉庫

在maven中,你執(zhí)行任何一個(gè)phase時(shí),maven會(huì)將其之前的phase都執(zhí)行。例如 mvn install,那么maven會(huì)將deploy之外的所有phase按照他們出現(xiàn)的順序一次執(zhí)行。
Lifecycle還牽涉到另外一個(gè)非常重要的概念:goal。注意上面Lifecycle的定義,也就是說maven為程序的構(gòu)建定義了一套規(guī)范流程:第一步需要validate,第二步需要initialize... ... compile,test,package,... ... install,deploy,但是并沒有定義每一個(gè)phase具體應(yīng)該如何操作。這里的phase的作用有點(diǎn)類似于Java語言中的接口,只協(xié)商了一個(gè)契約,但并沒有定義具體的動(dòng)作。比如說compile這個(gè)phase定義了在構(gòu)建流程中需要經(jīng)過編譯這個(gè)階段,但沒有定義應(yīng)該怎么編譯(編譯的輸入是什么?用什么編譯javac/gcc?)。這里具體的動(dòng)作就是由goal來定義,一個(gè)goal在maven中就是一個(gè)Mojo(Maven old java object)。Mojo抽象類中定義了一個(gè)execute()方法,一個(gè)goal的具體動(dòng)作就是在execute()方法中實(shí)現(xiàn)。實(shí)現(xiàn)的Mojo類應(yīng)該放在哪里呢?答案是maven plugin里,所謂的plugin其實(shí)也就是一個(gè)maven項(xiàng)目,只不過這個(gè)項(xiàng)目會(huì)引用maven的一些API,plugin項(xiàng)目也具備maven坐標(biāo)。
在執(zhí)行具體的構(gòu)建時(shí),我們需要為lifecycle的每個(gè)phase都綁定一個(gè)goal,這樣才能夠在每個(gè)步驟執(zhí)行一些具體的動(dòng)作。比如在lifecycle中有個(gè)compile phase規(guī)定了構(gòu)建的流程需要經(jīng)過編譯這個(gè)步驟,而maven-compile-plugin這個(gè)plugin有個(gè)compile goal就是用javac來將源文件編譯為class文件的,我們需要做的就是將compile這個(gè)phase和maven-compile-plugin中的compile這個(gè)goal進(jìn)行綁定,這樣就可以實(shí)現(xiàn)Java源代碼的編譯了。那么有人就會(huì)問,在哪里綁定呢?答案是在pom.xml<build>元素中配置即可。例如:

<build> <plugins><plugin><artifactId>maven-myquery-plugin</artifactId><version>1.0</version><executions><execution><id>execution1</id><phase>test</phase><configuration><url>http://www.foo.com/query</url><timeout>10</timeout><options><option>one</option><option>two</option><option>three</option></options></configuration><goals><goal>query</goal></goals></execution></executions></plugin> </plugins> </build>

就將maven-myquery-plugin中的query這個(gè)goal綁定到了test這個(gè)phase,后續(xù)在maven執(zhí)行到test phase時(shí)就會(huì)執(zhí)行query goal。還有有人可能會(huì)問,我都沒有指定Java源文件的位置,編譯啥?這就引出了maven的design principle。在maven中,有一個(gè)非常著名的principle就是convention over configuration(約定優(yōu)于配置)。這一點(diǎn)和ant有非常大的區(qū)別,例如使用ant來進(jìn)行編譯時(shí),我們需要指定源文件的位置,輸出文件的位置,javac的位置,classpath... ...在maven中這些都是不需要,若沒有手動(dòng)配置,maven默認(rèn)從<項(xiàng)目根目錄>/src/main/java這個(gè)目錄去查找Java源文件,編譯后的class文件會(huì)保存在<項(xiàng)目根目錄>/target/classes目錄。在maven中,所有的PO都有一個(gè)根對(duì)象,就是Super POM。Super POM中定義了所有的默認(rèn)的配置項(xiàng),Super POM對(duì)應(yīng)的pom.xml文件可以在maven安裝目錄下lib/maven-model-builder-3.0.3.jar:org/apache/maven/model/pom-4.0.0.xml中找到。用一張圖來表示maven Lifecycle,phase,goal之間的關(guān)系:


插件
上面我們提到,Maven 將所有項(xiàng)目的構(gòu)建過程統(tǒng)一抽象成一套生命周期: 項(xiàng)目的清理、初始化、編譯、測試、打包、集成測試、驗(yàn)證、部署和站點(diǎn)生成 … 幾乎所有項(xiàng)目的構(gòu)建,都能映射到這一組生命周期上. 但生命周期是抽象的(Maven的生命周期本身是不做任何實(shí)際工作), 任務(wù)執(zhí)行(如編譯源代碼)均交由插件完成. 其中每個(gè)構(gòu)建步驟都可以綁定一個(gè)或多個(gè)插件的目標(biāo),而且Maven為大多數(shù)構(gòu)建步驟都編寫并綁定了默認(rèn)插件.當(dāng)用戶有特殊需要的時(shí)候, 也可以配置插件定制構(gòu)建行為, 甚至自己編寫插件.
再說生命周期
Maven 擁有三套相互獨(dú)立的生命周期: clean、default 和 site, 而每個(gè)生命周期包含一些phase階段, 階段是有順序的, 并且后面的階段依賴于前面的階段. 而三套生命周期相互之間卻并沒有前后依賴關(guān)系, 即調(diào)用site周期內(nèi)的某個(gè)phase階段并不會(huì)對(duì)clean產(chǎn)生任何影響.
clean
clean生命周期的目的是清理項(xiàng)目:
執(zhí)行如$ mvn clean;
default
default生命周期定義了真正構(gòu)建時(shí)所需要執(zhí)行的所有步驟:
執(zhí)行如$ mvn clean install;
site
site生命周期的目的是建立和發(fā)布項(xiàng)目站點(diǎn): Maven能夠基于POM所包含的信息,自動(dòng)生成一個(gè)友好的站點(diǎn),方便團(tuán)隊(duì)交流和發(fā)布項(xiàng)目信息
執(zhí)行命令如$ mvn clean deploy site-deploy;
這三個(gè)lifecycle定義了其包含的phase。maven會(huì)在這三個(gè)lifecycle中匹配對(duì)應(yīng)的phase。當(dāng)執(zhí)行某個(gè)phase時(shí),maven會(huì)依次執(zhí)行在這個(gè)phase之前的phase。
插件
生命周期的階段phase與插件的目標(biāo)goal相互綁定, 用以完成實(shí)際的構(gòu)建任務(wù). 而對(duì)于插件本身, 為了能夠復(fù)用代碼,它往往能夠完成多個(gè)任務(wù), 這些功能聚集在一個(gè)插件里,每個(gè)功能就是一個(gè)目標(biāo).
如:$ mvn compiler:compile: 冒號(hào)前是插件前綴, 后面是該插件目標(biāo)(即: maven-compiler-plugin的compile目標(biāo)).
而該目標(biāo)綁定了default生命周期的compile階段: 他們的綁定能夠?qū)崿F(xiàn)項(xiàng)目編譯的目的.
內(nèi)置綁定
為了能讓用戶幾乎不用任何配置就能使用Maven構(gòu)建項(xiàng)目, Maven 默認(rèn)為一些核心的生命周期綁定了插件目標(biāo), 當(dāng)用戶通過命令調(diào)用生命周期階段時(shí), 對(duì)應(yīng)的插件目標(biāo)就會(huì)執(zhí)行相應(yīng)的邏輯.



上圖只列出了打包方式為jar且擁有插件綁定關(guān)系的階段(packaging 定義了Maven項(xiàng)目打包方式, 通常打包方式與所生成構(gòu)件擴(kuò)展名對(duì)應(yīng),有jar(默認(rèn))、war、pom、maven-plugin等., 其他打包類型生命周期的默認(rèn)綁定關(guān)系可參考: Built-in Lifecycle Bindings、Plugin Bindings for default Lifecycle Reference.


自定義綁定
除了內(nèi)置綁定以外, 用戶還能夠自定義將某個(gè)插件目標(biāo)綁定到生命周期的某個(gè)階段上. 如創(chuàng)建項(xiàng)目的源碼包, maven-source-plugin插件的jar-no-fork目標(biāo)能夠?qū)㈨?xiàng)目的主代碼打包成jar文件, 可以將其綁定到verify階段上:

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><version>3.0.0</version><executions><execution><id>attach-sources</id><phase>verify</phase><goals><goal>jar-no-fork</goal></goals></execution></executions></plugin></plugins> </build>

executions下每個(gè)execution子元素可以用來配置執(zhí)行一個(gè)任務(wù).
聚合與繼承
Maven的聚合特性(aggregation)能夠使項(xiàng)目的多個(gè)模塊聚合在一起構(gòu)建, 而繼承特性(inheritance)能夠幫助抽取各模塊相同的依賴、插件等配置,在簡化模塊配置的同時(shí), 保持各模塊一致.
模塊聚合
隨著項(xiàng)目越來越復(fù)雜(需要解決的問題越來越多、功能越來越重), 我們更傾向于將一個(gè)項(xiàng)目劃分幾個(gè)模塊并行開發(fā), 如: 將feedcenter-push項(xiàng)目劃分為client、core和web三個(gè)模塊, 而我們又想一次構(gòu)建所有模塊, 而不是針對(duì)各模塊分別執(zhí)行$ mvn命令. 于是就有了Maven的模塊聚合 -> 將feedcenter-push作為聚合模塊將其他模塊聚集到一起構(gòu)建:
聚合POM
聚合模塊POM僅僅是幫助聚合其他模塊構(gòu)建的工具, 本身并無實(shí)質(zhì)內(nèi)容:

<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.vdian.feedcenter</groupId><artifactId>feedcenter-push</artifactId><packaging>pom</packaging><version>1.0.0.SNAPSHOT</version><modules><module>feedcenter-push-client</module><module>feedcenter-push-core</module><module>feedcenter-push-web</module></modules></project>

通過在一個(gè)打包方式為pom的Maven項(xiàng)目中聲明任意數(shù)量的module以實(shí)現(xiàn)模塊聚合:

packaging: pom, 否則無法聚合構(gòu)建.
modules: 實(shí)現(xiàn)聚合的核心,module值為被聚合模塊相對(duì)于聚合POM的相對(duì)路徑, 每個(gè)被聚合模塊下還各自包含有pom.xml、src/main/java、src/test/java等內(nèi)容, 離開聚合POM也能夠獨(dú)立構(gòu)建

若<packaging>元素的內(nèi)容是jar,那么我們很好理解,也就是說這個(gè)項(xiàng)目最終會(huì)被打包成一個(gè)jar包,那<packaging>元素為pom又是什么意思呢?從字面上的意思來看,這個(gè)項(xiàng)目將打包成一個(gè)pom。我們不妨去maven倉庫里去瞧瞧(前提是已經(jīng)在項(xiàng)目下運(yùn)行了mvn install命令)。可以發(fā)現(xiàn)這個(gè)文件其實(shí)和項(xiàng)目中的pom.xml是同一個(gè)文件,這樣做的目的是什么呢?上面我們說過PO對(duì)象也是有繼承關(guān)系的,<packaging>pom</packaging>的作用就在這里,這就是maven中project inheritance的概念。當(dāng)實(shí)際執(zhí)行maven命令的時(shí)候,會(huì)根據(jù)project inheritance關(guān)系對(duì)項(xiàng)目的pom.xml進(jìn)行轉(zhuǎn)化,得到真正執(zhí)行時(shí)所用到的pom.xml,即所謂的effective pom,因此可以得到一個(gè)結(jié)論:所有<packaging>元素為pom的項(xiàng)目其實(shí)并不會(huì)輸出一個(gè)可供外部使用,類似于jar包的東西。這類項(xiàng)目的作用有兩個(gè):
管理子項(xiàng)目

例如這里的api和biz就是echo項(xiàng)目的兩個(gè)module。若沒有echo這個(gè)父項(xiàng)目,我們需要到api和biz兩個(gè)項(xiàng)目下分別執(zhí)行mvn install命令才能完成整個(gè)構(gòu)建過程,而有了echo這個(gè)父項(xiàng)目之后,我們只需在echo項(xiàng)目中執(zhí)行mvn install即可,maven會(huì)解析pom.xml,發(fā)現(xiàn)該項(xiàng)目有api和biz兩個(gè)module,它會(huì)分別到這兩個(gè)項(xiàng)目下去執(zhí)行mvn install命令。當(dāng)module數(shù)量比較多的時(shí)候,能大大提高構(gòu)建的效率。
管理繼承屬性

比如A和B都需要某個(gè)依賴,那么在父類項(xiàng)目的pom.xml中聲明即可,因?yàn)楦鶕?jù)PO對(duì)象的繼承關(guān)系,A和B項(xiàng)目會(huì)繼承父類項(xiàng)目的依賴,這樣就可以減少一些重復(fù)的輸入。

effective pom包含了當(dāng)前項(xiàng)目的PO對(duì)象,直到Super POM對(duì)應(yīng)的PO對(duì)象中的信息。要看一個(gè)項(xiàng)目的effective pom,只需在項(xiàng)目中執(zhí)行
mvn help:effective-pom
命令即可查看。這里順帶說一句,有的同學(xué)可能不理解上面這個(gè)命令是什么意思。maven命令的語法為
mvn [options] [goal(s)] [phase(s)]
goal和phase。maven允許你執(zhí)行一個(gè)或者多個(gè)goals/phases。很明顯這面的命令help:effective-pom并不是一個(gè)phase,那么也就是說它是一個(gè)goal。對(duì)這個(gè)goal只不過是采用了縮寫的形式,其全稱是這樣的:

org.apache.maven.plugins:maven-help-plugin:2.2:effective-pom

以分號(hào)為分隔符,包含了groupId,artifactId,version,goal四部分。若groupId為org.apache.maven.plugins則可以使用上述的簡寫形式。也就是說

mvn help:effective-pom mvn org.apache.maven.plugins:maven-help-plugin:2.2:effective-pom

是等價(jià)的,都是執(zhí)行了maven-help-plugin這個(gè)plugin中的effective-pom這個(gè)goal。
我們知道一個(gè)plugin中可以包含多個(gè)goal,goal可以綁定到lifecycle中的某一個(gè)phase,這樣在執(zhí)行這個(gè)phase的時(shí)候就會(huì)調(diào)用該goal。那那些沒有綁定到phase上的goal應(yīng)該如何執(zhí)行呢?這就是 mvn [goal(s)]
這里的goal也就是官方文檔中所說的standalone goal,也就是說若一個(gè)plugin中的某個(gè)goal沒有和一個(gè)phase進(jìn)行綁定,可以通過這種方式來執(zhí)行。可能有的讀者使用過

mvn dependency:tree

這條命令,這里其實(shí)就是單獨(dú)執(zhí)行一個(gè)goal,這個(gè)goal的作用是分析該工程的依賴并使用樹狀的形式打印出來。這里的dependency:tree其實(shí)是一個(gè)簡寫的形式,其完×××式是:

mvn org.apache.maven.plugins:maven-dependency-plugin:<版本號(hào)信息>:tree

也就是說單獨(dú)執(zhí)行一個(gè)goal的方式是:
mvn <groupId>:<artifactId>:<version>:<goal>
每次都要敲這么長一串命令是很繁瑣的,因此才有了上述的簡寫的形式。maven規(guī)定了對(duì)于plugin的artifactId是如下兩種形式:
maven-{prefix}-maven-plugin
的可以使用簡寫的方式${prefix}來表示一個(gè)plugin.
模塊繼承
在面向?qū)ο笾? 可以通過類繼承實(shí)現(xiàn)復(fù)用. 在Maven中同樣也可以創(chuàng)建POM的父子結(jié)構(gòu), 通過在父POM中聲明一些配置供子POM繼承來實(shí)現(xiàn)復(fù)用與消除重復(fù)
父pom
與聚合類似, 父POM的打包方式也是pom, 因此可以繼續(xù)復(fù)用聚合模塊的POM(這也是在開發(fā)中常用的方式):

<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.vdian.feedcenter</groupId><artifactId>feedcenter-push</artifactId><packaging>pom</packaging><version>1.0.0.SNAPSHOT</version><modules><module>feedcenter-push-client</module><module>feedcenter-push-core</module><module>feedcenter-push-web</module></modules><properties><finalName>feedcenter-push</finalName><warName>${finalName}.war</warName><spring.version>4.0.6.RELEASE</spring.version><junit.version>4.12</junit.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><warExplodedDirectory>exploded/${warName}</warExplodedDirectory></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency></dependencies></dependencyManagement><build><pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><version>3.0.0</version><executions><execution><id>attach-sources</id><phase>verify</phase><goals><goal>jar-no-fork</goal></goals></execution></executions></plugin></plugins></pluginManagement></build> </project>

dependencyManagement: 能讓子POM繼承父POM的配置的同時(shí), 又能夠保證子模塊的靈活性: 在父POMdependencyManagement元素配置的依賴聲明不會(huì)實(shí)際引入子模塊中, 但能夠約束子模塊dependencies下的依賴的使用(子模塊只需配置groupId與artifactId, 見下).
pluginManagement: 與dependencyManagement類似, 配置的插件不會(huì)造成實(shí)際插件的調(diào)用行為, 只有當(dāng)子POM中配置了相關(guān)plugin元素, 才會(huì)影響實(shí)際的插件行為.

<?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.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><groupId>com.vdian.feedcenter</groupId><artifactId>feedcenter-push</artifactId><version>1.0.0.SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>feedcenter-push-client</artifactId><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId></plugin></plugins></build></project>

元素繼承
可以看到, 子POM中并未定義模塊groupId與version, 這是因?yàn)樽覲OM默認(rèn)會(huì)從父POM繼承了如下元素:

groupId、version dependencies developers and contributors plugin lists (including reports) plugin executions with matching ids plugin configuration resources

因此所有的springframework都省去了version、junit還省去了scope, 而且插件還省去了executions與configuration配置, 因?yàn)橥暾穆暶饕呀?jīng)包含在父POM中.
優(yōu)勢(shì): 當(dāng)依賴、插件的版本、配置等信息在父POM中聲明之后, 子模塊在使用時(shí)就無須聲明這些信息, 也就不會(huì)出現(xiàn)多個(gè)子模塊使用的依賴版本不一致的情況, 也就降低了依賴沖突的幾率. 另外如果子模塊不顯式聲明依賴與插件的使用, 即使已經(jīng)在父POM的dependencyManagement、pluginManagement中配置了, 也不會(huì)產(chǎn)生實(shí)際的效果.
推薦: 模塊繼承與模塊聚合同時(shí)進(jìn)行,這意味著, 你可以為你的所有模塊指定一個(gè)父工程, 同時(shí)父工程中可以指定其余的Maven模塊作為它的聚合模塊. 但需要遵循以下三條規(guī)則:

在所有子POM中指定它們的父POM;
將父POM的packaging值設(shè)為pom;
在父POM中指定子模塊/子POM的目錄.

parent元素內(nèi)還包含一個(gè)relativePath元素, 用于指定父POM的相對(duì)路徑, 默認(rèn)../pom.xml
超級(jí)pom-約定優(yōu)先于配置
任何一個(gè)Maven項(xiàng)目都隱式地繼承自超級(jí)POM, 因此超級(jí)POM的大量配置都會(huì)被所有的Maven項(xiàng)目繼承, 這些配置也成為了Maven所提倡的約定.

<!-- START SNIPPET: superpom --> <project><modelVersion>4.0.0</modelVersion><!-- 定義了中央倉庫以及插件倉庫, 均為:https://repo.maven.apache.org/maven2 --><repositories><repository><id>central</id><name>Central Repository</name><url>https://repo.maven.apache.org/maven2</url><layout>default</layout><snapshots><enabled>false</enabled></snapshots></repository></repositories><pluginRepositories><pluginRepository><id>central</id><name>Central Repository</name><url>https://repo.maven.apache.org/maven2</url><layout>default</layout><snapshots><enabled>false</enabled></snapshots><releases><updatePolicy>never</updatePolicy></releases></pluginRepository></pluginRepositories><!-- 依次定義了各類代碼、資源、輸出目錄及最終構(gòu)件名稱格式, 這就是Maven項(xiàng)目結(jié)構(gòu)的約定 --><build><directory>${project.basedir}/target</directory><outputDirectory>${project.build.directory}/classes</outputDirectory><finalName>${project.artifactId}-${project.version}</finalName><testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory><sourceDirectory>${project.basedir}/src/main/java</sourceDirectory><scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory><testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory><resources><resource><directory>${project.basedir}/src/main/resources</directory></resource></resources><testResources><testResource><directory>${project.basedir}/src/test/resources</directory></testResource></testResources><!-- 為核心插件設(shè)定版本 --><pluginManagement><!-- NOTE: These plugins will be removed from future versions of the super POM --><!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) --><plugins><plugin><artifactId>maven-antrun-plugin</artifactId><version>1.3</version></plugin><plugin><artifactId>maven-assembly-plugin</artifactId><version>2.2-beta-5</version></plugin><plugin><artifactId>maven-dependency-plugin</artifactId><version>2.8</version></plugin><plugin><artifactId>maven-release-plugin</artifactId><version>2.3.2</version></plugin></plugins></pluginManagement></build><!-- 定義項(xiàng)目報(bào)告輸出路徑 --><reporting><outputDirectory>${project.build.directory}/site</outputDirectory></reporting><!-- 定義release-profile, 為構(gòu)件附上源碼與文檔 --><profiles><!-- NOTE: The release profile will be removed from future versions of the super POM --><profile><id>release-profile</id><activation><property><name>performRelease</name><value>true</value></property></activation><build><plugins><plugin><inherited>true</inherited><artifactId>maven-source-plugin</artifactId><executions><execution><id>attach-sources</id><goals><goal>jar</goal></goals></execution></executions></plugin><plugin><inherited>true</inherited><artifactId>maven-javadoc-plugin</artifactId><executions><execution><id>attach-javadocs</id><goals><goal>jar</goal></goals></execution></executions></plugin><plugin><inherited>true</inherited><artifactId>maven-deploy-plugin</artifactId><configuration><updateReleaseInfo>true</updateReleaseInfo></configuration></plugin></plugins></build></profile></profiles></project> <!-- END SNIPPET: superpom -->

Maven Plugin 開發(fā)
詳細(xì)代碼在maven plugin demo

創(chuàng)建plugin項(xiàng)目

mvn archetype:generate -DgroupId=com.fq.plugins -DartifactId=lc-maven-plugin -Dversion=0.0.1-SNAPSHOT-DarchetypeArtifactId=maven-archetype-plugin -DinteractiveMode=false -DarchetypeCatalog=internal

使用maven-archetype-plugin Archetype可以快速創(chuàng)建一個(gè)Maven插件項(xiàng)目。
pom.xml
插件本身也是Maven項(xiàng)目, 特殊之處在于packaging方式為maven-plugin:

<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.0http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.fq.plugins</groupId><artifactId>lc-maven-plugins</artifactId><packaging>maven-plugin</packaging><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>19.0</version></dependency><dependency><groupId>org.apache.maven</groupId><artifactId>maven-plugin-api</artifactId><version>3.3.3</version></dependency><dependency><groupId>org.apache.maven.plugin-tools</groupId><artifactId>maven-plugin-annotations</artifactId><version>3.3</version></dependency></dependencies></project>

maven-plugin 打包方式能控制Maven為其在生命周期階段綁定插件處理的相關(guān)目標(biāo).

編寫目標(biāo)Mojo

@Mojo(name = "lc", defaultPhase = LifecyclePhase.VERIFY) public class LCMavenMojo extends AbstractMojo {private static final List<String> DEFAULT_FILES = Arrays.asList("java", "xml", "properties");@Parameter(defaultValue = "${project.basedir}", readonly = true)private File baseDir;@Parameter(defaultValue = "${project.build.sourceDirectory}", readonly = true)private File srcDir;@Parameter(defaultValue = "${project.build.testSourceDirectory}", readonly = true)private File testSrcDir;@Parameter(defaultValue = "${project.build.resources}", readonly = true)private List<Resource> resources;@Parameter(defaultValue = "${project.build.testResources}", readonly = true)private List<Resource> testResources;@Parameter(property = "lc.file.includes")private Set<String> includes = new HashSet<>();private Log logger = getLog();@Overridepublic void execute() throws MojoExecutionException, MojoFailureException {if (includes.isEmpty()) {logger.debug("includes/lc.file.includes is empty!");includes.addAll(DEFAULT_FILES);}logger.info("includes: " + includes);try {long lines = 0;lines += countDir(srcDir);lines += countDir(testSrcDir);for (Resource resource : resources) {lines += countDir(new File(resource.getDirectory()));}for (Resource resource : testResources) {lines += countDir(new File(resource.getDirectory()));}logger.info("total lines: " + lines);} catch (IOException e) {logger.error("error: ", e);throw new MojoFailureException("execute failure: ", e);}}private LineProcessor<Long> lp = new LineProcessor<Long>() {private long line = 0;@Overridepublic boolean processLine(String fileLine) throws IOException {if (!Strings.isNullOrEmpty(fileLine)) {++this.line;}return true;}@Overridepublic Long getResult() {long result = line;this.line = 0;return result;}};private long countDir(File directory) throws IOException {long lines = 0;if (directory.exists()) {Set<File> files = new HashSet<>();collectFiles(files, directory);for (File file : files) {lines += CharStreams.readLines(new FileReader(file), lp);}String path = directory.getAbsolutePath().substring(baseDir.getAbsolutePath().length());logger.info("path: " + path + ", file count: " + files.size() + ", total line: " + lines);logger.info("\t-> files: " + files.toString());}return lines;}private void collectFiles(Set<File> files, File file) {if (file.isFile()) {String fileName = file.getName();int index = fileName.lastIndexOf(".");if (index != -1 && includes.contains(fileName.substring(index + 1))) {files.add(file);}} else {File[] subFiles = file.listFiles();for (int i = 0; subFiles != null && i < subFiles.length; ++i) {collectFiles(files, subFiles[i]);}}} }

@Parameter: 配置點(diǎn), 提供Mojo的可配置參數(shù). 大部分Maven插件及其目標(biāo)都是可配置的, 通過配置點(diǎn), 用戶可以自定義插件行為

<plugin><groupId>com.fq.plugins</groupId><artifactId>lc-maven-plugins</artifactId><version>0.0.1-SNAPSHOT</version><executions><execution><id>lc</id><phase>verify</phase><goals><goal>lc</goal></goals><configuration><includes><include>java</include><include>lua</include><include>json</include><include>xml</include><include>properties</include></includes></configuration></execution></executions> </plugin>

execute(): 實(shí)際插件功能;
異常: execute()方法可以拋出以下兩種異常:
MojoExecutionException: Maven執(zhí)行目標(biāo)遇到該異常會(huì)顯示 BUILD FAILURE 錯(cuò)誤信息, 表示在運(yùn)行期間發(fā)生了預(yù)期的錯(cuò)誤;
MojoFailureException: 表示運(yùn)行期間遇到了未預(yù)期的錯(cuò)誤, 顯示 BUILD ERROR 信息

測試&執(zhí)行

通過mvn clean install將插件安裝到倉庫后, 就可將其配置到實(shí)際Maven項(xiàng)目中, 用于統(tǒng)計(jì)項(xiàng)目代碼了:

$ mvn com.fq.plugins:lc-maven-plugins:0.0.1-SNAPSHOT:lc

你可能注意到為了調(diào)用該插件的goal,我們需要給出該插件的所有坐標(biāo)信息,包裹groupId, artifactId,version號(hào),你可能之前已經(jīng)執(zhí)行過"mvn eclipase:eclipase"或"mvn idea:idea"這樣簡潔的命令,讓我們也來將自己的插件調(diào)用變簡單一點(diǎn)。要通過簡單別名的方式調(diào)用Maven插件,我們需要做到以下兩點(diǎn):

插件的artifactId應(yīng)該遵循-maven-plugin或maven--plugin命名規(guī)則,對(duì)于本文中的插件,我們已經(jīng)遵循了。
需要將插件的groupId放在Maven默認(rèn)的插件搜尋范圍之內(nèi),默認(rèn)情況下Maven只會(huì)在org.apache.maven.plugins和org.codehaus.mojo兩個(gè)groupId下搜索插件,要讓Maven同時(shí)搜索我們自己的groupId,我們需要在~/.m2/settings.xml中加入:

<pluginGroups> <pluginGroup>com.fq.plugins</pluginGroup> </pluginGroups>

在達(dá)到以上兩點(diǎn)之后,我們便可以通過以下命令來調(diào)用自己的插件了:
mvn lc:lc

要在別的項(xiàng)目中應(yīng)用插件也是簡單的,我們只需要在該項(xiàng)目的pom.xml文件中使用上面<plugin>標(biāo)簽聲明該插件即可。

轉(zhuǎn)載于:https://blog.51cto.com/13981400/2386744

總結(jié)

以上是生活随笔為你收集整理的彻底理解maven的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

久久首页 | 色a在线观看| 日韩大片在线看 | 在线观看的av网站 | 国产成人免费av电影 | 欧美大香线蕉线伊人久久 | 国产一卡在线 | 香蕉视频国产在线 | 在线观看免费黄视频 | 亚洲精选99 | 天天艹天天 | 91视频免费网址 | 九九日韩 | 国产精品网红直播 | 欧美一级视频免费 | 国产精品视频永久免费播放 | 婷婷5月色 | 中文字幕在线视频一区二区三区 | 欧美成人亚洲 | 免费在线一区二区三区 | 九九热精品国产 | 国产精品va视频 | 亚洲欧美综合精品久久成人 | 国产亚洲精品久久久久动 | 欧美日韩国产一区二区三区 | 日韩欧美视频一区二区三区 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 亚洲日本va中文字幕 | 91成人免费在线 | 狠狠色噜噜狠狠狠狠2021天天 | 四虎在线免费观看视频 | 欧美精品一二 | 久久精品视频中文字幕 | 国产剧情一区二区在线观看 | 在线看不卡av | 91看片成人 | 免费在线观看黄网站 | 久久精品欧美一 | 日本黄色大片免费看 | 国产粉嫩在线观看 | 摸bbb搡bbb搡bbbb| 丁香久久婷婷 | 91香蕉国产在线观看软件 | 日韩精品视频免费专区在线播放 | 波多野结衣视频一区二区三区 | 亚洲激情p | 91综合视频在线观看 | a在线免费 | 天天在线操 | 高清av中文字幕 | 狠狠操电影网 | 久久久久久久久久久久久久av | 九九久久成人 | 91综合在线 | 日日摸日日 | 在线精品视频免费播放 | 国产精品av电影 | 91视频高清完整版 | 园产精品久久久久久久7电影 | 精品99免费 | 国产又黄又爽无遮挡 | 免费高清在线一区 | 天天天天天天天天操 | 六月激情婷婷 | 精品免费一区二区三区 | 四虎影视国产精品免费久久 | 在线视频专区 | 成人国产精品入口 | 亚洲成人中文在线 | 精品国产乱码久久久久久1区二区 | 亚洲激情在线 | 免费看黄色大全 | 91精品久久久久久久久 | 久久96国产精品久久99漫画 | 天堂av在线免费观看 | 国产热re99久久6国产精品 | 亚洲春色综合另类校园电影 | 日韩丝袜在线观看 | 九精品| 国产精品久久久久久久99 | 18av在线视频 | a级片韩国 | 成 人 黄 色 视频播放1 | 亚洲va男人天堂 | 久久天堂精品视频 | 久久伊人国产精品 | 亚洲天天做 | 国产成人综合精品 | 国产第一二区 | avove黑丝 | 日韩高清免费观看 | 96超碰在线 | 久久久久成 | 日韩中文字幕亚洲一区二区va在线 | 丁香一区二区 | 国产我不卡 | 免费日韩视频 | 欧美福利在线播放 | av在线免费观看不卡 | 高清不卡免费视频 | 天天干天天做天天操 | 在线视频 国产 日韩 | 国产一二三区在线观看 | 日本久久久久久 | 国产乱码精品一区二区蜜臀 | 中文字幕 第二区 | 在线观看免费日韩 | 黄色精品免费 | 久久免费看视频 | 久久一区二区三区超碰国产精品 | 亚洲在线精品视频 | 操老逼免费视频 | 精品国产一二三四区 | 亚洲黄色网络 | 九九综合久久 | av网站在线观看免费 | 麻豆va一区二区三区久久浪 | 欧美a级片网站 | 免费观看国产精品视频 | 91日韩免费 | 在线看污网站 | 久久网站最新地址 | 人人爽爽人人 | 成人毛片一区二区三区 | 久久综合亚洲鲁鲁五月久久 | 久久综合色综合88 | 91视频久久久久久 | a v在线视频 | 久久综合亚洲鲁鲁五月久久 | 久久国产精品久久国产精品 | 国产精品大片免费观看 | 九九在线视频免费观看 | 激情 婷婷| 国产高清免费在线播放 | 亚洲高清视频一区二区三区 | 91香蕉视频黄色 | 亚洲一区尤物 | 成人一级片在线观看 | 日韩大片免费在线观看 | 91看片网址 | 天天操天天射天天操 | 九九九九精品 | 日本久草电影 | 欧美日韩在线精品一区二区 | 久久一区二区三区四区 | 亚洲区色 | 国产精品免费在线播放 | 成人免费视频网站 | 在线观看中文字幕一区 | 国产福利免费在线观看 | 青青久草在线视频 | 久久97精品 | 999视频在线播放 | 亚洲粉嫩av | 麻豆影视在线观看 | 伊人狠狠| 国产精品24小时在线观看 | 中文字幕视频观看 | 人人爱爱人人 | 手机在线日韩视频 | 精品免费 | 久久人网 | 在线视频免费观看 | 欧美精品在线观看免费 | 粉嫩aⅴ一区二区三区 | 成x99人av在线www| 91视频在线观看下载 | 国产亚洲免费的视频看 | 日韩欧美大片免费观看 | 欧美日韩18 | 国产高清不卡一区二区三区 | 国产黄影院色大全免费 | 日本不卡123 | 国产又粗又猛又黄又爽的视频 | 日韩黄色av网站 | 天天se天天cao天天干 | 国产精品久久二区 | 人人射 | 香蕉精品视频在线观看 | www五月天婷婷 | 色av男人的天堂免费在线 | 久草在线观看 | 一区二区三区四区精品 | 超碰97成人 | 亚洲婷久久| 国产精品一区二 | 2019天天干天天色 | 久久理论视频 | www,黄视频 | 久久久久黄 | a午夜在线 | 天堂麻豆 | 91精品资源 | 国内成人综合 | 日韩视频在线观看视频 | 欧美巨乳波霸 | 狠色在线 | 成人欧美日韩国产 | 精品国产成人在线影院 | 人人擦| 激情五月婷婷 | 婷婷综合影院 | 天堂中文在线播放 | 成年人免费电影在线观看 | 国产精品你懂的在线观看 | 国产最新视频在线 | 99999精品| 亚洲最大在线视频 | 亚洲乱码精品 | 精品麻豆入口免费 | 国产视频不卡一区 | 在线精品一区二区 | 特黄免费av| 国产在线91精品 | 国产99久久久国产精品免费二区 | 激情综合网色播五月 | 丁香综合激情 | 免费一级片在线观看 | 美女网站一区 | 久久久久久久久艹 | 最新91在线视频 | 五月激情丁香 | 一级黄色在线免费观看 | 白丝av在线 | 日韩亚洲国产精品 | 天天干天天在线 | 99麻豆视频 | 九九影视理伦片 | 精品一区二区视频 | 久久国产精品99久久久久久老狼 | 91片黄在线观 | 在线免费观看黄色小说 | 亚洲精品综合一二三区在线观看 | 97国产视频 | 国产一区私人高清影院 | 伊人中文字幕在线 | 久久免费电影网 | 国产成人精品午夜在线播放 | 在线精品亚洲一区二区 | 综合久久2023| 亚洲视频免费视频 | 久久久www成人免费毛片 | 超碰在线最新地址 | 麻豆视传媒官网免费观看 | 久久久久久久久久久高潮一区二区 | 男女全黄一级一级高潮免费看 | 日本婷婷色 | 成人在线观看av | 中文字幕麻豆 | 久久国产一区二区三区 | 在线观看视频在线观看 | 欧美91视频 | 一区二区三区在线免费播放 | 亚洲成av人片在线观看无 | 在线免费观看黄色av | 天海翼一区二区三区免费 | 免费看一级特黄a大片 | 亚洲久草网 | 国产色小视频 | 国产精品久久久久毛片大屁完整版 | 天天综合网在线 | 久久 在线| 国产精品免费久久久久久久久久中文 | 免费观看的av网站 | 综合色伊人| 午夜三级福利 | 91福利视频免费观看 | 久草电影在线观看 | 日韩成人黄色av | 中文字幕一区二区三区久久蜜桃 | 亚洲一二视频 | 精品一区二区久久久久久久网站 | 在线免费黄色 | 亚洲成 人精品 | 欧美男同视频网站 | 久久免费视频精品 | 欧美精品xx| 国产一区在线视频 | 免费在线观看av的网站 | 不卡电影一区二区三区 | 日韩免费一区二区 | 色综合天天综合网国产成人网 | 亚洲成人精品在线 | 又粗又长又大又爽又黄少妇毛片 | 中文字幕乱码亚洲精品一区 | 午夜精品久久久久久久久久久 | 黄a在线看 | 亚洲一区二区三区四区在线视频 | 日韩成人在线免费观看 | 日韩网页 | 免费观看av网站 | 国产精品一区二区三区四区在线观看 | 麻豆成人精品视频 | 美女网站视频一区 | 97碰碰视频 | 一本色道久久综合亚洲二区三区 | 99久久精品免费看国产四区 | 天天操天天操天天操天天操 | 在线看岛国av | 欧美日本三级 | 日韩久久久久久久 | www..com黄色片 | 色婷婷九月 | 日本在线观看中文字幕无线观看 | 丁香久久综合 | 精品国产一区二区三区四区vr | 日韩欧美在线视频一区二区三区 | 91激情视频在线播放 | 啪啪免费试看 | 亚洲综合欧美激情 | 国产在线视频资源 | 成人在线视频论坛 | 四虎成人网 | 成人app在线播放 | 国产一级视频在线 | 国产高清视频免费观看 | 日本性视频 | 婷婷精品国产欧美精品亚洲人人爽 | 成年人视频免费在线播放 | 在线观看中文字幕亚洲 | 国产高清不卡 | 免费aa大片| 精品国产中文字幕 | 免费观看第二部31集 | 国产黄色一级大片 | 9ⅰ精品久久久久久久久中文字幕 | www日日 | 美女国产| 日韩在线电影观看 | 日韩av电影手机在线观看 | 日日干av | 久久一久久 | 99久久精品国产系列 | 九九在线国产视频 | 中文字幕黄色 | 日韩伦理片一区二区三区 | 久久的色 | 欧美日韩xx | 在线观看亚洲国产精品 | 午夜精品久久久久久久99 | 91精品国产自产老师啪 | 国产区精品在线观看 | 亚洲第一av在线 | av免费线看| 国语精品久久 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 在线观看深夜福利 | 色综合久久99 | 欧美综合色在线图区 | 亚洲成人网av | 国产精品久久99精品毛片三a | 久久久久在线观看 | 免费看一级片 | 91麻豆免费视频 | 91精品国产九九九久久久亚洲 | a视频在线观看免费 | 国产又粗又硬又长又爽的视频 | 国产精品久久免费看 | 狠狠色综合网站久久久久久久 | 国产精品一区二区三区久久久 | 久久精品免费看 | 欧美一级性 | 欧洲一区二区在线观看 | 日韩免费一区二区在线观看 | 午夜精品久久久 | 激情五月婷婷综合 | 精品国产成人在线影院 | 欧美日韩xxxxx | 欧美日bb | 91免费高清视频 | 91视频在线观看下载 | 97国产在线视频 | 国产第页 | 亚洲人成精品久久久久 | 日韩视频免费在线 | 一区二区 不卡 | 国色综合 | www.夜夜夜 | 伊人五月天婷婷 | 黄色在线看网站 | 天堂在线一区 | www四虎影院 | 欧美日韩午夜 | 国产无遮挡猛进猛出免费软件 | 国产成人精品一二三区 | 最近能播放的中文字幕 | 91成年人在线观看 | 亚州精品在线视频 | 91在线中文字幕 | 黄色av三级在线 | 天天爱天天草 | 天天操夜夜干 | 久久99久久99精品免视看婷婷 | 91一区啪爱嗯打偷拍欧美 | 伊人资源站 | 日本精品久久久一区二区三区 | 免费进去里的视频 | 免费亚洲视频 | 婷婷色中文字幕 | 久久永久免费视频 | 伊人婷婷在线 | 中文字幕在线观看一区 | 欧美精品999 | 国产精品扒开做爽爽的视频 | 久久久亚洲网站 | 精品久久久久久久久久久久久 | 久久公开免费视频 | 久久综合狠狠综合久久综合88 | 日韩视频在线观看免费 | 成人性生爱a∨ | 亚洲精品av中文字幕在线在线 | 97超碰在线播放 | 中文字幕中文字幕中文字幕 | 99精品视频观看 | 最新日韩在线观看视频 | 日本丰满少妇免费一区 | 国产视频69| av东方在线| 免费黄色av. | 国产色黄网站 | 91视频久久久久久 | 亚洲午夜电影网 | 国产精品99视频 | 欧美在线观看小视频 | 亚洲狠狠丁香婷婷综合久久久 | 欧美久久久影院 | 久久久亚洲麻豆日韩精品一区三区 | 中文视频一区二区 | 国产成人精品一区二区三区免费 | 天天插天天狠天天透 | 天天操天天干天天玩 | 国产视频一区在线免费观看 | 九九在线视频免费观看 | 久久不卡免费视频 | 免费看污在线观看 | 久久精品久久99 | 亚洲一区日韩在线 | 韩国三级在线一区 | 亚洲视频中文 | 免费在线视频一区二区 | 国产日韩精品在线观看 | 亚洲另类久久 | 久久久国产毛片 | wwwwww黄| 日韩成年视频 | 成年在线观看 | 亚欧洲精品视频在线观看 | 亚洲aⅴ乱码精品成人区 | 超碰在线公开免费 | 亚洲视频免费在线看 | 久久综合九色综合97_ 久久久 | 九九九免费视频 | av成人在线播放 | 久久久久久高清 | 免费在线观看av的网站 | 日本公妇色中文字幕 | 久精品视频在线观看 | 最新精品国产 | 18女毛片 | 黄网站免费看 | 00av视频 | 日本mv大片欧洲mv大片 | 国产日韩精品一区二区三区 | 国产99在线免费 | 久草视频在线播放 | 国产视频欧美视频 | 午夜色婷婷 | 免费观看一级视频 | 一区二区三区在线看 | 成人免费观看视频大全 | 91九色蝌蚪在线 | 一区二区三区免费播放 | 亚洲欧美日韩中文在线 | 国产99久 | 精品黄色在线观看 | 一级黄色电影网站 | av电影免费在线看 | 日韩免费视频在线观看 | 亚洲综合五月天 | 麻豆国产在线视频 | 中文字幕日本特黄aa毛片 | 女人18片 | 中文字幕网站视频在线 | 五月天婷婷免费视频 | 日本婷婷色 | 日本在线精品视频 | 97影视| 色噜噜狠狠色综合中国 | 日本aaa在线观看 | 国产精品视频大全 | 最新中文在线视频 | 精品亚洲视频在线 | 久久免费在线观看 | 国产精品99久久久久久有的能看 | 插插插色综合 | 99精品久久久久 | 色综合天天色综合 | 久久艹影院 | 欧美日韩视频 | 欧美久久久一区二区三区 | 日韩午夜视频在线观看 | 亚洲激情一区二区三区 | 开心综合网 | 黄色av成人在线观看 | 亚洲成a人片在线www | 亚州人成在线播放 | 欧美日韩中文字幕视频 | 久久国产亚洲视频 | 精品国产自 | 亚洲国产精品激情在线观看 | 欧美日韩视频网站 | 精品视频资源站 | 久久99精品久久久久蜜臀 | 久久久久久高清 | 国内视频在线观看 | 三级黄色免费片 | 激情av网 | 狠狠色丁香婷婷综合 | 亚洲成人在线免费 | 黄色av一区二区三区 | 一区二区三区影院 | 欧美色综合 | 亚洲综合欧美日韩狠狠色 | 免费成人在线观看视频 | 夜夜爱av | 在线看一区二区 | 久草在线91 | 婷婷久久网站 | 久草视频免费看 | 超碰公开在线 | 一区二区免费不卡在线 | 国产视频日韩 | 亚洲精品国内 | 中文有码在线视频 | 欧美成人影音 | 黄色午夜网站 | 成人久久免费 | 国内久久久久久 | 久久精品高清视频 | 少妇视频一区 | 超碰人人av| 日本精品中文字幕 | 免费黄色小网站 | 日韩精品一区二区在线观看视频 | 午夜视频亚洲 | 日韩精品国产一区 | 国产第一福利 | 五月婷婷视频在线 | 国产亚洲字幕 | 成人网看片 | 美女视频免费一区二区 | 久久乐九色婷婷综合色狠狠182 | 精品国内自产拍在线观看视频 | 不卡的av在线播放 | 久久国产免费视频 | 在线网站黄 | 国产精品久久久久9999吃药 | 日日爽天天爽 | 国语自产偷拍精品视频偷 | 午夜精品视频福利 | 韩国一区在线 | 日韩三级不卡 | 精品久久毛片 | 激情开心色 | 91免费国产在线观看 | 久草在线视频免费资源观看 | 在线观看免费91 | 色噜噜在线观看视频 | 看av免费网站 | 精品国产免费观看 | 中文字幕一区二区在线播放 | 久热国产视频 | 日日摸日日爽 | 欧美成人h版在线观看 | 国产精品女同一区二区三区久久夜 | 久久爱资源网 | 免费成人黄色av | 欧美精品九九 | 久久久免费精品 | 成人中心免费视频 | 成人免费在线视频 | 亚洲日本欧美在线 | 五月天久久综合网 | 日韩精品久久一区二区 | 超薄丝袜一二三区 | 91成人小视频 | 日韩黄色在线观看 | 人人舔人人舔 | 久久成人亚洲欧美电影 | 国产精品99久久久久久武松影视 | 久久精品欧美日韩精品 | 亚洲精品99久久久久久 | 狠狠躁夜夜a产精品视频 | 国产在线观看你懂得 | 午夜在线资源 | 午夜视频免费在线观看 | 天天弄天天操 | 久久国产亚洲 | 丁香九月婷婷综合 | 久久久国产精品久久久 | 午夜视频播放 | 久久ww| 国产永久免费 | 日韩高清在线一区二区三区 | 久久99久久99精品中文字幕 | 黄色毛片在线观看 | 五月天久久久久久 | 久久伦理网 | 91成人在线视频观看 | 91天天视频| 伊人婷婷激情 | 国产在线精品观看 | 天天爱天天射天天干天天 | 99久久精品免费看 | 成人9ⅰ免费影视网站 | www天天干| 国产成人一区二区在线观看 | 美女久久网站 | 久久精品欧美一区二区三区麻豆 | 在线天堂视频 | 综合激情婷婷 | 欧美精品一区二区三区四区在线 | 国产不卡在线视频 | 人人爽人人爽av | 精品欧美在线视频 | 国产福利在线免费观看 | 久草电影免费在线观看 | 久久久久国产精品一区 | 国产高清不卡av | 日日夜夜精品免费视频 | 国产网站在线免费观看 | 久久精品欧美 | 欧美性粗大hdvideo | 一区精品在线 | 四虎伊人 | 免费网站污 | 欧美另类xxxx | 亚洲欧洲久久久 | 国产高清av免费在线观看 | 91精品婷婷国产综合久久蝌蚪 | 日韩精品专区在线影院重磅 | 欧美另类高潮 | 国产99一区视频免费 | 欧美精品久久久久久久亚洲调教 | 亚洲国内在线 | 丁香花在线视频观看免费 | 亚洲天堂网视频在线观看 | 一区二区三区在线播放 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 97超碰在线资源 | 国产一级不卡毛片 | 久久综合在线 | 国产美女精品久久久 | 久久精品5| 一区免费在线 | 国产一级在线视频 | 国产精品久久久久久五月尺 | 国产中文在线播放 | 狠狠久久伊人 | 国产综合91 | 一区二区三区四区精品 | 国产字幕在线看 | 欧美精品生活片 | 亚洲视频 中文字幕 | 麻豆传媒电影在线观看 | 韩日av在线| 中文字幕日韩伦理 | 亚洲人片在线观看 | 亚洲一片黄 | 干干夜夜 | 久久国产电影 | 国产美女网站视频 | 欧美福利片在线观看 | 久久久精品高清 | 久久情爱 | 91精品人成在线观看 | 国产在线观看免费观看 | 日本性xxx | 久久伊人操 | 国产成人av一区二区三区在线观看 | 精品96久久久久久中文字幕无 | 免费黄色在线 | 天天玩天天操天天射 | 亚洲干视频在线观看 | 又黄又爽又湿又无遮挡的在线视频 | 欧美一区中文字幕 | 国产1区2| www.亚洲在线| 欧美另类高清 videos | 免费看一及片 | 在线韩国电影免费观影完整版 | 欧美一区二区三区免费看 | 天天操夜夜想 | 国产一区二区久久久 | 成人午夜网 | 中文字幕亚洲欧美日韩 | 亚洲电影在线看 | 91麻豆精品国产91久久久久久久久 | 久久久久久久免费观看 | 伊人婷婷综合 | 午夜精选视频 | 精品一区 在线 | 国产精品成人一区二区三区吃奶 | 久久视频国产精品免费视频在线 | av在线电影播放 | 一区二区中文字幕在线观看 | 精品福利在线视频 | 91免费版在线观看 | 高清av免费看 | 视频在线99 | 午夜av激情 | 亚洲精品国产精品乱码不99热 | av电影一区二区 | 天天综合区 | 日韩视频免费在线观看 | 在线观看精品国产 | 91亚洲精 | 97超碰国产精品女人人人爽 | 麻豆免费视频 | av九九| 99久久日韩精品视频免费在线观看 | 亚洲欧美日韩一区二区三区在线观看 | 国内精品视频一区二区三区八戒 | 五月婷婷久久综合 | 四虎影视国产精品免费久久 | 97成人在线观看视频 | 欧美福利在线播放 | 深爱激情av| 亚洲国产精品久久 | 日韩欧美在线观看一区二区 | 亚洲精品国产拍在线 | 天天操天天操天天操天天操天天操 | 国产 视频 高清 免费 | 亚洲国产精品电影 | 在线观看视频中文字幕 | 成人黄色小说视频 | 国产中文欧美日韩在线 | 日韩久久电影 | 天天干 天天摸 天天操 | 久久综合九色综合欧美就去吻 | 91刺激视频| 精品国产成人 | 日韩高清久久 | 日韩亚洲国产中文字幕 | 日韩欧美高清在线观看 | www.色五月.com | 亚洲乱码在线 | 国产福利一区二区三区视频 | 黄色av电影网 | 婷婷综合久久 | 欧美日韩色婷婷 | 欧美九九九 | 美女在线免费视频 | 国产精品免费久久久久 | 中文字幕乱码视频 | 91av在线视频免费观看 | 婷婷综合电影 | 国产精品免费视频久久久 | 国产亚洲亚洲 | 免费能看的黄色片 | 色五婷婷| 免费黄色网址网站 | 国产精品免费视频观看 | va视频在线观看 | 亚洲午夜精品久久久久久久久久久久 | 激情九九| 99热超碰在线 | 天天爽夜夜爽人人爽一区二区 | 国产91精品久久久久 | 91久久爱热色涩涩 | 成人免费一级 | 99精品一区 | 91在线视频免费观看 | 亚洲精品久久久久久久蜜桃 | 久草在线资源免费 | 国产女人40精品一区毛片视频 | 最新中文字幕 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 一级淫片在线观看 | 精品国产免费人成在线观看 | 91精品啪在线观看国产线免费 | 免费韩国av | 亚洲精品 在线视频 | 国产91免费在线观看 | 91在线视频精品 | 国产精品一区二区三区久久 | 超级碰视频| 亚洲精品国产精品久久99 | 亚洲精品日韩av | 精品国产免费av | 97成人精品视频在线观看 | 一区二区三区电影在线播 | 激情五月婷婷 | 久久欧洲视频 | 99色在线观看 | 99视频精品全部免费 在线 | 免费在线成人av电影 | 欧美日韩国产区 | 黄色免费电影网站 | 国产九九精品视频 | 不卡国产视频 | 五月婷婷丁香 | 久久精品99国产精品亚洲最刺激 | 91午夜精品 | 久黄色| 国产又粗又猛又黄视频 | 91视频久久久 | 国产一级91 | 亚洲自拍av在线 | 免费美女av | 免费看日韩片 | 黄色免费看片网站 | 成片视频在线观看 | 国产精品少妇 | 91精品推荐| 欧洲激情在线 | 日韩免费精品 | 一级大片在线观看 | 日韩欧美综合在线视频 | 欧美视频99 | 午夜精品久久久 | av综合网址| 深爱综合网 | 激情视频在线观看网址 | 日韩试看 | 亚洲精品久久在线 | 亚洲色图美腿丝袜 | 国产经典 欧美精品 | 国产一区免费在线观看 | 激情电影在线观看 | 成人免费在线观看电影 | 国产免费一区二区三区最新 | www免费 | 亚洲成年人在线播放 | 丁香婷婷社区 | 国产精品18久久久久久久久 | 五月婷婷毛片 | 久久免费视频观看 | 91传媒视频在线观看 | 欧美在线1区 | 久久久久国产精品免费网站 | 日三级在线 | 成人免费在线观看av | 人人插人人射 | 久久天天操 | 久久深爱网 | av免费网站观看 | 国产成年人av | 狠狠地日 | 国产国语在线 | 成人在线中文字幕 | 九九精品毛片 | 午夜成人免费电影 | 五月天电影免费在线观看一区 | 91av视频在线观看免费 | 在线视频日韩精品 | 中文字幕在线视频一区 | 欧美一级视频免费 | 欧洲一区二区在线观看 | 久久男人中文字幕资源站 | 精品日本视频 | 99热最新网址 | 国产成人在线综合 | 天天草网站 | 久久精品国产精品亚洲 | 欧美日韩视频在线 | 日韩午夜在线播放 | 国产精品video爽爽爽爽 | 国产精选视频 | 中文字幕亚洲欧美日韩 | 日韩久久影院 | 亚洲影视九九影院在线观看 | 欧美 亚洲 另类 激情 另类 | 中文字幕在线高清 | 三级av免费 | 高清中文字幕 | 亚洲九九九在线观看 | 久久欧美综合 | 日韩av影视 | 91精品福利在线 | 国语黄色片 | 日韩欧美aaa | 亚洲免费av网站 | 蜜臀aⅴ国产精品久久久国产 | 欧洲一区二区三区精品 | 天天做天天爱天天综合网 | 99久久99热这里只有精品 | 97超碰人人网 | 亚洲精品视频国产 | 97精品国产aⅴ | 欧美成人中文字幕 | 99久免费精品视频在线观看 | 日韩av网址在线 | 免费视频二区 | 91最新在线 | 天天爽夜夜操 | 中文字幕超清在线免费 | 免费观看一级 | 日韩av男人的天堂 | 男女视频国产 | av夜夜操 | 在线观看中文字幕 | 亚洲成av人影片在线观看 | 亚洲干视频在线观看 | 九九九热精品免费视频观看 | 久久视频这里有久久精品视频11 | 黄p网站在线观看 | 三级黄色片子 | 日韩视频免费在线观看 | 国产精品24小时在线观看 | 国产精品视频免费观看 | 欧美高清视频不卡网 | 在线观看黄a| 黄色的网站免费看 | 日韩精品在线看 | 久久久国产视频 | 狠狠操狠狠干天天操 | 一区二区观看 | 亚洲日本一区二区在线 | 超碰97在线资源站 | 91免费视频国产 | 成人黄色毛片 | 国产不卡在线看 | 六月天色婷婷 | 毛片永久新网址首页 | 天天色欧美 | 午夜av在线播放 | 久久久久婷| 久久精品人人做人人综合老师 | 国产精品毛片一区 | 国产精品不卡视频 | 亚洲一级性 | 探花视频在线观看免费版 | 99中文字幕在线观看 | 色吊丝av中文字幕 | 久要激情网 | 午夜婷婷在线观看 | 看片在线亚洲 | 天天综合视频在线观看 | 国产精品无 | 国产精品免费久久久久久久久久中文 | 五月综合色 | 久久视精品 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲精品网站在线 | a天堂最新版中文在线地址 久久99久久精品国产 | 91视频电影 | 天天操欧美 | 在线视频久久 | 日日夜夜干 | 亚洲在线黄色 | 99色视频在线 | 日韩av黄 | 91av视频在线播放 | 黄色网www | 日韩av网页 | 国产91精品高清一区二区三区 | 精品国产乱码久久久久久天美 | 日韩av午夜在线观看 | 四虎免费在线观看 | 日韩专区 在线 | 五月天免费网站 | 精品久久美女 | 日韩高清在线一区二区三区 | 日韩久久视频 | 国产在线精品福利 | 久草在线综合 | 国产精品久久久久久久久久尿 | 久久精品直播 | 日韩精品一区二区三区外面 | 国产精品嫩草影视久久久 | 欧美日韩视频在线观看一区二区 | 999久久久免费视频 午夜国产在线观看 | 久久久久免费视频 | 国产一区二区免费在线观看 | 亚洲爱爱视频 | 免费高清在线视频一区· | 色视频网站在线观看一=区 a视频免费在线观看 | 婷婷激情久久 | 国产区 在线 | 婷婷精品国产欧美精品亚洲人人爽 | 91久久奴性调教 | 91九色成人| 精品久久网| 日韩一级片观看 | 日韩在线视频精品 | 超碰人人做 | 中文字幕在线播放视频 | 五月激情站| 狠狠躁夜夜躁人人爽超碰97香蕉 | 日韩成人精品一区二区 | 久草免费在线视频观看 | 国产免费观看高清完整版 | 伊人色综合久久天天网 | 日本99热 | 九九热在线视频 | 操操操日日 | 久久久福利|