亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Maven入門--概念與實例

系統(tǒng) 1674 0

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或運行,一個典型的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
軟件項目一般都有相似的開發(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)點
[1]build邏輯可以被重用。在Ant中可能需要多次重復(fù)地寫相同的語句,但由于POM的繼承性,可以復(fù)用其它的POM文件中的語句。這樣既可以寫出清晰的build語句,又可以構(gòu)造出層次關(guān)系良好的build工程。
[2]不必關(guān)注build工作的實現(xiàn)細(xì)節(jié)。我們只需要使用一些build生命周期短語就可以達(dá)到我們的目標(biāo),而不必管Maven是如何做到這些的。如,只需要告訴Maven要安裝(install),那么它自然就會驗證,編譯,打包,及安裝。
[3]Maven會自動加載工程依賴的artifact所依賴的其它artifact(Transitive Dependency),而不用顯示的將這些artifact全部寫到dependency中。
[4]如果完全使用Maven的標(biāo)準(zhǔn)目錄布局,那么可以極大地減少配置細(xì)節(jié)。
5 實例
5.1 構(gòu)想
由于只是闡述Maven的基本使用方法,所以本文將要設(shè)計的實例,只是一個簡單的Maven demo。該實例包含兩個工程:普通應(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包ce.demo.mvn中。artifactId是app,那么該工程根目錄的名稱將為app。
當(dāng)?shù)谝淮螆?zhí)行該命令時,Maven會從central倉庫中下載一些文件。這些文件包含插件archetype,以及它所依賴的其它包。該命令執(zhí)行完畢后,在目錄D:\maven\demo下會出現(xiàn)如下目錄布局:

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 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 StringgetStr(Stringstr) {
return str;
}

}
其實,如果我們能夠清楚地知道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
第一次運行此命令時,也會從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)目錄布局:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 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(HttpServletRequestrequest,HttpServletResponseresponse)
throws ServletException,IOException {
Appapp
= new App();
Stringstr
= app.getStr( " CEMavenDemo " );
PrintWriterout
= 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 > CEMavenDemo--App </ name >
</ project >
大家可以發(fā)現(xiàn)此我帖出來的內(nèi)容與實際由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 > CEMavenDemo--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 項。由于webapp需要用到app工程中的類(見HelloServlet源代碼),它還需要javax.servlet包(因為該包并不默認(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)如下問題:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> D:\maven\demo\webapp>mvnpackage
……
Downloading:http://repo1.maven.org/maven2/ce/demo/mvn/app/
1.0 /app- 1.0 .pom
[ INFO ] ------------------------------------------------------------------------
[ ERROR ] BUILDERROR
[ INFO ] ------------------------------------------------------------------------
[ INFO ] ErrorbuildingPOM(maynotbethisproject'sPOM).
ProjectID:ce.demo.mvn:app
Reason:ErrorgettingPOMfor'ce.demo.mvn:app'fromtherepository:Errortransferringfile
ce.demo.mvn:app:pom:
1.0
fromthespecifiedremoterepositories:
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.blogjava.net/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 > CEMavenDemo </ name >

< modules >
< module > app </ module >
< module > webapp </ module >
</ modules >
</ project >

與app和webapp中的POM相比,demo的POM使用了modules項,modules用于聲明本工程的子工程,module中的值對應(yīng)于子工程的artifact名。而且該POM的packaging類型必須為pom。
有了demo工程后,我們只需要在demo目錄下執(zhí)行相關(guān)命令就可以了。通過如下命令即可驗證:
[1] mvn clean – 消除工程(包括所有子工程)中產(chǎn)生的所有輸出。這本文的實例中,實際上是刪除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é)
通過以上的敘述與實例,應(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 -- 強烈推薦
[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的站點生成功能. http://www.matrix.org.cn/resource/article/44/44491_Maven2.html
文中例子程序下載: http://www.blogjava.net/files/jiangshachina/maven.rar


本文轉(zhuǎn)自:http://www.blogjava.net/jiangshachina/archive/2006/09/01/67080.html

Maven入門--概念與實例


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美大尺码毛片 | 免费一级欧美片在线观免看 | 日韩精品特黄毛片免费看 | 亚洲国产日韩欧美高清片a 亚洲国产日韩欧美一区二区三区 | xx色综合 | 久色视频在线 | 亚洲精品中文字幕一区在线 | 国产欧美日韩第一页 | 九九久久九九 | 成人 在线欧美亚洲 | 亚洲综合爱爱久久网 | 日本天天操| 99久久免费观看 | 国产精品福利自产拍网站 | 四虎成人精品在永久在线观看 | 午夜视频欧美 | 波多野给衣一区二区三区 | 色片在线观看 | 成人国产在线视频在线观看 | 中文字幕一区二区三区四区五区人 | 欧美成人亚洲 | 欧美一级片在线免费观看 | 精品无人乱码区1区2区3区 | 91日韩视频 | 欧美综合图片区 | 国内精品久久久久影院日本 | 香香影院在线观看 | 久热久| 亚洲国产第一区 | 日本综合在线观看 | 日韩不卡视频在线 | 亚洲国产成人久久精品图片 | 亚洲精品一区二区三区在线观看 | 热99这里只有精品 | 精品欧美一区二区三区在线 | 欧美久久亚洲精品 | 黄色一级毛片在线观看 | 插插插色综合 | 香蕉视频一级 | 嫩草社区 | 国产成人久久精品二区三区牛 |