XZC.Log
BlogJava
首頁
新隨筆
聯(lián)系
聚合
管理
隨筆-314 評論-209 文章-0 trackbacks-0
Maven入門--概念與實(shí)例
最近由于工作原因在研究、應(yīng)用Maven,有了一些體會就寫成了此文。本文雖然是Maven2的入門文章,但并不涉及Maven的歷史、下載與安裝,這些內(nèi)容可以到Maven的官方網(wǎng)站上了解。本文主要是關(guān)注Maven中的重要概念,并以一個實(shí)例來闡述使用Maven的基本方法。
文末有例子代碼下載的鏈接
。(2006.10.29最后更新)
1 關(guān)鍵名詞
Project
:任何您想build的事物,Maven都可以認(rèn)為它們是工程。這些工程被定義為工程對象模型(POM,Poject Object Model)。一個工程可以依賴其它的工程;一個工程也可以由多個子工程構(gòu)成。
POM
:POM(pom.xml)是Maven的核心文件,它是指示Maven如何工作的元數(shù)據(jù)文件,類似于Ant中的build.xml文件。POM文件位于每個工程的根目錄中。
GroupId
:groupId是一個工程的在全局中唯一的標(biāo)識符,一般地,它就是工程名。groupId有利于使用一個完全的包名,將一個工程從其它有類似名稱的工程里區(qū)別出來。
Artifact
:artifact是工程將要產(chǎn)生或需要使用的文件,它可以是jar文件,源文件,二進(jìn)制文件,war文件,甚至是pom文件。每個artifact都由groupId和artifactId組合的標(biāo)識符唯一識別。需要被使用(依賴)的artifact都要放在倉庫(見Repository)中,否則Maven無法找到(識別)它們。
Dependency
:為了能夠build或運(yùn)行,一個典型的Java工程會依賴其它的包。在Maven中,這些被依賴的包就被稱為dependency。dependency一般是其它工程的artifact。
Plug-in
:Maven是由插件組織的,它的每一個功能都是由插件提供的。插件提供goal(類似于Ant中的target),并根據(jù)在POM中找到的元數(shù)據(jù)去完成工作。主要的Maven插件要是由Java寫成的,但它也支持用Beanshell或Ant腳本寫成的插件。
Repository
:倉庫用于存放artifact,它可以是本地倉庫,也可以是遠(yuǎn)程倉庫。Maven有一個默認(rèn)的遠(yuǎn)程倉庫--central,可以從
http://www.ibiblio.org/maven2/
下載其中的artifact。在Windows平臺上,本地倉庫的默認(rèn)地址是
User_Home
\.m2\repository
。
Snapshot
:工程中可以(也應(yīng)該)有一個特殊版本,它的版本號包括
SNAPSHOT
字樣。該版本可以告訴Maven,該工程正處于開發(fā)階段,會經(jīng)常更新(但還未發(fā)布)。當(dāng)其它工程使用此類型版本的artifact時,Maven會在倉庫中尋找該artifact的最新版本,并自動下載、使用該最新版。
2 Maven Build Life Cycle
軟件項(xiàng)目一般都有相似的開發(fā)過程:準(zhǔn)備,編譯,測試,打包和部署,Maven將上述過程稱為Build Life Cycle。在Maven中,這些生命周期由一系列的短語組成,每個短語對應(yīng)著一個(或多個)操作;或?qū)?yīng)著一個(或多個)goal(類似于Ant中的target)。
如編譯源文件的命令
mvn compile
中的compile是一個生命周期短語。同時該命令也可以等價于
mvn compiler:compile
,其中的compiler是一個插件,它提供了compile(
此compile與mvn compile中的compile意義不同
)goal;compiler還可提供另一個goal--testCompile,該goal用于編譯junit測試類。
在執(zhí)行某一個生命周期時,Maven會首先執(zhí)行該生命周期之前的其它周期。如要執(zhí)行compile,那么將首先執(zhí)行validate,generate-source,process-source和generate-resources,最后再執(zhí)行compile本身。
關(guān)于Maven中默認(rèn)的生命周期短語,請見參考資源[6]中的附錄B.3
。
3 標(biāo)準(zhǔn)目錄布局
Maven為工程中的源文件,資源文件,配置文件,生成的輸出和文檔都制定了一個標(biāo)準(zhǔn)的目錄結(jié)構(gòu)。Maven鼓勵使用標(biāo)準(zhǔn)目錄布局,這樣就不需要進(jìn)行額外的配置,而且有助于各個不同工程之間的聯(lián)接。當(dāng)然,Maven也允許定制個性的目錄布局,這就需要進(jìn)行更多的配置。
關(guān)于Maven的標(biāo)準(zhǔn)目錄布局,請見參考資源[6]中的附錄B.1
。
4 Maven的優(yōu)點(diǎn)
[1]build邏輯可以被重用。在Ant中可能需要多次重復(fù)地寫相同的語句,但由于POM的繼承性,可以復(fù)用其它的POM文件中的語句。這樣既可以寫出清晰的build語句,又可以構(gòu)造出層次關(guān)系良好的build工程。
[2]不必關(guān)注build工作的實(shí)現(xiàn)細(xì)節(jié)。我們只需要使用一些build生命周期短語就可以達(dá)到我們的目標(biāo),而不必管Maven是如何做到這些的。如,只需要告訴Maven要安裝(install),那么它自然就會驗(yàn)證,編譯,打包,及安裝。
[3]Maven會遞歸加載工程依賴的artifact所依賴的其它artifact,而不用顯示的將這些artifact全部寫到dependency中。
[4]如果完全使用Maven的標(biāo)準(zhǔn)目錄布局,那么可以極大地減少配置細(xì)節(jié)。
5 實(shí)例
5.1 構(gòu)想
由于只是闡述Maven的基本使用方法,所以本文將要設(shè)計的實(shí)例,只是一個簡單的Maven demo。該實(shí)例包含兩個工程:普通應(yīng)用程序工程(app)和Web應(yīng)用工程(webapp)。app工程提供一個簡單的Java類;webapp工程只包含一個Servlet,并將使用app中的Java類。
該Demo的目標(biāo)是能夠正確地將webapp制成war包,以供部署時使用。要能夠正確制作war,自然首先就必須要能夠正確的編譯源代碼,且要將App模塊制成jar包。本文創(chuàng)建的工程所在的目錄是
D:\maven\demo
。
5.2 App工程
可以使用Maven的archetype插件來創(chuàng)建新工程,命令如下:
D:\maven\demo>mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=app
該工程的groupId是ce.demo.mvn,那么該工程的源文件將放在Java包c(diǎn)e.demo.mvn中。artifactId是app,那么該工程根目錄的名稱將為app。
當(dāng)?shù)谝淮螆?zhí)行該命令時,Maven會從central倉庫中下載一些文件。這些文件包含插件archetype,以及它所依賴的其它包。該命令執(zhí)行完畢后,在目錄D:\maven\demo下會出現(xiàn)如下目錄布局:
app
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- ce
| `-- demo
| `-- mvn
| `-- App.java
`-- test
`-- java
`-- ce
`-- demo
`-- mvn
`-- AppTest.java
因本文暫時不涉及JUnit測試,故請將目錄
app\src\test
目錄刪除(不刪除也沒關(guān)系 ^_^)。然后再修改App.java文件,其完全內(nèi)容如下:
package
ce.demo.mvn;
public
class
App
{
public
String getStr(String str)
{
return
str;
}
}
其實(shí),如果我們能夠清楚地知道Maven的標(biāo)準(zhǔn)目錄布局,就可以不使用archetype插件來創(chuàng)建工程原型;如果我們要定制個性的目錄布局,那么就更沒有必要使用archetype插件了。
5.3 WebApp工程
我們?nèi)匀蝗鐒?chuàng)建app工程一樣使用archetype插件來創(chuàng)建webapp工程,命令如下:
D:\maven\demo>mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=webapp -DarchetypeArtifactId=maven-archetype-webapp
第一次運(yùn)行此命令時,也會從central倉庫中下載一些與Web應(yīng)用相關(guān)的artifact(如javax.servlet)。此命令與創(chuàng)建app的命令的不同之處是,多設(shè)置了一個屬性archetypeArtifacttId,該屬性的值為maven-archetype-webapp。即告訴Maven,將要創(chuàng)建的工程是一個Web應(yīng)用工程。創(chuàng)建app工程時沒有使用該屬性值,是由于archetype默認(rèn)創(chuàng)建的是應(yīng)用程序工程。同樣的,執(zhí)行完該命令之后,會出現(xiàn)如下標(biāo)準(zhǔn)目錄布局:
webapp
|-- pom.xml
`-- src
`-- main
`-- webapp
|
-- index.jsp
|-- WEB-INF
`-- web.xml
根據(jù)5.1節(jié)的構(gòu)想,webapp工程將只包含一個Servlet,所以我們不需要index.jsp文件,請將其刪除。此時大家可以發(fā)現(xiàn),目前的目錄布局中并沒有放Servlet,即Java源文件的地方。根據(jù)參考資源[6]中的附錄B.1,以及app工程中Java源文件的布局,可以知道Servlet(它仍然是一個Java類文件)仍然是放在
webapp\src\main\java
目錄中,請新建該目錄。此處的Servlet是一個簡單HelloServlet,其完整代碼如下:
package
hello;
import
java.io.IOException;
import
java.io.PrintWriter;
import
javax.servlet.ServletException;
import
javax.servlet.http.HttpServlet;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
ce.demo.mvn.App;
//
引用app工程中的App類
public
class
HelloServlet
extends
HttpServlet
{
private
static
final
long
serialVersionUID
=
-
3696470690560528247L
;
public
void
doGet(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException
{
App app
=
new
App();
String str
=
app.getStr(
"
CE Maven Demo
"
);
PrintWriter out
=
response.getWriter();
out.print(
"
<html><body>
"
);
out.print(
"
<h1>
"
+
str);
out.print(
"
</body></html>
"
);
}
}
5.4 POM文件
大家可以發(fā)現(xiàn),在前面新建工程時,我們并沒有提到各個工程中的pom.xml文件。現(xiàn)在將要討論這個問題。我們先看看app工程中的POM文件,其完整內(nèi)容如下:
<
project
>
<
modelVersion
>
4.0.0
</
modelVersion
>
<
groupId
>
ce.demo.mvn
</
groupId
>
<
artifactId
>
app
</
artifactId
>
<
packaging
>
jar
</
packaging
>
<
version
>
1.0
</
version
>
<
name
>
CE Maven Demo -- App
</
name
>
</
project
>
大家可以發(fā)現(xiàn)此我帖出來的內(nèi)容與實(shí)際由archetype插件生成的POM文件的內(nèi)容有些不同,但基本上是一致的。只是為了使文件中的語句更清晰,此處刪除了一些冗余的內(nèi)容,并修改了該工程的version和name的值,以與此例子的背景來符合。在目前情況下modelVersion值將被固定為4.0.0,這也是Maven2唯一能夠識別的model版本。groupId,artifactId的值與創(chuàng)建工程時使用的命令中的相關(guān)屬性值是一致的。packaging的值由工程的類型決定,如應(yīng)用程序工程的packaging值為jar,Web應(yīng)用工程的packaging值為war。上述情況也可以從webapp的POM文件中看出,下面將看看這個pom的完整內(nèi)容。
<
project
>
<
modelVersion
>
4.0.0
</
modelVersion
>
<
groupId
>
ce.demo.mvn
</
groupId
>
<
artifactId
>
webapp
</
artifactId
>
<
packaging
>
war
</
packaging
>
<
version
>
1.0
</
version
>
<
name
>
CE Maven Demo -- WebApp
</
name
>
<
dependencies
>
<
dependency
>
<
groupId
>
ce.demo.mvn
</
groupId
>
<
artifactId
>
app
</
artifactId
>
<
version
>
1.0
</
version
>
</
dependency
>
<
dependency
>
<
groupId
>
javax.servlet
</
groupId
>
<
artifactId
>
servlet-api
</
artifactId
>
<
version
>
2.4
</
version
>
<
scope
>
provided
</
scope
>
</
dependency
>
</
dependencies
>
</
project
>
比較app與webapp中的POM,除前面已經(jīng)提過的packaging的差別外,我們還可以發(fā)現(xiàn)webapp中的POM多了dependencies項(xiàng)。由于webapp需要用到app工程中的類(見HelloServlet源代碼),它還需要javax.servlet包(因?yàn)樵摪⒉荒J(rèn)存在于jsdk中)。故,我們必須要將它們聲明到依賴關(guān)系中。
5.5 執(zhí)行
上述兩個工程創(chuàng)建完畢后,就需要執(zhí)行一些命令來看看會有什么結(jié)果出現(xiàn)。我們首先進(jìn)入app目錄,并執(zhí)行命令
mvn compile
,然后會在該目錄下發(fā)現(xiàn)新生成的目錄target\classes,即編譯后的class文件(包括它的包目錄)就放在了這里。再執(zhí)行命令mvn package,在目錄target中就會生成app-1.0.jar文件。該文件的全名由如下形式確定:
artifactId-version.packaging
。根據(jù)第2章的敘述可以知道,執(zhí)行命令
mvn package
時,將首先將產(chǎn)生執(zhí)行命令
mvn compile
之后的結(jié)果,故如果要打包,那么只需要執(zhí)行
mvn package
即可。
在app工程中執(zhí)行完之后,就需要進(jìn)入webapp工程了。進(jìn)入webapp目錄,此次將只執(zhí)行
mvn package
命令(隱示地執(zhí)行了compile過程)。此次命令的執(zhí)行并不成功,會出現(xiàn)如下問題:
D:\maven\demo\webapp>mvn package
……
Downloading: http://repo1.maven.org/maven2/ce/demo/mvn/app/
1.0
/app-
1.0
.pom
[
INFO
]
------------------------------------------------------------------------
[
ERROR
]
BUILD ERROR
[
INFO
]
------------------------------------------------------------------------
[
INFO
]
Error building POM (may not be this project's POM).
Project ID: ce.demo.mvn:app
Reason: Error getting POM for 'ce.demo.mvn:app' from the repository: Error transferring file
ce.demo.mvn:app:pom:
1.0
from the specified remote repositories:
central (http://repo1.maven.org/maven2)
……
由粗體內(nèi)容可知,Maven正試圖從central倉庫下載app工程的artifact,但central倉庫肯定不會有這個artifact,其結(jié)果只能是執(zhí)行失敗!由第1章artifact名詞的解釋可知,被依賴的artifact必須存在于倉庫(遠(yuǎn)程或本地)中,但目前webapp所依賴的app必不存在于倉庫中,所以執(zhí)行只能失敗。
解決這個問題有兩種方法:[1]將app-1.0.jar安裝到倉庫中,使它成為一個artifact;[2]構(gòu)建一個更高層次的工程,使app和webapp成為這個工程的子工程,然后從這個更高層次工程中執(zhí)行命令。
第一種方法比較簡單(
見
http://www.tkk7.com/jiangshachina/admin/EditPosts.aspx
中的第一個主題
),此處將詳細(xì)討論第2種方法(見5.6節(jié))。
5.6 更高層次工程
我們可以將app和webapp的上一級目錄demo作為這兩個工程的
一個
更高層次工程,即使用app和webapp成為這個工程的子工程。為了使demo目錄成為一個demo工程,只需要在這個目錄下添加一個pom.xml文件,該文件內(nèi)容如下:
<
project
>
<
modelVersion
>
4.0.0
</
modelVersion
>
<
groupId
>
ce.demo
</
groupId
>
<
artifactId
>
mvn-demo
</
artifactId
>
<
packaging
>
pom
</
packaging
>
<
version
>
1.0
</
version
>
<
name
>
CE Maven Demo
</
name
>
<
modules
>
<
module
>
app
</
module
>
<
module
>
webapp
</
module
>
</
modules
>
</
project
>
與app和webapp中的POM相比,demo的POM使用了modules項(xiàng),modules用于聲明本工程的子工程,module中的值對應(yīng)于子工程的artifact名。而且該P(yáng)OM的packaging類型必須為pom。
有了demo工程后,我們只需要在demo目錄下執(zhí)行相關(guān)命令就可以了。通過如下命令即可驗(yàn)證:
[1]
mvn clean
– 消除工程(包括所有子工程)中產(chǎn)生的所有輸出。這本文的實(shí)例中,實(shí)際上是刪除target目錄。由于之前的操作只有app工程產(chǎn)生了target目錄,而webapp并沒有,所以將只會刪除app工程中的target目錄。
[2]
mvn package
– 將工程制作成相應(yīng)的包,app工程是作成jar包(app-1.0.jar),webapp工程是作成war包(webapp-1.0.war)。打開webapp-1.0.war包,可以發(fā)現(xiàn)app-1.0.jar被放到了WEB-INF的lib目錄中。
6 小結(jié)
通過以上的敘述與實(shí)例,應(yīng)該可以對Maven有一個粗略的認(rèn)識了。使用Maven關(guān)鍵是要弄清楚如何寫pom.xml文件,就如同使用Ant要會寫build.xml文件一樣。在POM中可以直接寫入Ant的task腳本,也可以調(diào)用Ant的build.xml文件(推薦),所以Maven也可以完成Ant的絕大多數(shù)工作(但不必安裝Ant)。注意:
使用Maven就不要再過多的使用Ant腳本
。
利用好Maven的繼承特性及子工程的關(guān)系,可以很好地簡化POM文件,并能夠構(gòu)建層次結(jié)構(gòu)良好的工程,有利于工程的維護(hù)。
7 參考資源
[1]Maven官方網(wǎng)站. http://maven.apache.org
[2]Maven POM文件參考結(jié)構(gòu). http://maven.apache.org/ref/current/maven-model/maven.html
[3]Super POM. http://maven.apache.org/guides/introduction/introduction-to-the-pom.html
[4]Maven主要插件的列表. http://maven.apache.org/plugins
[5]Maven基本使用指南. http://maven.apache.org/guides/index.html
[6]Better Build with Maven. http://www.mergere.com/m2book_download.jsp -- 強(qiáng)烈推薦
[7]介紹Maven2. http://www.javaworld.com/javaworld/jw-12-2005 /jw-1205-maven_p.html
[8]揭秘Maven2 POM. http://www.javaworld.com/javaworld/jw-05-2006/jw-0529-maven.html
[9]Maven讓事情變得簡單. http://www-128.ibm.com/developerworks/cn/java/j-maven
[10]Maven文檔集. http://docs.codehaus.org/display/MAVENUSER/Home
[11]有效利用Maven2的站點(diǎn)生成功能. http://www.matrix.org.cn/resource/article/44/44491_Maven2.html
文中例子程序下載:
http://www.tkk7.com/files/jiangshachina/maven.rar
posted on 2006-10-29 16:29
xzc
閱讀(1258)
評論(0)
編輯
收藏
所屬分類:
Maven
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發(fā)表評論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關(guān)文章:
maven2 學(xué)習(xí) - maven 命令
創(chuàng)建簡單的maven archetype
Maven入門--概念與實(shí)例
ant的一些偏門技巧
<
2006年10月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(12)
給我留言
查看公開留言
查看私人留言
隨筆分類
BPM(1)
Design(5)
Eclipse(2)
hadoop(34)
Hibernate(1)
Java(55)
linux/unix(70)
Log4j(5)
Maven(4)
mysql(4)
Oracle(73)
Other(10)
python(3)
Spring(12)
Struts(1)
SybaseIQ(3)
TDD(2)
UML(2)
Web(12)
Xdoclet(8)
XML(17)
隨筆檔案
2018年11月 (3)
2018年9月 (1)
2018年5月 (1)
2018年3月 (2)
2017年10月 (3)
2017年9月 (4)
2017年8月 (3)
2017年7月 (3)
2017年5月 (4)
2017年4月 (6)
2016年9月 (2)
2016年4月 (1)
2016年3月 (3)
2016年2月 (2)
2015年12月 (7)
2015年11月 (7)
2015年10月 (4)
2015年9月 (10)
2015年8月 (1)
2015年7月 (1)
2015年6月 (1)
2015年4月 (1)
2015年2月 (3)
2015年1月 (5)
2014年12月 (3)
2014年9月 (2)
2013年10月 (1)
2013年2月 (1)
2012年8月 (2)
2012年7月 (1)
2012年6月 (1)
2012年3月 (3)
2011年12月 (2)
2011年11月 (1)
2011年10月 (1)
2011年9月 (2)
2011年8月 (4)
2011年7月 (6)
2011年6月 (4)
2011年5月 (2)
2011年4月 (4)
2011年3月 (8)
2011年1月 (3)
2010年12月 (9)
2010年11月 (3)
2010年10月 (1)
2010年9月 (5)
2010年8月 (6)
2010年7月 (6)
2010年6月 (2)
2010年4月 (7)
2010年3月 (9)
2010年2月 (1)
2010年1月 (2)
2009年12月 (3)
2009年10月 (1)
2009年9月 (3)
2009年8月 (5)
2009年6月 (4)
2009年1月 (1)
2008年11月 (7)
2008年10月 (2)
2008年9月 (1)
2008年6月 (7)
2008年5月 (7)
2007年12月 (1)
2007年11月 (4)
2007年10月 (3)
2007年9月 (3)
2007年7月 (1)
2007年6月 (2)
2007年3月 (1)
2007年2月 (1)
2006年12月 (5)
2006年11月 (23)
2006年10月 (18)
2006年9月 (16)
2006年8月 (11)
2006年6月 (3)
2006年4月 (1)
收藏夾
xzc(12)
搜索
最新評論
1.?re: Hive中reduce個數(shù)設(shè)定
評論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
--xzc
2.?re: shell時間處理、加減、以及時間差
評論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
--xzc
3.?re: Shell字符串比較相等、不相等方法小結(jié)
評論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
--xzc
4.?re: shell判斷文件是否存在
評論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
--xzc
5.?re: curl模擬http發(fā)送get或post接口測試
評論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
--xzc
閱讀排行榜
1.?web.xml中l(wèi)oad-on-startup的作用(149963)
2.?Oracle中start with...connect by子句的用法 (49754)
3.?數(shù)據(jù)庫設(shè)計準(zhǔn)則(第一、第二、第三范式說明)(44881)
4.?Oracle閃回查詢恢復(fù)delete刪除數(shù)據(jù)(27810)
5.?shell 判斷字符串是否存在包含關(guān)系(26445)
評論排行榜
1.?web.xml中l(wèi)oad-on-startup的作用(22)
2.?數(shù)據(jù)庫設(shè)計準(zhǔn)則(第一、第二、第三范式說明)(17)
3.?rowid 刪除重復(fù)記錄!!! (8)
4.?oracle日期處理完全版(8)
5.?Oracle SQL 內(nèi)置函數(shù)大全(6)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 xzc
主站蜘蛛池模板:
国产亚洲一区二区三区在线不卡
|
久久亚洲AV无码西西人体
|
亚洲国产成人高清在线观看
|
亚洲精品美女久久久久9999
|
美女黄色免费网站
|
亚州免费一级毛片
|
无码欧精品亚洲日韩一区夜夜嗨
|
亚洲国产一区在线
|
美女羞羞喷液视频免费
|
国产精品麻豆免费版
|
亚洲AV一二三区成人影片
|
日韩av无码久久精品免费
|
午夜国产羞羞视频免费网站
|
亚洲福利视频一区二区三区
|
国产电影午夜成年免费视频
|
亚洲无线码在线一区观看
|
亚洲欧美精品午睡沙发
|
精品国产污污免费网站aⅴ
|
91午夜精品亚洲一区二区三区
|
日韩电影免费在线观看网站
|
亚洲AV永久无码精品一区二区国产
|
亚洲乱码无限2021芒果
|
女人18毛片水最多免费观看
|
亚洲视频一区在线
|
中文字幕无码日韩专区免费
|
亚洲AV无码久久精品蜜桃
|
yy一级毛片免费视频
|
国产免费人视频在线观看免费
|
日韩在线观看免费
|
国产男女猛烈无遮挡免费网站
|
全部一级一级毛片免费看
|
国产精品免费视频网站
|
国产免费内射又粗又爽密桃视频
|
免费一级毛片不卡在线播放
|
亚洲AV无码精品国产成人
|
最近中文字幕mv免费高清电影
|
校园亚洲春色另类小说合集
|
久久精品无码一区二区三区免费
|
最近中文字幕免费mv视频7
|
日本激情猛烈在线看免费观看
|
亚洲欧洲日产国码无码久久99
|