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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

maven pom.xml解析、命令说明、依赖传递、继承、聚合、properties、build、依赖范围、版本仲裁、profile

發布時間:2024/1/8 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 maven pom.xml解析、命令说明、依赖传递、继承、聚合、properties、build、依赖范围、版本仲裁、profile 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

maven是當前Java項目中用到最多的依賴管理工具。最開始的項目比較小引入的依賴包也少所以可以通過手動加載jar包的方式來管理依賴包;但隨著項目越來越復雜各種大小框架層出不窮,一個項目的開發往往依賴的jar包成百上千,此時再去手動依賴找到這些jar包并且找到它們相互依賴的版本無疑是一個巨大的工程,此時需要一個能夠簡單解決掉這些依賴關系的工具;maven就解決了這一類的難題,并且maven還可以做項目構建,比如一個spring boot項目打包成一個jar包給項目部署也帶了極大的方便。

一、POM文件解析

下面的示例文件列舉了大部分常用的pom.xml的標簽,不一定每個項目都會用到所有的標簽
三者關系:
my-test-member 是父工程/總工程(聚合角度)
my-test-member-apimy-test-member-biz 都是子工程/聚合工程(聚合角度)

my-test-member 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>org.my.test.member</groupId><artifactId>my-test-member</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version> <!-- modules:配置工程聚合--><modules><!-- module:配置一個具體的聚合模塊 --><module>my-test-member-api</module><module>my-test-member-biz</module></modules><!-- properties:定義屬性值 --><properties><!-- 自定義屬性mysql版本號,對于自定義屬性來說名稱自己寫 --><mysql.version>8.0.17</mysql.version><swagger.version>2.8.0</swagger.version><mybatis.plus.version>3.3.2</mybatis.plus.version><spring.boot.version>2.3.5.RELEASE</spring.boot.version></properties><!-- 使用dependencyManagement標簽配置對依賴的管理 --><!-- 被管理的依賴并沒有真正被引入到工程 --><dependencyManagement><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><!-- 使用properties中自定義的屬性值mysql版本號,好處是如果有多處使用該版本號,直接修改properties中的mysql版本號屬性值即可 --><version>${mysql.version}</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>${swagger.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis.plus.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring.boot.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>${spring.boot.version}</version></dependency></dependencies></dependencyManagement><build><pluginManagement><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring.boot.version}</version></plugin></plugins></pluginManagement></build></project>

my-test-member-api 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"><parent><artifactId>my-test-member</artifactId><groupId>org.my.test.member</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>org.my.test.member.api</groupId><artifactId>my-test-member-api</artifactId><dependencies><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency></dependencies> </project>

my-test-member-biz pom.xml

<?xml version="1.0" encoding="UTF-8"?> <!-- project:根標簽,表示對當前工程進行配置、管理 --> <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"><!-- parent:給當前工程配置父工程 --><parent><!-- 通過坐標信息定位父工程 --><artifactId>my-test-member</artifactId><groupId>org.my.test.member</groupId><version>1.0-SNAPSHOT</version></parent><!-- modelVersion:從maven2.x版本開始固定4.0.0,代表當前pom.xml所采用的標簽結構 --><modelVersion>4.0.0</modelVersion><!-- 當前Maven工程的坐標信息,其他項目如果要依賴當前maven項目則使用以下的坐標信息 --><!-- groupId:一般表示公司或組織開發的某個項目 --><!-- artifactId:一般表示項目下的某個模塊 --><!-- version:當前模塊的版本 --><!-- 也是安裝該jar包后在本地倉庫中的路徑 如:com\my\test\member\my-test-product-biz\0.0.1-SNAPSHOT\my-test-member-biz-0.0.1-SNAPSHOT.jar --><!-- 如果配置了父工程(parent標簽),如果groupId和父工程一樣則可以不寫groupId,如果version和父工程一樣也可以不寫version,但是artifactId必須要寫 --><groupId>com.my.test.member</groupId><artifactId>my-test-member-biz</artifactId><version>0.0.1-SNAPSHOT</version><!-- 當前Maven工程的打包方式,可選值有下面四種:默認值jar --><!-- jar:表示這個工程是一個Java工程,打包結果jar包,創建Java工程命令:mvn archetype:generate --><!-- war:表示這個工程是一個Web工程(傳統的jsp工程),打包結果war包,創建Web工程命令:mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4選擇創建方式編號比如quickstart,會提示輸入groupId、artifactId、version等,會生成web.xml、WEB-INF、index.jsp等文件或目錄,如果沒有java目錄的話,需要自己在main目錄下創建java目錄;Web工程可依賴Java工程,也就是war包里面可以依賴jar包,不能jar包依賴war包 --><!-- pom:表示這個工程是“管理其他工程”的工程,比如該工程是一個父級工程則定義為pom,創建命令:mvn archetype:generate但是packaging時jar需要改成pom --><!-- maven-plugin:定義當前工程為maven插件即自定義maven插件的時候用到,但是基本不會有自定義插件的場景 --><packaging>jar</packaging><!-- name:當前工程的名稱 --><name>my-test-member-biz</name><!-- url:maven官網地址 --><url>http://maven.apache.org</url><!-- description:當前工程的說明 --><description>測試微服務用戶服務</description><!-- properties:在maven中定義屬性值,可以是指定maven自帶的屬性值,也可以是自定義屬性值;標簽中間是屬性值,標簽本身是屬性 --><properties><java.version>1.8</java.version></properties><!-- dependencies:指定依賴信息 --><dependencies><!-- dependency:指定一個具體的依賴信息,通過maven的坐標信息指定 --><dependency><groupId>org.my.test.member.api</groupId><artifactId>my-test-member-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><!-- scope:指定當前依賴的范圍,默認值compile,總共以下6種可選值:compile/test/provided/system/runtime/import--><!-- compile:默認值,compile范圍的jar包,可以在開發時正常使用該jar包里面的類方法等(可以在main/test目錄下的程序中正常使用),并且項目打包的時候會將該jar包打入到項目生成的jar或war包中,即該jar包會被main目錄中的程序使用且不屬于provided的情況如:spring-boot-starter --><!-- test:test范圍的jar包,開發時可以在test目錄下的程序正常使用該jar包里面的類方法等,但是main目錄下的程序不能正常使用,并且項目打包的時候不會將該jar包打入到項目生成的jar或war包中,即僅作測試用的jar包定義該范圍如:junit --><!-- provided:provided范圍的jar包, 可以在開發時正常使用該jar包里面的類方法等(可以在main/test目錄下的程序中正常使用),并且項目打包的時候不會將該jar包打入到項目生成的jar或war包中,一般對于服務器已提供的jar包,但是開發過程中又需要用到該jar包則定義為provided(因為服務器本身已有該jar包,所以不需要在打包時帶入,以避免包臃腫和版本沖突),比如:servlet-api、jsp-api --><!-- system:本文后面有介紹 --><!-- runtime:本文后面有介紹 --><!-- import:本文后面有介紹 --><scope>test</scope><!-- excludes標簽配置依賴的排除 --><exclusions><!-- exclude標簽中配置一個具體的依賴排除 --><exclusion><!-- 指定要排除的依賴的坐標(不需要寫version) --><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><!-- 此處不寫版本在于父工程my-test-member中dependencyManagement中定義了該包的版本信息,如果寫上版本號則使用該pom中定義的版本,不寫則使用父工程定義的版本 --><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><!-- configuration 標簽:配置 spring-boot-maven-plugin 插件 --><configuration><!-- 具體配置信息會因為插件不同、需求不同而有所差異 --><!-- source:要求編譯器使用指定的jdk版本來兼容寫的源代碼 --><source>1.8</source><!-- target:源文件編譯后,生成的 *.class 字節碼文件要符合指定的 JVM 版本 --><target>1.8</target><!-- encoding:工程構建過程中讀取源碼時使用的字符集 --><encoding>UTF-8</encoding></configuration></plugin></plugins></build></project>

約定優于配置

maven可以做依賴管理與項目構建,其中的項目構建的方便得益于maven提供的約定優于配置,比如項目打包需要編譯源文件、測試等等,那么需要知道源文件在哪、測試類在哪,這就體現了maven本身對于項目目錄結構的一個約定

約定優于配置優于編碼

二、maven常用命令

注意:使用 Maven 構建操作相關的命令時,必須進入到 pom.xml 所在的目錄。如果沒有在 pom.xml 所在的目錄運行 Maven 的構建命令,則會報錯(mvn -v這種和構建操作無關的命令則配置了PATH之后可以在任何目錄執行):

如果一個項目中有多個pom.xml則在哪個pom.xml目錄執行構建命令,就是對哪個工程的構建操作。

mvn clean 刪除 target 目錄,可以用作清除上一次構建記錄,不會刪除已安裝在本地倉庫中的jar包 mvn compile 主程序編譯(對src/main目錄代碼進行編譯),結果存放在target/classes目錄 mvn test-compile 測試程序編譯(對src/test目錄代碼進行編譯),結果存放在target/test-classes mvn test 測試項目,執行src/test目錄下的測試方法(會輸出測試結果比如運行多少個、失敗多少、報錯多少、跳過多少,如果失敗會輸出失敗信息),測試報告存放在target/surefire-reports目錄 mvn package 將項目打成jar/war包存放在 target 目錄,不會在maven本地倉庫中存入該jar包 mvn install 和mvn package具有相同的作用,但是會在maven本地倉庫中存入/安裝該jar包,并且會將 pom.xml 也安裝在本地倉庫中maven命令組合,比如: mvn clean install -Dmaven.test.skip=true 作用:清除上次構建記錄并安裝jar包,并且跳過測試環節 解釋: # -D 表示后面要附加命令的參數,字母 D 和后面的參數是緊挨著的,中間沒有任何其它字符 # maven.test.skip=true 表示在執行命令的過程中跳過測試 # mvn clean install 是clean和install操作的組合,為什么是這種組合,這個和maven的生命周期有關

maven生命周期
生命周期的設定是為了讓maven工程構建過程自動化完成,總共設定了三個生命周期,生命周期中的每一個環節對應構建過程中的一個操作;一個工程構建一般會包含編譯、測試、打包、部署等等,如果沒有生命周期的設定;我們想要完成工程的部署,需要將編譯、測試、打包按照順序分別執行,有了生命周期的設定之后,我們只需要執行我們想要的結果操作即可,要實現該結果前面需要進行的操作,按照生命周期執行即可,而不需要手動去執行。比如某個生命周期包含有1->5這五個操作,那么我們執行操作3的話maven會在執行3之前將該生命周期中1和2順序執行。

注意:執行某個操作時maven會將該生命周期中,該操作之前的操作都執行,只是執行該生命周期前面的操作,不會執行其他生命周期的操作;比如:執行 install 命令,它屬于Default這個生命周期的命令,那么會將Default中install前面的命令都按照順序執行(也就是除了最后一步deploy,其他的操作都會按照順序執行),正因為這個設定執行maven命令的時候,每個生命周期執行一個命令即可,如果想要執行其他生命周期的操作需要和另外生命周期中的命令進行組合,而mvn clean install這個組合命令中,install屬于Default、clean屬于Clean這兩個命令不屬于一個生命周期,所以想要他們都執行需要進行組合命令,而因為會執行命令所屬生命周期的前面所有操作,所以沒必要將生命周期中的每個命令都寫上

maven插件
maven中構建工程相關的命令都是由maven插件最終執行,maven本身僅僅負責調度。使用方式如:
創建maven工程的命令:mvn archetype:generate 其中mvn是主命令、archetype:generate是子命令、archetype是插件、generate是目標。
一個插件可以對應多個目標,而每一個目標都和生命周期中的某一個環節對應。
比如Default 生命周期中有 compile 和 test-compile 兩個和編譯相關的環節,這兩個環節對應 compile 和 test-compile 兩個目標,而這兩個目標都是由 maven-compiler-plugin-3.1.jar 插件來執行的。

三、依賴傳遞與排除依賴

maven進行依賴時是通過本地maven倉庫進行的jar包導入,比如A依賴了B,如果B工程做了修改(不論是代碼或pom的修改),需要先安裝B工程到本地倉庫,否則本地倉庫還是上一次B的版本,即使A進行構建依賴的B還是未修改的;所以當被依賴工程B做了修改需要先安裝到本地倉庫,然后再構建A。

依賴傳遞

比如:A 依賴 B,B 依賴 C, A 沒有配置對 C 的依賴的情況下,A 里面是否可以使用 C
分情況看:
B 依賴 C 時使用 compile 范圍:可以傳遞
B 依賴 C 時使用 test 或 provided 范圍:不能傳遞,所以A需要C的 jar 包時,就必須在A里面明確配置依賴C才可以。
換言之就是A里面想要使用C的話,需要A依賴的這個B的jar包里面有C的jar包,也就是需要B依賴C的時候使用compile范圍,而不能是test 或 provided范圍。

依賴排除

比如:A 依賴 B,B 依賴 C, C可以傳遞到A中,但是A不需要B依賴的C,比如A中已經有一個其他版本的C的依賴了,為了避免jar包沖突,所以A需要使用本身配置的C而不是B依賴的C,那么此時就需要在A依賴B時排除掉B依賴的C,即在A的pom.xml中依賴B時使用exclusions標簽排除C。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><!-- excludes標簽配置依賴的排除 --><exclusions><!-- exclude標簽中配置一個具體的依賴排除 --><exclusion><!-- 指定要排除的依賴的坐標(不需要寫version) --><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency>

四、繼承

和Java的繼承類似,Java繼承子類可以擁有父類的變量及方法;在maven中的繼承就發生在父工程和子工程中,子工程可以繼承父工程的依賴以及使用父工程中定義的版本信息,一般用于在父工程中做版本統一管理,子工程使用父工程定義的版本信息,避免整個項目中相同jar包各個子工程版本五花八門,最終導致依賴沖突或意料之外的異常信息;所以一般情況下父工程中需要將所有子工程的依賴都進行版本規范,每個子工程依賴本工程需要的依賴包即可(如果子工程導入依賴時不寫版本號則采用父工程定義的版本號,子工程寫了版本號則使用子工程定義的版本號),也可以考慮將所有子工程都會用到的依賴,放在父工程中,這樣所有子工程也會通過繼承的方式擁有這個依賴(不推薦,還是在父工程中只定義版本管理);子工程中使用 parent 標簽定義父工程;每個POM都有且僅有一個父POM(未定義parent的話就是默認的超級POM作為父POM),并且可以多級繼承;比如A工程繼承B工程,B工程繼承C工程,那么A工程中可以用到C工程定義的 dependencyManagement
父工程:

<modelVersion>4.0.0</modelVersion><groupId>org.my.test.member</groupId><artifactId>my-test-member</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><!-- properties:定義屬性值 --><properties><!-- 自定義屬性mysql版本號,對于自定義屬性來說名稱自己寫 --><mysql.version>8.0.17</mysql.version></properties><!-- 使用dependencyManagement標簽配置對依賴的管理 --><!-- 被管理的依賴并沒有真正被引入到工程 --><dependencyManagement><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><!-- 使用properties中自定義的屬性值mysql版本號,好處是如果有多處使用該版本號,直接修改properties中的mysql版本號屬性值即可 --><version>${mysql.version}</version></dependency></dependencies></dependencyManagement>

子工程:

<!-- parent:給當前工程配置父工程 --><parent><!-- 通過坐標信息定位父工程 --><artifactId>my-test-member</artifactId><groupId>org.my.test.member</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.my.test.member</groupId><artifactId>my-test-member-biz</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><dependencies><dependency><!-- 此處不寫版本在于父工程my-test-member中dependencyManagement中定義了該包的版本信息,如果寫上版本號則使用該pom中定義的版本,不寫則使用父工程定義的版本 --><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency></dependencies>

POM的四個層級:
超級POM、父POM、當前POM、有效POM
超級POM:類似于Java中的Object類,超級POM是所有POM的頂級父類、如果某個POM未定義父POM,那么它的父POM就是這個超級POM;超級POM定義了如源文件存放的目錄、測試源文件存放的目錄、構建輸出的目錄……等等。
父POM:在POM中通過 parent 標簽指定的POM就是該POM的父POM。一個POM有且僅有一個父POM。
當前POM:當前工程的POM。
有效POM(effective POM):因為有繼承關系及依賴傳遞的存在,所以我們當前工程的POM定義的內容,并不是當前工程所有的POM內容,POM會按照繼承關系及依賴傳遞做疊加操作,最終得到的POM就是有效POM,也就是對當前工程依賴及相關設定最終產生效果的POM。
有效POM的疊加關系:在 POM 的繼承關系中,子 POM 可以覆蓋父 POM 中的配置;如果子 POM 沒有覆蓋,那么父 POM 中的配置將會被繼承(也就是說如果在繼承關系中有多個POM都對同一個內容進行了定義則離當前POM距離越近的配置生效,如果多個POM中只有一個POM對內容進行了定義則不管有多少級的繼承關系,這個內容都會生效。比如當前工程A繼承B繼承C,ABC都對a依賴做了配置,那么A中對a依賴的配置生效,如果只有C中做了c依賴配置,那么C中對c依賴的配置會生效,如果B和C都對b依賴做了配置,那么B中對b依賴的配置會生效)。按照這個規則,繼承關系中的所有 POM 疊加到一起,就得到了一個最終生效的 POM。
查看有效POM的命令:

mvn help:effective-pom

五、聚合

定義一個“總工程”將各個“模塊工程”匯集起來,作為一個完整的項目;一般來說總工程也是父工程(繼承角度)乃至于最頂級的父工程,子工程則是模塊工程。好處是可以在總工程中執行maven命令,從而對總工程中定義的模塊工程都執行該命令,并且會自動梳理依賴關系,進行執行命令。通過在總工程中使用 modules 標簽定義模塊工程即可。
總工程/父工程:

<!-- modules:配置工程聚合,聚合的好處是:我們在哪個工程下執行maven命令則是對該工程的操作,但是在總工程中執行則可以對所有modules定義的模塊操作,比如執行mvn install就是安裝哪個工程,如果這個工程有modules定義,則會在安裝的時候自動梳理聚合模塊工程之間的依賴關系,比如父子工程,依賴傳遞等,然后先去安裝父工程和被依賴工程,再安裝工程本身,而不需要我們自己手動按照順序安裝每一個工程,注意別發生循環依賴,比如A依賴B,B依賴C,然后C又依賴了A,這樣會報錯 --><modules><!-- module:配置一個具體的聚合模塊 --><module>my-test-member-api</module><module>my-test-member-biz</module></modules>

循環依賴報錯如下:

DANGER[ERROR] [ERROR] The projects in the reactor contain a cyclic reference:

六、properties 屬性聲明及引用

使用 properties 標簽可以定義系統自帶的屬性值以及自定義屬性及屬性值,方式:

<properties><!-- 自定義屬性mysql版本號,對于自定義屬性來說名稱自己寫 --><mysql.version>8.0.17</mysql.version></properties>

主要用途:
1、在當前 pom.xml 文件中引用屬性,比如依賴版本定義引用 properties 中的屬性,達到一處修改,全部版本都替換的效果。
2、資源過濾功能:在非 Maven 配置文件中引用屬性,由 Maven 在處理資源時將引用屬性的表達式替換為屬性值(下方 十、profile 標簽 中有講解)

查看屬性值:根據輸入表達式,輸出表達式結果:

mvn help:evaluate

執行該命令后,會要求輸入表達式,然后輸出表達式的結果。
1、比如輸出剛剛定義的 mysql.version 的表達式就是

${屬性名} 如:${mysql.version}

2、訪問系統屬性:比如Java系統屬性也就是通過 System.getProperties() 方法可以拿到的屬性,表達式就是:

${屬性名} 如:${java.runtime.name}

3、訪問系統環境變量:比如JAVA_HOME,表達式就是:

${env.系統環境變量名} 如:${env.JAVA_HOME}

4、訪問 project 屬性,也就是訪問當前POM中的元素值,表達式就是:

${project.元素名} 如:訪問當前POM的一級標簽表達式:${project.標簽名},如:${project.artifactId} 輸出當前POM的artifactId的值 訪問當前POM的子級標簽表達式:${project.標簽名.子標簽名},如:${project.parent.groupId} 輸出當前POM的父POM的groupId的值 訪問列表標簽表達式:${project.標簽名[下標]},如:${project.modules[0]} 輸出當前POM的modules標簽下的第一個值,${project.build.plugins[0]} 輸出當前POM的build標簽下的plugins標簽下的第一個值

5、訪問 settings 全局配置,比如maven settings.xml配置文件中的屬性,表達式就是:

${settings.標簽名} 如:${settings.localRepository} 輸出settings.xml配置的本地倉庫的路徑

七、build 標簽

build意為構建,意思就是在工程構建過程中的定制化操作,因為超級POM是每個POM的直接或間接父POM,所以每個工程的有效POM實際上其中的 build 都包含了超級POM中定義的 build 標簽內容;當有效POM中的 build 標簽內容(因為繼承關系包含所有父POM的build內容)不能滿足當前工程的構建的時候,那么我們就會在當前工程中定義 build 標簽內容,所以 build 標簽不是一定會存在當前工程中的。

build標簽大致包含三類子標簽:
1、定義約定的目錄結構
如:

<build><sourceDirectory>E:\test\my-test-product\my-test-product-biz\src\main\java</sourceDirectory><scriptSourceDirectory>E:\test\my-test-product\my-test-product-biz\src\main\scripts</scriptSourceDirectory><testSourceDirectory>E:\test\my-test-product\my-test-product-biz\src\test\java</testSourceDirectory><outputDirectory>E:\test\my-test-product\my-test-product-biz\target\classes</outputDirectory><testOutputDirectory>E:\test\my-test-product\my-test-product-biz\target\test-classes</testOutputDirectory> </build>

2、備用插件管理
通過 pluginManagement 標簽在父POM中來管理插件版本和 dependencyManagement 在父POM中定義依賴版本意思一樣,子工程使用父工程中定義的插件時可以省略版本號,起到在父工程中統一管理插件版本的效果。
如:
父工程(在build標簽中使用pluginManagement標簽管理插件版本):

<build><pluginManagement><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.5.RELEASE</version></plugin></plugins></pluginManagement></build>

子工程(在build標簽中使用plugins導入父工程管理的插件時,可以不寫版本號,使用父工程定義的版本號,和繼承一樣,子工程可覆蓋父工程,即采用的版本是距離當前工程最近的工程中定義的版本):

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

spring-boot-maven-plugin 插件作用:
比如spring boot項目使用maven本身install的插件只會將工程代碼本身進行安裝生成jar包,但我們想要java -jar可以直接運行的jar包,除了工程代碼本身,還需要依賴的jar包、Servlet容器(如:Tomcat)、
通過 java -jar 方式可以直接啟動jar包相關的配置等;spring-boot-maven-plugin插件就可以實現上述功能。
3、生命周期插件
如:

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.5.0</version><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals><configuration><mainClass>${start-class}</mainClass></configuration></execution></executions><configuration><mainClass>${start-class}</mainClass></configuration></plugin><plugins></build>

解釋:
坐標:groupId、artifactId、version 標簽定義了插件的坐標,如果是 Maven 的自帶插件會省略 groupId
executions 標簽內可以配置多個 execution 標簽,execution 標簽內含義:
id:指定唯一標識
phase:關聯的生命周期階段
goals/goal:關聯指定生命周期的目標,goals 標簽中可以配置多個 goal 標簽,表示一個生命周期環節可以對應當前插件的多個目標。
configuration:對插件目標的執行過程進行配置,其中的標簽需要是插件本身定義的,如上面的 spring-boot-maven-plugin 插件中的 repackage 目標,配置 mainClass 標簽,這個 mainClass 就是 spring-boot-maven-plugin 插件中的類中的屬性,意思是指定spring boot項目的啟動類。
4、其他,如:

<build><!-- 當前工程在構建過程中使用的最終名稱 --><finalName>test-xxx</finalName></build>

build 標簽典型應用:
除了上面提到的使用 spring-boot-maven-plugin 插件,用于生成 java -jar可直接運行的 jar 包外,另外就是用于指定jdk版本也是常用的功能:
為什么需要指定jdk版本:不指定jdk版本的情況下項目一般默認識別的jdk版本是1.5,那么這個時候如果我們在項目中的代碼,使用了jdk5以上版本的語法,比如jdk8的 Lambda 表達式 那么idea編輯器會提示這段代碼報錯,并且此時編譯或打包也會報錯。那么如果指定 jdk版本 的話一般可以在三個地方指定:
a、maven的 settings.xml 配置文件中的 profile 標簽指定:

<!-- 配置Maven工程的默認JDK版本 --> <profile><!-- id:唯一標識 --><id>jdk-1.8</id><!-- activation:激活方式 --><activation><!-- activeByDefault:是否默認激活--><activeByDefault>true</activeByDefault><!-- jdk:標識當前 profile 可以根據 jdk 版本激活,比如這里如果環境是 jdk 1.8 的話就激活當前 profile 配置,不是則不激活,激活了當前 profile 之后,如果當前 profile 還是默認激活的話,則采用當前 profile --><jdk>1.8</jdk></activation><!-- properties:當前 profile 激活并且使用后要應用的配置 --><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>

b、當前工程的 pom.xml 中 build 標簽指定:

<!-- build 標簽:指定maven構建工程的定制化操作! --> <build><!-- plugins 標簽:指定需要用到的插件! --><plugins><!-- plugin 標簽:指定一個具體的插件 --><plugin><!-- 插件的坐標。此處引用的 maven-compiler-plugin 插件不是第三方的,是一個 Maven 自帶的插件。 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><!-- configuration 標簽:配置 maven-compiler-plugin 插件 --><configuration><!-- 具體配置信息會因為插件不同、需求不同而有所差異 --><!-- source:要求編譯器使用指定的jdk版本來兼容寫的源代碼 --><source>1.8</source><!-- target:源文件編譯后,生成的 *.class 字節碼文件要符合指定的 JVM 版本 --><target>1.8</target><!-- encoding:工程構建過程中讀取源碼時使用的字符集 --><encoding>UTF-8</encoding></configuration></plugin></plugins> </build>

c、當前工程的 pom.xml 中 properties 標簽指定:

<properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>

三種方式區別:
a方式settings.xml 中配置:僅在本地生效,如果脫離當前 settings.xml 能夠覆蓋的范圍,則無法生效,這樣就可能會導致我們本地的maven settings.xml文件中做了相關設置,但是同事的本地maven倉庫卻沒有做該設置,那么我們本地可以編譯、打包該項目,同事拉取代碼之后卻無法完成編譯、打包操作;但是因為 settings.xml 是對整個maven的配置,所以對于本地的多個項目來說都能夠生效。
b、c方式在當前 Maven 工程 pom.xml 中配置:無論在哪個環境執行編譯等構建操作都有效,但僅僅對當前工程生效。

八、scope 依賴范圍

在 dependencies 中導入依賴的時候,每個依賴可以定義 scope 即依賴范圍。
默認值compile,總共有6種可選值:compile/test/provided/system/runtime/import

compile:默認值,compile范圍的jar包,可以在開發時正常使用該jar包里面的類方法等(可以在main/test目錄下的程序中正常使用),并且項目打包的時候會將該jar包打入到項目生成的jar或war包中,即該jar包會被main目錄中的程序使用且不屬于provided的情況如:spring-boot-startertest:test范圍的jar包,開發時可以在test目錄下的程序正常使用該jar包里面的類方法等,但是main目錄下的程序不能正常使用,并且項目打包的時候不會將該jar包打入到項目生成的jar或war包中,即僅作測試用的jar包定義該范圍如:junitprovided:provided范圍的jar包, 可以在開發時正常使用該jar包里面的類方法等(可以在main/test目錄下的程序中正常使用),并且項目打包的時候不會將該jar包打入到項目生成的jar或war包中,一般對于服務器已提供的jar包,但是開發過程中又需要用到該jar包則定義為provided(因為服務器本身已有該jar包,所以不需要在打包時帶入,以避免包臃腫和版本沖突),比如:servlet-api、jsp-apisystem:比如 Windows 系統環境下開發,如果現在想要將 D:\tempare\test-aaa-1.0-SNAPSHOT.jar 引入到項目中,那么就可以將依賴配置為 system 范圍(缺點:因為引入的依賴是本地路徑完全不具有可移植性,基本不使用): <dependency><groupId>org.my.test</groupId><artifactId>test-aaa</artifactId><version>1.0-SNAPSHOT</version><systemPath>D:\tempare\test-aaa-1.0-SNAPSHOT.jar</systemPath><scope>system</scope> </dependency>runtime:用于編譯時不需要,但是運行時需要的 jar 包。比如:編譯時根據接口調用方法,但是實際運行時需要的是接口的實現類。如: <!--熱部署 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional> </dependency>import:一般通過繼承父工程來管理依賴,但是 Maven 是單繼承的;如果不同體系的依賴信息封裝在不同 POM 中,此時想要將他們都導入進來就可以使用 import 依賴范圍(要求:打包類型必須是 pom、必須放在 dependencyManagement 中)。如: <dependencyManagement><dependencies><!-- SpringCloud 依賴導入 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR9</version><type>pom</type><scope>import</scope></dependency></dependencies> </dependencyManagement>

可選依賴:
在上面的 runtime 依賴范圍的例子中導入 spring-boot-devtools 包的時候,有一個 optional 標簽;該標簽就是配置可選依賴,意為可有可無;官方解釋為:比如Project X 依賴 Project A,A 中一部分 X 用不到的代碼依賴了 B,那么對 X 來說 B 就是『可有可無』的。簡單來說就是 標記了 optional 標簽為 true 的依賴就是這個包里面的功能很少會用到,所以不要這個依賴不影響工程正常功能,如果使用到了這個包里面的功能就需要導入這個依賴。

九、版本仲裁

出現版本仲裁的情況一定是工程依賴了一個jar包的不同版本,如果本來就是不同的依賴包則是做疊加操作,也就是在最終生成的有效POM中這些依賴包都存在。
如果是通過繼承方式得到的依賴包或者依賴版本管理是子工程覆蓋父工程也就是繼承關系中距離當前工程越近的聲明生效。
如果是依賴傳遞的方式,則采用兩種方式仲裁:
a、最短路徑優先
比如A工程依賴B工程依賴C工程依賴了 x-1.0 jar包、A工程依賴D工程依賴了 x-2.0 jar包,則在A工程中生效的 x jar包是D工程中依賴的 x-2.0 jar包。
b、路徑相同時先聲明者優先
比如A工程依賴B工程依賴了 y-1.0 jar包、A工程依賴D工程依賴了 y-2.0 jar包,此時對于A工程來說,想要依賴 y jar包,兩個版本的路徑長度一樣,那么對于依賴哪個 y jar包就是由A工程中的 pom.xml 中先聲明的B工程依賴還是D工程依賴決定。先聲明依賴B工程則是采用 y-1.0 jar包,先聲明依賴D工程則是采用y-2.0 jar包。
maven版本仲裁只是maven的一個依賴沖突的自動解決方案(在沒有人為干預的情況下按照以上規則進行仲裁),當通過maven本身的版本仲裁之后,項目功能沒問題可以正常運行,不需要多做關心;但是有些情況下通過版本仲裁得到的依賴會不滿足我們的使用要求,比如版本仲裁得到 1.0 版本,但是我們使用的該 jar包 中的某個方法,1.0 版本沒有(或者1.0版本的邏輯不滿足要求)這個方法在仲裁失敗的 2.0 版本中并且滿足要求,那么此時就只有人為干預讓 maven 依賴 2.0 版本;比如在當前工程中明確指定依賴的版本信息,或者通過 exclusion 標簽,排除 1.0 版本的依賴。

十、profile 標簽

在 Maven 中,使用 profile 機制來管理不同環境下的配置信息。并且解決同類問題的類似機制在其他框架中也有;比如生產環境、測試環境、開發環境的數據庫緩存連接等而且從模塊劃分的角度來說,持久化層的信息放在構建工具中配置也違反了『高內聚,低耦合』的原則。

默認 profile
在 pom.xml 中不在 profile 標簽內的配置,就是配置的默認 profile 。因為根標簽 project 下所有標簽相當于都是在設定默認的 profile。project 標簽下除了 modelVersion 和坐標標簽之外,其它標簽都可以配置到 profile 中。

使用順序
a、為每個環境聲明一個 profile
環境 A:profile A
環境 B:profile B
環境 C:profile C
b、激活某個環境的 profile

profile 配置地方
a、maven的 settings.xml 配置文件中的 profile 標簽:對本地工程都生效。比如上面配置 JDK 1.8。
b、pom.xml:僅對當前工程生效。

profile 標簽內容
a、profiles/profile 標簽
profile 代表某個配置并且配置可以有多個,由 profiles 標簽統一管理;所以 profile 配置在 profiles 標簽中。
profile 標簽中的配置會覆蓋 pom.xml 中的同級配置,所以 profiles 標簽通常是 pom.xml 中的最后一個標簽。
b、id 標簽
每個 profile 都必須有一個 id 標簽,指定該 profile 的唯一標識。這個 id 標簽的值會在命令行調用 profile 時被用到。命令格式(作為命令的參數被使用):-P<profile的id>,如:mvn compile -PjdkTest,其中 jdkTest 就是某個 profile 的 id 標簽的值;意思是在編譯的時候使用 profile id為 jdkTest 的配置進行編譯。
c、其他標簽
除了上面a b標簽是 profile 固定的之外,其他標簽是 project 跟標簽下除了 modelVersion 和坐標標簽,都可以配置到 profile 中;比如一個 profile 可以覆蓋項目的最終名稱、項目依賴、插件配置等各個方面以影響構建行為。

profile 激活
a、當 POM 中沒有在 profile 標簽里的配置就是默認的 profile,默認被激活。
b、基于環境信息激活,如:JDK 版本、操作系統參數、文件、屬性等等。一個 profile 一旦被激活,那么它定義的所有配置都會覆蓋原來 POM 中對應層次的元素。比如:

<profiles><profile><id>JDK1.8</id><!-- activation:配置激活條件 --><activation><!-- 配置是否默認激活 --><activeByDefault>false</activeByDefault><!-- 指定激活條件為:JDK 1.8 --><jdk>1.8</jdk><!-- property:指定激活屬性 --><property><!-- name:激活屬性名稱 --><name>mavenVersion</name><!-- value:激活屬性值 --><value>3.5.4</value></property></activation></profile> </profiles>

表示當 JDK 版本為 1.8 且 maven 版本為 3.5.4 時被激活(Maven 3.2.2 及之后的版本)
上面的例子有兩個激活條件則(多個激活條件也一樣):
Maven 3.2.2 之前:遇到第一個滿足的條件即可激活即或的關系。
Maven 3.2.2 開始:各條件均需滿足即且的關系。
c、命令行激活
列出所有激活的 profile,以及它們在哪里定義

mvn help:active-profiles

執行maven指令時指定某個具體的 profile

mvn clean test -P<profile id> 如:mvn clean test -PjdkTest 指定清理測試時使用id為jdkTest的profile

資源屬性過濾
Maven 能夠通過 profile 實現各不同運行環境切換,因為 Maven 提供了『資源屬性過濾』的機制。通過屬性替換實現不同環境使用不同的參數。
我們可以在當前工程的 pom.xml 文件中,定義每個環境的 profile 配置,然后maven構建工程時,指定使用某個環境的profile即可,比如定義數據庫連接信息,可以這樣定義:
第一步:在 pom.xml 中通過 profile 定義數據庫連接信息:

<profiles><profile><id>devJDBC</id><properties><dev.jdbc.user>root</dev.jdbc.user><dev.jdbc.password>test123</dev.jdbc.password><dev.jdbc.url>http://localhost:3306/test</dev.jdbc.url><dev.jdbc.driver>com.mysql.jdbc.Driver</dev.jdbc.driver></properties><build><resources><resource><!-- 表示為這里指定的目錄開啟資源過濾功能 --><directory>src/main/resources</directory><!-- 開啟資源過濾功能 --><filtering>true</filtering><!-- includes和excludes可以不配置 --><includes><include>*.properties</include></includes><excludes><exclude>test.properties</exclude></excludes> </resource></resources></build> </profile> </profiles>

第二步:創建待處理的資源文件;如:application.properties(在上一步中定義的開啟資源過濾功能目錄是src/main/resources,所以需要將application.properties文件,創建在該目錄下)

dev.user=${dev.jdbc.user} dev.password=${dev.jdbc.password} dev.url=${dev.jdbc.url} dev.driver=${dev.jdbc.driver}

第三步:執行 maven 構建工程的命令并指定使用對應環境的 profile

mvn clean install -PdevJDBC

執行清理安裝命令時 會將 id 為 devJDBC 的profile配置,做資源過濾處理,效果就是會將 devJDBC 中配置的user、password、url、driver等信息,寫入到 application.properties 文件中的對應屬性上。application.properties 中 ${dev.jdbc.user} 對應 devJDBC 中的 <dev.jdbc.user>root</dev.jdbc.user> 也就是將 root 賦值給 dev.user屬性。

includes、excludes
有時會在 resource 標簽下配置 includes 和 excludes 標簽;作用是:
includes:指定執行 resource 階段時要包含到目標位置的資源
excludes:指定執行 resource 階段時要排除的資源
比如上面的 devJDBC profile的例子,其中的 includes 指的是在 resource 階段,需要將當前工程 resources 目錄下的所有 properties 文件包含到目標位置,excludes 指的是這些 properties 文件中排除test.properties 文件。

Nexus下載安裝及對接
maven jar包沖突解決方案、導入非maven工程jar包

總結

以上是生活随笔為你收集整理的maven pom.xml解析、命令说明、依赖传递、继承、聚合、properties、build、依赖范围、版本仲裁、profile的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

91在线看视频 | 成人h动漫精品一区二 | 国产黄色片在线免费观看 | 亚州精品天堂中文字幕 | 成人超碰97| 狠狠干夜夜操天天爽 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 黄色影院在线观看 | 亚洲国产精品久久久 | 9幺看片| 成 人 黄 色 视频 免费观看 | 黄色一级大片在线免费看国产一 | 久久免费视频播放 | 中文字幕一二三区 | 亚洲精品国产精品乱码不99热 | 福利一区二区三区四区 | 天天操天天舔天天干 | 精品亚洲免费视频 | 国内精品久久久久久久久久清纯 | 91一区二区在线 | 色先锋av资源中文字幕 | 97免费| 亚洲精品国产第一综合99久久 | 久久精品国产免费看久久精品 | 国产精品色婷婷视频 | 久久久久久久久网站 | 奇米影视777影音先锋 | 日韩成人黄色av | 亚洲日本va在线观看 | av短片在线观看 | 日韩动漫免费观看高清完整版在线观看 | 国产精品久久久久久久久久久久 | www.玖玖玖| 日韩二区三区在线观看 | 久久伊人精品一区二区三区 | 久久久久欧美精品 | 久久精品欧美一区 | 狠狠综合久久 | 久免费 | 超碰97在线看 | 精品亚洲免费 | 狠狠的操狠狠的干 | 99久久这里只有精品 | 久久精品理论 | 欧美在线视频精品 | 国产打女人屁股调教97 | 免费观看成人网 | 欧美精品在线视频观看 | 四虎影视精品 | 五月天婷婷视频 | 国产v在线播放 | 日日夜夜天天射 | 国产一区在线观看免费 | 日韩免费电影一区二区三区 | 国产精品久久久久久久久久久不卡 | 国产亚洲精品久久久久久 | 99色亚洲| 中文字幕色婷婷在线视频 | 成人91在线观看 | 丁香六月婷婷开心婷婷网 | 欧美成人播放 | 国产日韩精品一区二区在线观看播放 | 国产精品日韩欧美 | 亚洲人人av| 久久高清国产视频 | 色婷婷国产精品一区在线观看 | av免费播放 | 狠狠干五月天 | 国产在线精品一区二区 | 成人黄色电影在线观看 | 久草网在线观看 | 亚洲精品国产精品国自产 | 天天干国产| 欧美激情第一区 | av在线一级 | 国产一区欧美在线 | 成人在线观看日韩 | 91丨精品丨蝌蚪丨白丝jk | a在线v| 成人一级在线 | 成人免费在线网 | 婷婷五综合 | 欧美一级黄色片 | avove黑丝 | 日韩精品视频在线免费观看 | 玖玖视频精品 | 人人澡人| 夜夜高潮夜夜爽国产伦精品 | 四虎8848免费高清在线观看 | 久久亚洲欧美 | 国内久久视频 | 久久国产成人午夜av影院潦草 | 国产精品久久久久久久久久不蜜月 | 丁香花在线观看免费完整版视频 | 日本不卡一区二区 | zzijzzij日本成熟少妇 | 亚洲欧美成人综合 | 国产少妇在线观看 | 久久婷婷丁香 | 久久网站最新地址 | 婷五月天激情 | 久草网站 | 91成人天堂久久成人 | 美女一区网站 | 91资源在线播放 | 天堂av网站 | 五月婷婷丁香激情 | 久久免费视频网 | 国产日韩视频在线 | 人人爽人人乐 | 蜜臀久久99精品久久久久久网站 | 久草在线视频免赞 | 九九九视频精品 | 欧美污在线观看 | 中文字幕一区二区三区在线播放 | 国产日韩中文字幕 | 欧洲一区二区在线观看 | 中文字幕在线中文 | 又大又硬又黄又爽视频在线观看 | 欧美美女视频在线观看 | 久久与婷婷 | 亚洲va综合va国产va中文 | 伊人电影在线观看 | 91视频高清完整版 | 日本女人在线观看 | 黄色软件视频大全免费下载 | 午夜骚影 | 欧美国产日韩一区 | 91人人爽人人爽人人精88v | 97操碰 | 91pony九色丨交换 | 欧美日韩在线电影 | 国产午夜麻豆影院在线观看 | 国产精品不卡在线观看 | 黄色美女免费网站 | 97电影手机版 | 久久久精品小视频 | 精品美女久久久久久免费 | 97超碰网 | 国产手机精品视频 | 亚洲精品综合在线观看 | 久久高清免费 | 久久久久久久久免费 | 天天干天天拍天天操 | 最新精品视频在线 | 欧美日韩三区二区 | 国产成人精品一区二区三区在线观看 | 国产亚洲精品综合一区91 | 狠狠操操 | 黄色一级大片免费看 | 亚洲一区久久久 | 中文字幕欧美日韩va免费视频 | 成人av在线影院 | 国产福利在线不卡 | www.91成人 | 欧美午夜a | 激情综合啪啪 | 超碰国产在线 | 国产精品久久久久久久久免费 | 亚洲电影久久 | 91精品在线播放 | 天天操福利视频 | 91视频在线免费下载 | 黄色a在线 | 伊人五月天婷婷 | 亚洲成人国产精品 | а天堂中文最新一区二区三区 | 91成人网在线 | 免费亚洲精品视频 | 亚洲精品美女久久久久网站 | 在线国产欧美 | 草在线视频 | 在线国产小视频 | 精品国产aⅴ麻豆 | 干干夜夜 | 久久久美女 | 99久久精| 日本成人a| 欧美精品乱码久久久久 | 久久免费的视频 | av福利在线导航 | 99久久er热在这里只有精品66 | 超碰99人人 | 中文字幕亚洲综合久久五月天色无吗'' | 国产中文字幕在线看 | 亚洲精品视频在线观看视频 | 五月婷婷丁香在线观看 | 天天干中文字幕 | 香蕉影院在线观看 | 日韩午夜网站 | 日韩亚洲国产中文字幕 | 日韩精品一区二区三区中文字幕 | 五月婷婷一区二区三区 | 久久成熟 | 国产高清av | 好看av在线 | 欧美与欧洲交xxxx免费观看 | 久视频在线 | 国产亚洲精品久久久久动 | 欧美男女爱爱视频 | 成人黄大片视频在线观看 | 国产精品高清一区二区三区 | 99热官网 | 日韩 精品 一区 国产 麻豆 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | www.91国产| 欧美一级在线观看视频 | 国产亚洲一区二区三区 | 亚洲国产视频网站 | 亚洲成人精品在线 | 黄色小网站在线 | 婷婷国产视频 | 久草在线综合 | 91精品办公室少妇高潮对白 | 国产视频亚洲 | 中文字幕 二区 | 国产精品成人aaaaa网站 | 狠狠综合久久av | 亚洲一级免费电影 | 中日韩在线 | av动图| 中文字幕在线国产精品 | 一区在线免费观看 | 国产精品欧美久久久久天天影视 | 91在线看片 | 国产不卡精品 | 天天拍天天爽 | 日韩精品久久久久久久电影竹菊 | 国产 视频 高清 免费 | 免费看久久久 | 国产成人av综合色 | 成人在线中文字幕 | 在线观看国产麻豆 | 久久黄色网页 | 色婷婷免费视频 | 久久综合偷偷噜噜噜色 | 91成年人网站 | 国产日韩一区在线 | 免费在线观看视频a | 亚洲人成免费 | 亚洲日韩精品欧美一区二区 | 婷婷在线精品视频 | 日本精品视频免费观看 | 国产精品视频全国免费观看 | 欧美久草视频 | 成人毛片一区二区三区 | 久久久久久久久久久综合 | 亚洲视频电影在线 | 欧美日韩国产一区二区三区在线观看 | 国产精品久久久久久久久搜平片 | 免费福利在线 | 久久99最新地址 | 国产高清免费 | 久久免费在线 | 久久久久久国产精品 | 国产一级a毛片视频爆浆 | 天天色天天干天天 | 一区二区不卡在线观看 | 国产黄a三级三级三级三级三级 | 久九视频 | 国产色婷婷精品综合在线手机播放 | 91av视频在线免费观看 | 久久黄色免费 | 久久久www成人免费毛片麻豆 | 亚洲天天看 | av大片免费在线观看 | 国产精品18久久久久久首页狼 | 98超碰人人 | 久久精品欧美日韩精品 | 女人18片毛片90分钟 | 蜜桃视频日本 | 国产淫片免费看 | 99久久精品久久久久久清纯 | 麻豆视频入口 | 色狠狠狠 | 国产成人精品福利 | 狠狠干激情 | 四虎免费在线观看视频 | 国产精品视频久久 | 国产一区播放 | 日韩精品久久久久久久电影99爱 | 国产精品美女久久久久久久 | 国产一级二级在线播放 | 日韩欧美成 | 国产午夜精品av一区二区 | 久久精品4 | 婷色在线 | 97超碰总站 | 麻豆国产精品va在线观看不卡 | 成人免费网站在线观看 | 婷婷深爱 | 99久久精品国产毛片 | 狠狠88综合久久久久综合网 | 日韩电影在线观看一区二区三区 | 狠狠躁日日躁夜夜躁av | 99视频在线观看一区三区 | 亚洲视频免费视频 | 日韩视频免费 | 五月黄色 | 久久久国产一区 | 91视频观看免费 | 五月婷婷.com | 欧美日韩国产二区三区 | 久久官网| 日本中文字幕在线播放 | 亚洲综合成人婷婷小说 | 日本激情动作片免费看 | 丁香五婷| 中文字幕电影一区 | 欧美性视频网站 | 国产片免费在线观看视频 | 久草免费在线视频 | 在线观看免费色 | 99精品视频99 | 国产亚洲精品美女 | 国产糖心vlog在线观看 | 欧美激情精品久久久久久免费印度 | 国产精品18久久久久久首页狼 | 国产成人免费在线观看 | 一区二区三区在线观看免费视频 | 久久久久久看片 | 国产成人精品国内自产拍免费看 | 草久热| 午夜av片 | 国产精品高清在线观看 | 五月天婷亚洲天综合网精品偷 | 少妇精品久久久一区二区免费 | 人人射| 久久国产热视频 | 国产一区二区在线观看免费 | 97国产超碰在线 | 成人黄色一级视频 | 国产精品99精品 | 久草视频网 | 国产精品久久久久久模特 | 久久色亚洲 | 免费在线播放视频 | 探花视频免费观看高清视频 | 激情偷乱人伦小说视频在线观看 | 久久国产精品一区二区三区四区 | 右手影院亚洲欧美 | 亚洲 欧美变态 另类 综合 | 欧美激情综合色 | 日韩va欧美va亚洲va久久 | 亚洲国产精品日韩 | 亚洲高清在线视频 | 制服丝袜一区二区 | 天天射天天做 | 精品久久五月天 | 欧美久久久久久久久久久 | 国产精品成人av电影 | 国产一区在线免费 | 日本精品久久久久 | 中文字幕在线观看第一区 | 日日操网站 | 精品视频国产 | 免费能看的黄色片 | 日韩av片免费在线观看 | 国产玖玖精品视频 | 精品久久久久久一区二区里番 | 国产精品对白一区二区三区 | 人人爽人人澡人人添人人人人 | 国产精品视频永久免费播放 | 在线免费观看黄色 | 黄色国产区 | 午夜av网站 | 欧美一级片免费播放 | 99自拍视频在线观看 | 久久伊人五月天 | freejavvideo日本免费 | 久久成人精品视频 | 在线免费观看一区二区三区 | 成人a v视频 | 日韩在线视频一区二区三区 | 中文字幕之中文字幕 | 久久视频中文字幕 | 超碰在97 | 91精品国产成 | 丁香六月久久综合狠狠色 | 一区二区精品视频 | 精品欧美一区二区精品久久 | 麻豆一区在线观看 | 久久99深爱久久99精品 | 久久精品99 | 中文字幕九九 | 在线观看视频你懂 | 国产婷婷精品av在线 | 精品国产一区二区三区免费 | 精品国产资源 | 7799av| 免费a网| 福利视频第一页 | av高清一区二区三区 | 国产一区二区久久精品 | 日韩高清黄色 | 亚洲理论在线 | 欧美作爱视频 | 欧美视频日韩视频 | 在线观看日本高清mv视频 | 免费三级骚 | 国产精品中文字幕在线观看 | 中文字幕乱码电影 | 久久精品视频播放 | 国产精品国产三级国产aⅴ9色 | 午夜精品一二三区 | 婷婷草 | 精品国产伦一区二区三区观看说明 | 九九免费观看全部免费视频 | 亚洲经典视频 | 精品国产_亚洲人成在线 | 91成人黄色 | 夜夜操夜夜干 | 91毛片在线观看 | 久久的色| 黄色在线观看污 | 久久视频免费 | 亚洲视频免费在线 | 天天摸日日摸人人看 | mm1313亚洲精品国产 | 久久99久久99精品免观看粉嫩 | 久久久www免费电影网 | 91精选在线观看 | 中文字幕精品一区久久久久 | 五月婷婷综 | 国产精品女教师 | 国产精品久久久久久久久久三级 | 免费成人黄色片 | 久久国产精品二国产精品中国洋人 | 九九视频精品免费 | 91天天操| 成人av电影免费在线观看 | 毛片网站免费 | 激情综合网五月婷婷 | 久久免费视频播放 | 婷婷五月情 | 在线免费观看亚洲视频 | 99热在线观看免费 | 1024手机在线看 | 国产精品久久人 | 亚洲片在线 | 天天爽综合网 | 中文字幕日韩在线播放 | 欧美精品亚洲二区 | 久久久久国产精品www | 在线观看中文字幕2021 | 国内精品视频免费 | 精品国产乱码一区二区三区在线 | 久久欧美精品 | 欧美精品一区二区在线观看 | 国产91精品一区二区绿帽 | 爱射综合 | 最新中文字幕在线播放 | 国产精品av一区二区 | 国产一区在线视频观看 | 成人黄色一级视频 | 九九免费观看全部免费视频 | 国产精品一区二区免费 | 国产日韩精品久久 | av 一区 二区 久久 | 激情大尺度视频 | 精品国产aⅴ一区二区三区 在线直播av | 中文区中文字幕免费看 | 免费看色视频 | 青青网视频 | 日韩电影在线观看一区二区 | 97超碰国产在线 | 久久久久国产精品www | 欧美日韩国产一区二区在线观看 | 国产黄色av影视 | 成年人黄色免费视频 | 91九色pron| 国产精品夜夜夜一区二区三区尤 | 国产黄色电影 | 亚洲理论在线 | 99久久精品免费视频 | 在线视频91 | 久久a国产| 亚洲片在线观看 | 日韩国产精品久久 | 国产精品18久久久久久久久 | 欧美亚洲专区 | 国产一区二区在线观看免费 | 日本超碰在线 | 91超碰在线播放 | 99视频精品在线 | 黄色av免费电影 | 免费电影一区二区三区 | 人人草在线观看 | 成年人免费观看在线视频 | 91精品国产成人www | 五月天激情开心 | 亚洲精品动漫成人3d无尽在线 | 免费高清在线观看成人 | 国产精品视频免费在线观看 | 狠狠色噜噜狠狠 | 欧美国产精品久久久久久免费 | 欧美视频www | 久久精品在线视频 | 最近免费中文视频 | 亚洲精品国产综合久久 | 在线观看视频h | 中文字幕色网站 | 国产成人精品av久久 | 亚欧洲精品视频在线观看 | 国产最新视频在线观看 | 99日精品| 日韩 精品 一区 国产 麻豆 | 天天操天天操天天爽 | 亚洲春色综合另类校园电影 | 国产精品爽爽爽 | 欧美精品一区二区免费 | 99r精品视频在线观看 | 丁香婷婷综合激情五月色 | 91九色在线 | 91亚洲精品乱码久久久久久蜜桃 | 在线免费观看黄网站 | 欧美一区二区三区免费看 | 国产无套视频 | 欧美日韩在线视频观看 | 在线久热| 日本三级国产 | 成人午夜久久 | 黄色aaaaa| 狠狠躁18三区二区一区ai明星 | 韩日三级av | 91亚洲精品久久久蜜桃 | 日韩精品中文字幕在线不卡尤物 | 亚洲视频播放 | 久久亚洲在线 | 丁香花中文在线免费观看 | 欧美a性 | 国产一级h| 久久网站最新地址 | 亚洲涩涩色 | 亚洲精品视频网站在线观看 | 免费观看性生活大片3 | 久久色视频 | 麻豆手机在线 | 99精品视频播放 | 又黄又爽又刺激的视频 | 操操操人人人 | 一本到在线 | 婷婷www | 久久99久久99精品中文字幕 | 亚洲精品乱码白浆高清久久久久久 | 麻豆久久 | 久久97超碰 | 992tv在线| 深爱激情综合 | 麻豆影视在线免费观看 | 免费在线看成人av | 日韩视频中文字幕在线观看 | 欧美激情综合五月色丁香小说 | 4p变态网欧美系列 | 欧美一区二区三区特黄 | 免费网站黄色 | 成人午夜电影在线播放 | 在线中文字幕视频 | 欧美日韩高清国产 | 激情综合网婷婷 | 精品久久精品久久 | 欧美激情精品一区 | 国产精品九九热 | 最近中文字幕视频完整版 | 国产视频在线免费观看 | 麻豆国产在线播放 | 91大神在线观看视频 | 亚洲区精品视频 | 日本在线中文在线 | 日本高清中文字幕有码在线 | 午夜视频在线网站 | 天天做天天爱天天爽综合网 | 久久综合日 | 99在线精品视频观看 | 成人理论在线观看 | 国产精品24小时在线观看 | 亚洲黄色免费观看 | 欧美久久综合 | 日日夜夜精品免费 | 精品天堂av | 亚洲精品午夜视频 | 国产精品永久在线观看 | 91av视频网| 天天草天天干天天射 | 婷婷深爱五月 | 欧美一区日韩精品 | 最新av网站在线观看 | 久久久黄色免费网站 | 欧美日韩免费一区 | 丁香六月天| 高清精品久久 | 成人资源在线播放 | 亚洲va欧美va | 国产视频每日更新 | 永久免费毛片 | 天天干天天射天天爽 | 麻豆视传媒官网免费观看 | 国产亚洲精品久久久久久久久久久久 | 成 人 黄 色 免费播放 | 国产精品一区二区白浆 | 91精品黄色 | 久久久国产网站 | 日韩免费一级a毛片在线播放一级 | 亚洲欧洲中文日韩久久av乱码 | 五月婷婷视频在线 | 五月婷婷视频在线观看 | 免费午夜在线视频 | 国产精品18久久久久白浆 | www.夜夜爱 | 日韩精品最新在线观看 | 欧美a级在线免费观看 | 成人在线免费观看视视频 | 激情狠狠干 | 91亚洲国产成人久久精品网站 | 欧美日韩免费视频 | 欧美日韩高清一区二区三区 | 亚洲日本精品视频 | 久久久视屏| 91精品国产综合久久久久久久 | 国产美女在线免费观看 | 成人一区二区在线 | 久草在线最新 | 不卡的av在线 | 国产亚洲精品久 | 国产亚洲精品久久久久秋 | 五月婷婷六月丁香 | 久久国产精品99久久久久久进口 | 青春草免费视频 | 欧美激情综合五月 | 国产精品99视频 | 国产一级精品在线观看 | 天天搞天天干天天色 | 99热在线精品观看 | 国产高清不卡 | 日b视频国产| 国产成人免费精品 | 黄色的网站免费看 | 在线电影中文字幕 | 久久久久久草 | 最新av在线播放 | 91大神在线观看视频 | 国产精品不卡视频 | 丁香花中文在线免费观看 | 激情在线网址 | 欧美在线视频日韩 | 国产日韩欧美在线观看视频 | 亚洲精品自在在线观看 | 一区在线电影 | 国产99久久精品一区二区300 | 亚洲污视频 | 亚洲精品啊啊啊 | 欧美-第1页-屁屁影院 | 美女网站视频色 | 人人玩人人添人人澡超碰 | 亚洲成人av一区 | 欧美性做爰猛烈叫床潮 | 偷拍福利视频一区二区三区 | 日本亚洲国产 | 亚洲 欧美日韩 国产 中文 | 激情五月婷婷综合 | 日韩中文字幕国产精品 | 青青草国产精品视频 | 中文字幕在线观看免费高清完整版 | 国产精久久久久久久 | 精品国产伦一区二区三区观看说明 | 深爱综合网| 日韩理论电影在线 | 日日射av| 国产一区在线观看视频 | 日韩综合在线观看 | 在线看黄色的网站 | 天海翼一区二区三区免费 | 国产成人精品亚洲精品 | 在线观看亚洲成人 | 日韩在线电影观看 | 欧美黄色成人 | 91丨九色丨首页 | 日韩综合一区二区三区 | 久久美女免费视频 | 999毛片| 天天综合久久综合 | 午夜色性片 | 日本丰满少妇免费一区 | www.久久久com | 亚洲一区欧美激情 | 国产在线a不卡 | 亚洲国产mv | 日韩高清不卡在线 | 美腿丝袜一区二区三区 | 精品一区二三区 | 少妇视频在线播放 | avwww在线 | 狠狠干夜夜操 | 91精品国产亚洲 | 一区二区三区四区五区在线 | 91看片在线播放 | 亚洲爱爱视频 | 日本一区二区三区免费看 | 亚洲激情 在线 | 欧美国产高清 | 免费看的黄网站软件 | 成人va视频 | 国产三级午夜理伦三级 | 狠狠操天天操 | 在线免费观看视频你懂的 | 黄色一级大片在线观看 | 99中文字幕在线观看 | 天天干天天天天 | 成人国产精品av | 人人爽人人爽人人 | 久精品在线 | 日韩免费一级a毛片在线播放一级 | 97成人精品 | 91在线精品秘密一区二区 | 91麻豆免费看 | 成人app在线免费观看 | 久久成人欧美 | 亚洲精品国产高清 | av久久在线 | 亚洲高清不卡av | 亚洲经典中文字幕 | 日韩欧美在线播放 | 毛片永久免费 | 天天夜夜操 | 丝袜美腿亚洲综合 | 黄色av一区二区 | 欧美日韩国产精品一区二区亚洲 | 亚洲国产偷| 久草在线久草在线2 | 99精品在线免费 | 中文字幕在线看视频国产 | 国内精品久久久久影院日本资源 | 在线 国产 亚洲 欧美 | 久草国产精品 | 亚洲不卡在线 | www.久久久久| 国产亚洲一级高清 | 日韩激情网 | 天堂成人在线 | 欧美日韩精品电影 | 中文字幕 影院 | 国产福利在线免费 | 高清不卡一区二区三区 | 亚洲色图激情文学 | 欧日韩在线 | 精品国产免费观看 | 国产综合久久 | 欧美色伊人 | 婷婷久久久 | 国产成人在线综合 | 99视频精品 | 日韩在线第一 | 亚洲毛片久久 | 免费观看www视频 | 国产免费久久久久 | 国产一区二区不卡视频 | 日日噜噜噜噜夜夜爽亚洲精品 | 色综合久久悠悠 | 亚洲久草在线 | 亚洲精品国产综合久久 | 超碰精品在线观看 | 国产亚洲欧美精品久久久久久 | 美女视频黄免费网站 | 日韩精品一区二区在线观看视频 | 黄色国产在线 | 精品一区二区三区电影 | 久久综合一本 | 久草视频在线免费播放 | 国产精品精品国产婷婷这里av | 亚洲精品国产高清 | 亚洲国产日韩在线 | 国产精品综合在线 | 五月婷婷综合在线 | 夜色资源站wwwcom | 开心激情五月婷婷 | 天天天操天天天干 | 欧美夫妻性生活电影 | 亚洲免费永久精品国产 | 日韩视频免费看 | 亚洲尺码电影av久久 | 精品久久久久久国产偷窥 | 色在线亚洲 | 日本久久久精品视频 | 91欧美精品| 亚洲精品国偷自产在线99热 | 久久久久国产精品午夜一区 | 视频在线观看入口黄最新永久免费国产 | 国产一级精品在线观看 | 麻豆激情电影 | 天天操夜夜操天天射 | 丝袜美腿av | 国产精品国产自产拍高清av | 婷婷亚洲综合五月天小说 | 亚洲综合色视频在线观看 | 午夜电影久久久 | av免费看电影| 久久久久久高潮国产精品视 | 久久精品一 | 人人玩人人添人人澡超碰 | 99精品在线直播 | 久久成人综合 | 成人97人人超碰人人99 | 黄色网www | 国产精品99久久久久久武松影视 | 欧美日本国产在线观看 | 国产日韩精品欧美 | 国产美女久久 | 男女日麻批 | 国产成人精品综合久久久 | 久热只有精品 | 精品国产乱码久久 | 国产亚洲观看 | 成人免费在线网 | 国产黄色一级片在线 | 在线色亚洲 | 亚洲精品一区二区18漫画 | 99 久久久久 | 午夜成人免费电影 | 中文字幕在线不卡国产视频 | 成人精品视频久久久久 | 91网在线观看 | 亚洲清纯国产 | 色婷婷综合久久久中文字幕 | 伊人夜夜| 欧美日韩国产在线 | 91精品亚洲影视在线观看 | www.久久com| 在线观看的av| 一区二区三区在线免费观看视频 | 午夜精品中文字幕 | 日韩专区在线观看 | 久久综合网色—综合色88 | 香蕉久久久久久久 | 欧美va在线观看 | 成人三级网址 | 久草电影免费在线观看 | 中文字幕a在线 | 国产一级二级在线 | 97成人资源站 | 精品免费久久久久 | 又黄又爽的免费高潮视频 | 国产亚洲日本 | 日韩大片在线免费观看 | 91精选| 精品在线播放视频 | 不卡的av在线 | 91入口在线观看 | 久久不射网站 | 五月婷婷丁香 | 99 国产精品 | 亚洲国产中文字幕在线视频综合 | 亚洲天堂首页 | 在线 视频 一区二区 | 色综合久久久久综合体桃花网 | 不卡av电影在线观看 | 国产无吗一区二区三区在线欢 | 国产理论在线 | 亚洲精品一区二区在线观看 | 国产精品 日韩 欧美 | 69绿帽绿奴3pvideos | 草久中文字幕 | 玖玖精品视频 | 精品色综合 | 免费人成在线观看网站 | 国产在线播放观看 | 精品国产一区二区三区噜噜噜 | 亚洲精品午夜久久久久久久久久久 | 久久天天躁狠狠躁夜夜不卡公司 | 欧美一级片在线 | 国产区在线看 | 欧美老女人xx | 色狠狠操 | 日韩精品免费在线观看视频 | 日日操日日干 | 日韩电影久久 | 一区三区在线欧 | 亚洲免费色 | 天天操夜操视频 | 在线观看亚洲精品 | 国产一区福利在线 | 伊人色**天天综合婷婷 | 国产美女在线精品免费观看 | 91超国产| 国产一区福利在线 | 亚洲涩涩网站 | 久久综合九色 | 国产正在播放 | av大全在线看 | 欧美三人交 | 最新av网址大全 | 美国人与动物xxxx | 久久伊人精品天天 | av中文字幕日韩 | 在线观看亚洲成人 | 黄网站色成年免费观看 | av在线看网站 | 国产精品青草综合久久久久99 | 91精品视频免费看 | 丁香婷婷亚洲 | 视频一区在线免费观看 | 久久人网| 午夜精品久久久久久久爽 | 久久久精品免费看 | 亚洲热视频 | 国产午夜精品一区二区三区四区 | 国产精品成人av在线 | 日韩在线网 | 欧美日韩中文国产 | 96香蕉视频 | 日韩精品久久一区二区三区 | 色综合夜色一区 | 中文字幕亚洲五码 | 91日韩精品| 极品久久久 | 在线国产福利 | 日韩精品中文字幕有码 | 国产精品自产拍在线观看中文 | 91精品在线播放 | 久久久久久久久久久久久久av | 久久www免费人成看片高清 | 久久国产精品久久久久 | 超碰在线观看99 | 九九激情视频 | 国产123区在线观看 国产精品麻豆91 | 久久国产精品99久久久久久丝袜 | 亚洲欧美日韩一区二区三区在线观看 | 久色伊人 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 国色天香av | 精品国产免费看 | 黄色av观看| 国产在线91在线电影 | 日韩3区 | 成人黄大片 | 亚洲午夜久久久久久久久电影网 | 国产精品毛片完整版 | 中文字幕在线看片 | 国产福利一区二区三区在线观看 | 天天干人人插 | 久久综合狠狠综合久久狠狠色综合 | 91精彩视频 | 天天射综合网站 | 国产精品美女久久久久久免费 | 天天操天天操天天操天天操天天操 | 97精品久久 | 久久激情综合网 | 国内久久久久久 | 久久综合婷婷综合 | 婷婷视频在线 | 中文字幕久久精品一区 | 久久成人资源 | 91麻豆产精品久久久久久 | 91综合视频在线观看 | 99这里只有精品99 | 国产精品18久久久久久久久久久久 | 国产传媒一区在线 | 亚洲精品国产精品99久久 | av在线播放中文字幕 | 久久综合中文字幕 | av免费看电影 | 天天干天天弄 | 亚洲永久精品在线观看 | 国产淫片免费看 | 国内丰满少妇猛烈精品播 | 久久久久久国产精品亚洲78 | 国产在线黄 | 欧美一区二区在线看 | 91看片淫黄大片一级在线观看 | 久久综合射| 亚洲国产午夜 | 狠狠狠狠干 | 99在线免费观看视频 | 91专区在线观看 | 日韩欧美视频在线 | 成年一级片 | 欧美大荫蒂xxx| 99激情网 | 视频在线一区二区三区 | 在线观看一级片 | 99久久久国产免费 | 黄色网在线播放 | 日韩精品视频第一页 | 中文字幕免费国产精品 | 国产精成人品免费观看 | 国产一级视屏 | 91在线免费看片 | 中文字幕一区二区三区四区久久 | 亚洲高清av在线 | 在线 成人 | 欧美性性网 | 中文字幕免费一区 | 丁香六月网 | 亚洲国产精品99久久久久久久久 | 91大神免费在线观看 | 超碰人人草 | 天天干天天操天天操 | 亚洲 欧美变态 另类 综合 | 激情在线五月天 |