前面我們講到為什么使用Maven, Maven的安裝, 與IDE的集成, 建立Nexus本地倉(cāng)庫(kù), 這些都是在我們?cè)谡絼?chuàng)建項(xiàng)目的前的準(zhǔn)備工作. 從這一章開(kāi)始我們介紹利用Maven來(lái)創(chuàng)建, 管理我們的項(xiàng)目.
這里假設(shè)你已經(jīng)閱讀了我前面的幾篇文章, 或者你已經(jīng)安裝了Maven, 配置好了IDE集成環(huán)境. 項(xiàng)目的創(chuàng)建大致分為兩種, 一種是通過(guò)Maven的命令行來(lái)操作, 另一種是通過(guò)IDE界面環(huán)境來(lái)創(chuàng)建, 下面我們分別來(lái)介紹:
通過(guò)Maven命令行來(lái)創(chuàng)建項(xiàng)目
Maven項(xiàng)目的創(chuàng)建是通過(guò)插件archetype(原型)來(lái)創(chuàng)建的, 也有人翻譯成骨架, 你可以理解為Template. 通過(guò)archetype可以選擇創(chuàng)建最基本的項(xiàng)目模型, 也可以通過(guò)預(yù)置模板來(lái)創(chuàng)建項(xiàng)目, archetype預(yù)置了很多項(xiàng)目模板, 比如Spring項(xiàng)目模板, EJB項(xiàng)目模板等. 下面我們分別來(lái)介紹:
創(chuàng)建基本項(xiàng)目
假如我們要生成一個(gè)名稱為ftpserver項(xiàng)目,在命令行提示符下執(zhí)行以下命令:
mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.alibaba.base
-DartifactId=ftpserver
第一個(gè)參數(shù)-DarchetypeGroupId 是制定archetype插件的所屬的groupId
第二個(gè)參數(shù)-DgroupId是制定你將要?jiǎng)?chuàng)建的項(xiàng)目的groupId, 根據(jù)自己項(xiàng)目情況做相應(yīng)的修改
第三個(gè)參數(shù)-DartifactId是制定你要?jiǎng)?chuàng)建的構(gòu)件ID, 這個(gè)例子是 ftpserver
執(zhí)行后類似的顯示如下:
下面我們看一下生成的POM.xml文件:
<project xmlns=" xmlns:xsi=" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 <modelVersion>4.0.0</modelVersion> <groupId>com.alibaba.base</groupId> <artifactId>ftpserver</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>ftpserver</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project> 這里介紹下一些主要標(biāo)簽的作用: modelVersion 制定POM文件所使用的模板版本, 雖然POM文件版本是不經(jīng)常更新的,但是強(qiáng)制指定版本可以保持整個(gè)項(xiàng)目的一致性和穩(wěn)定性. 下面我們看一下生成的項(xiàng)目目錄樹(shù): ftpserver |-- pom.xml `-- src |-- main | `-- java | `-- com | `-- alibaba | `-- ftpserver | `-- App.java `-- test `-- java `-- com `-- alibaba `-- ftpserver `-- AppTest.java 創(chuàng)建模板項(xiàng)目 mvn archetype:generate 在命令行下回車以后我們可以看到以下提示: …… Choose archetype: 1: internal -> appfuse-basic-jsf (AppFuse archetype for creating a web applicati on with Hibernate, Spring and JSF) 2: internal -> appfuse-basic-spring (AppFuse archetype for creating a web applic ation with Hibernate, Spring and Spring MVC) 3: internal -> appfuse-basic-struts (AppFuse archetype for creating a web applic ation with Hibernate, Spring and Struts 2) 4: internal -> appfuse-basic-tapestry (AppFuse archetype for creating a web appl ication with Hibernate, Spring and Tapestry 4) 5: internal -> appfuse-core (AppFuse archetype for creating a jar application wi th Hibernate and Spring and XFire) 6: internal -> appfuse-modular-jsf (AppFuse archetype for creating a modular app lication with Hibernate, Spring and JSF) 7: internal -> appfuse-modular-spring (AppFuse archetype for creating a modular application with Hibernate, Spring and Spring MVC) 8: internal -> appfuse-modular-struts (AppFuse archetype for creating a modular application with Hibernate, Spring and Struts 2) 9: internal -> appfuse-modular-tapestry (AppFuse archetype for creating a modula r application with Hibernate, Spring and Tapestry 4) 10: internal -> maven-archetype-j2ee-simple (A simple J2EE Java application) 11: internal -> maven-archetype-marmalade-mojo (A Maven plugin development proje ct using marmalade) 12: internal -> maven-archetype-mojo (A Maven Java plugin development project) 13: internal -> maven-archetype-portlet (A simple portlet application) 14: internal -> maven-archetype-profiles () 15: internal -> maven-archetype-quickstart () 16: internal -> maven-archetype-site-simple (A simple site generation project) 17: internal -> maven-archetype-site (A more complex site project) 18: internal -> maven-archetype-webapp (A simple Java web application) 19: internal -> jini-service-archetype (Archetype for Jini service project creat ion) 20: internal -> softeu-archetype-seam (JSF+Facelets+Seam Archetype) 21: internal -> softeu-archetype-seam-simple (JSF+Facelets+Seam (no persistence) Archetype) 22: internal -> softeu-archetype-jsf (JSF+Facelets Archetype) 23: internal -> jpa-maven-archetype (JPA application) 24: internal -> spring-osgi-bundle-archetype (Spring-OSGi archetype) 25: internal -> confluence-plugin-archetype (Atlassian Confluence plugin archety pe) 26: internal -> jira-plugin-archetype (Atlassian JIRA plugin archetype) 27: internal -> maven-archetype-har (Hibernate Archive) 28: internal -> maven-archetype-sar (JBoss Service Archive) 29: internal -> wicket-archetype-quickstart (A simple Apache Wicket project) 30: internal -> scala-archetype-simple (A simple scala project) 31: internal -> lift-archetype-blank (A blank/empty liftweb project) 32: internal -> lift-archetype-basic (The basic (liftweb) project) 33: internal -> cocoon-22-archetype-block-plain ([http://cocoon.apache.org/2.2/m aven-plugins/]) 34: internal -> cocoon-22-archetype-block ([http://cocoon.apache.org/2.2/maven-p lugins/]) 35: internal -> cocoon-22-archetype-webapp ([http://cocoon.apache.org/2.2/maven- plugins/]) 36: internal -> myfaces-archetype-helloworld (A simple archetype using MyFaces) 37: internal -> myfaces-archetype-helloworld-facelets (A simple archetype using MyFaces and facelets) 38: internal -> myfaces-archetype-trinidad (A simple archetype using Myfaces and Trinidad) 39: internal -> myfaces-archetype-jsfcomponents (A simple archetype for create c ustom JSF components using MyFaces) 40: internal -> gmaven-archetype-basic (Groovy basic archetype) 41: internal -> gmaven-archetype-mojo (Groovy mojo archetype) Choose a number: (1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/2 4/25/26/27/28/29/30/31/32/33/34/35/36/37/38/39/40/41) 15: : 我們可以看到有很多預(yù)定義好的模板項(xiàng)目, 這里我們要?jiǎng)?chuàng)建一個(gè)spring的項(xiàng)目, 選擇2然后回車, 會(huì)出現(xiàn)以下提示: [INFO] artifact org.appfuse.archetypes:appfuse-basic-spring: checking for update s from nexus [INFO] artifact org.appfuse.archetypes:appfuse-basic-spring: checking for update s from central Define value for version: 1.0-SNAPSHOT: : 細(xì)心的讀者可能會(huì)注意到Maven會(huì)從nexus本地倉(cāng)庫(kù)獲取插件的更新,前提是要建立起自己的本地倉(cāng)庫(kù), 之前的文章中我們已經(jīng)講過(guò)如何建立nexus本地倉(cāng)庫(kù). 粗體部分是給的提示說(shuō)你的項(xiàng)目的起始版本, 它給出一個(gè)默認(rèn)值1.0-SNAPSHOT, 通常如果沒(méi)有特殊需求,我們可以根據(jù)默認(rèn)規(guī)則回車確認(rèn)就可以了, 你也可以輸入自定義的版本,但并不推薦這么做.回車后會(huì)看到以下提示: Define value for version: 1.0-SNAPSHOT: : Confirm properties configuration: groupId: com.alibaba.base artifactId: ftpserver version: 1.0-SNAPSHOT package: com.alibaba.base Y: : Maven會(huì)給出項(xiàng)目的相關(guān)信息讓你確認(rèn), 如果沒(méi)有錯(cuò)誤,直接回車確認(rèn)即可, 然后你就可以看到Maven在努力的刷屏幫你建立起一個(gè)spring項(xiàng)目, 在最后如果你可以看到類似的信息,那說(shuō)明項(xiàng)目已經(jīng)創(chuàng)建成功: [INFO] OldArchetype created in dir: D:\work\projects\test\ftpserver [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 69 minutes 48 seconds [INFO] Finished at: Fri Jun 26 11:45:52 CST 2009 [INFO] Final Memory: 9M/127M [INFO] ------------------------------------------------------------------------ 粗體部分提示, 項(xiàng)目成功構(gòu)建. 然后我們來(lái)看看,這次的POM文件與上次有什么不同, Maven生成了一個(gè)700行左右的POM文件, 里面幾乎包含了一個(gè)項(xiàng)目所應(yīng)該有的一切, 構(gòu)建, 自動(dòng)單元測(cè)試, 構(gòu)件依賴, 報(bào)表(站點(diǎn)), 數(shù)據(jù)庫(kù)連接, SCM, 等等, 我們可以根據(jù)實(shí)際需要來(lái)選擇我們所需要的項(xiàng)目周期管理, 由于代碼太多這里就不貼出來(lái)了. 在后面的POM文件詳解里面, 我會(huì)介紹一下POM文件一些常用的標(biāo)簽以及如何使用. 下面我們?cè)倏匆幌履夸浗Y(jié)構(gòu)有什么不同: ftpserver |-- pom.xml `-- src |-- main | `-- java | `-- com | `-- alibaba | `-- ftpserver | `-- App.java | -- resources | -- webapp |-- site `-- test | `-- java | `-- com | `-- alibaba | `-- ftpserver | `-- AppTest.java | -- resources 我們可以看到, 多了粗體部分site是Maven為項(xiàng)目生成站點(diǎn), 所有的報(bào)表都將生成在這個(gè)站點(diǎn)里面, 在resources目錄里還會(huì)有很多資源文件, 比如多語(yǔ)言的資源文件等. 這是根據(jù)默認(rèn)規(guī)則建立的項(xiàng)目目錄結(jié)構(gòu),當(dāng)然你可以自定義目錄結(jié)構(gòu),但是我們推薦在將來(lái)的項(xiàng)目中使用maven的默認(rèn)規(guī)則. 關(guān)于Maven的生命周期管理, 我們會(huì)在后面章節(jié)討論. 通過(guò)IDE(IDEA)來(lái)創(chuàng)建項(xiàng)目 mvn idea:idea mvn eclipse:eclipse 之后只需要運(yùn)行對(duì)應(yīng)的工程文件就可以在IDE里面進(jìn)行后續(xù)的開(kāi)發(fā)工作了. 如果你不喜歡使用命令行, 那么你也可以在IDE里面通過(guò)圖形化的界面來(lái)創(chuàng)建項(xiàng)目,, IDEA內(nèi)部集成了對(duì)Maven的支持, 如果使用eclipse的話你還需要下載m2e插件. 下面我們以IDEA為例來(lái)創(chuàng)建之前例子中的項(xiàng)目: File->new project, 然后選擇第一項(xiàng) Create project from scratch, 點(diǎn)擊下一步可以看到: 本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/arvinzhuo/archive/2009/06/26/4301280.aspx
groupId 這個(gè)標(biāo)簽用來(lái)指定這個(gè)項(xiàng)目所屬的公司或者組織, 在這個(gè)例子里, groupId為com.alibaba.base, 表示這個(gè)構(gòu)件是屬于alibaba基礎(chǔ)模塊的. 這個(gè)屬性通常與artifaceId一起共同標(biāo)識(shí)一個(gè)構(gòu)件
artifactId 指定這個(gè)構(gòu)件的名稱, 這個(gè)例子里面是ftpserver, 在生成的最終文件中,這里的artifactId將作為文件名的一部分出現(xiàn), 標(biāo)準(zhǔn)的文件命名格式為<artifactId>-<version>.<extension>, 這個(gè)例子就是ftpserver-1.0.jar
packaging 用來(lái)指定打包類型,比如JAR, WAR, EAR等, 如果不指定那么默認(rèn)是JAR, 這里的不僅僅可以指定打包類型,也可以指定為一個(gè)特定的生命周期作為整個(gè)build過(guò)程的一部分, 關(guān)于這一部分我們將來(lái)再詳細(xì)討論.
version 制定項(xiàng)目版本, 這里版本多了一個(gè)SNAPSHOT的概念, 作用域開(kāi)發(fā)過(guò)程, 在后面會(huì)詳細(xì)介紹如何使用SNAPSHOT來(lái)進(jìn)行協(xié)作開(kāi)發(fā).
name 制定項(xiàng)目名稱, Maven在根據(jù)項(xiàng)目生成文檔的時(shí)候會(huì)用到這個(gè)標(biāo)簽屬性
url 指定這個(gè)項(xiàng)目的站點(diǎn)地址, Maven在根據(jù)項(xiàng)目生成文檔的時(shí)候會(huì)用到這個(gè)標(biāo)簽屬性
description 項(xiàng)目的描述信息, Maven在根據(jù)項(xiàng)目生成文檔的時(shí)候會(huì)用到這個(gè)標(biāo)簽屬性
上面我們創(chuàng)建了一個(gè)基本項(xiàng)目, 現(xiàn)在我們介紹一下如何創(chuàng)建一個(gè)模板項(xiàng)目, 比如我們要?jiǎng)?chuàng)建一個(gè)spring的項(xiàng)目, 僅僅上面的步驟是不夠的, 那么Maven有這樣的模板替你做了很多項(xiàng)目配置的事情, 下面就讓我們看看如何操作, 很簡(jiǎn)單只要把create換成generate就可以了, 還是創(chuàng)建一個(gè)名為ftpserver的spring項(xiàng)目:
-DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.alibaba.base
-DartifactId=ftpserver
如果你是通過(guò)命令行方式創(chuàng)建的項(xiàng)目, 要在IDE(eclipse, 或者Intellij IDEA)上開(kāi)發(fā), 只需要通過(guò)簡(jiǎn)單的命令就可以生成eclipse或者IDEA的項(xiàng)目文件:
左下角選擇Maven Module, 填寫目錄相關(guān)信息, 點(diǎn)擊下一步
這里有一個(gè)復(fù)選框, Create from archetype, 如果不選則是創(chuàng)建基本項(xiàng)目, 在復(fù)選框上面打勾, 然后就可以選擇你想要?jiǎng)?chuàng)建項(xiàng)目的類型, 這里我們選擇跟之前那個(gè)例子一樣的類型: appfuse-basic-spring, 點(diǎn)擊Finish就完成了項(xiàng)目的創(chuàng)建.
通過(guò)命令行和IDE生成的項(xiàng)目的POM文件和目錄結(jié)構(gòu)是一樣的:
小結(jié)
通過(guò)這一章,我們了解到如何通過(guò)Maven根據(jù)我們的需要?jiǎng)?chuàng)建項(xiàng)目, 命令行方式和IDE方式, 通過(guò)命令行的方式不受操作系統(tǒng)的限制, 可以在沒(méi)有界面的Linux等操作系統(tǒng)進(jìn)行生命周期管理, 這在項(xiàng)目后期,我們需要通過(guò)命令行方式在測(cè)試服務(wù)器, 預(yù)發(fā)布服務(wù)器和生產(chǎn)環(huán)境服務(wù)器進(jìn)行相應(yīng)的生命周期管理. IDE方式適合在項(xiàng)目建立初期和開(kāi)發(fā)過(guò)程中, 可以很方便的通過(guò)界面的方式來(lái)管理項(xiàng)目的生命周期. 下面的章節(jié), 我會(huì)詳細(xì)介紹POM文件以及Maven生命周期.
聯(lián)系客服