隨筆-95  評(píng)論-31  文章-10  trackbacks-0
          maven其實(shí)也很笨重繁瑣,還是避免不了xml的各種配置,相比較gradle更靈活簡(jiǎn)潔,但公司不會(huì)讓人這么靈活構(gòu)建項(xiàng)目。不廢話了,進(jìn)入主題。
          現(xiàn)在開(kāi)發(fā)中,一個(gè)項(xiàng)目基本都是分模塊開(kāi)發(fā),一個(gè)模塊一個(gè)project,然后一起管理所有模塊,雖然maven已經(jīng)提供了不少archetype,生成基本的項(xiàng)目結(jié)構(gòu),但感覺(jué)有時(shí)候還是不太滿(mǎn)足自己的需求,有些jar或許用不到,整體模塊架構(gòu)目錄結(jié)構(gòu)以及依賴(lài)不是自己想要的,這個(gè)時(shí)候自定義archetype就能派上用場(chǎng)。
              自定義開(kāi)發(fā)archetype,首先得明確兩個(gè)概念,maven的聚合和繼承,聚合是為了管理多模塊build,繼承是為了管理依賴(lài),這里的需求是自動(dòng)構(gòu)建一個(gè)父模塊,以及多個(gè)子模塊,同時(shí)父模塊既是聚合也可繼承依賴(lài)。

          步驟一:創(chuàng)建一個(gè)maven工程,結(jié)構(gòu)中只需要個(gè)src/main/resources目錄以及一個(gè)簡(jiǎn)單的pom.xml,pom中packaging類(lèi)型為jar即可,如圖:


          步驟二:src/main/resources目錄下面必須包含兩個(gè)目錄:archetype-resources和META-INF/maven/archetype-metadata.xml,如圖:

          說(shuō)明:archetype-resources目錄是用來(lái)存放將來(lái)生成的項(xiàng)目結(jié)構(gòu)是什么,如上圖所示有兩個(gè)工程module-service和web以及一個(gè)父pom.xml,這個(gè)完全依據(jù)你的需求寫(xiě),META-INF/maven/archetype-metadata.xml是用來(lái)描述如何生成項(xiàng)目結(jié)構(gòu)。

          步驟三:描述archetype-metadata.xml 可參考http://maven.apache.org/archetype/archetype-models/archetype-descriptor/archetype-descriptor.html
          里面只有三個(gè)元素標(biāo)簽<requiredProperties/>、<fileSets/>、<modules/> 如圖:

          其實(shí)只要明白archetype-resources目錄和這個(gè)xml描述相對(duì)應(yīng),這里的<requiredProperty/><fileSets/><modules/>就很好理解
          1:<requiredProperty/>創(chuàng)建工程用戶(hù)必填內(nèi)容,用于Velocity templates替換,只要<fileSet>標(biāo)簽的filtered為true,即可表明該fileSet包含的文件內(nèi)容都進(jìn)行替換,比如每個(gè)子模塊的artifactId都不一樣,即可在pom里面<artifactId>${module-artifactId}</artifactId>,這里的值即可替換成用戶(hù)輸入的值。
          2:這里根標(biāo)簽下的<fileSets/>對(duì)應(yīng)archetype-resources根目錄。
          3:<modules/>對(duì)應(yīng)archetype-resources根目錄下面的module-service和web目錄。
          4:<module/>又可包含fileSet標(biāo)簽,描述子模塊的項(xiàng)目結(jié)構(gòu)。
          5:對(duì)于多模塊開(kāi)發(fā)來(lái)說(shuō),maven會(huì)采用默認(rèn)的父子模塊目錄結(jié)構(gòu),所以這里根標(biāo)簽下的<fileSets/>沒(méi)有必要存在,刪除即可,因?yàn)橹灰赼rchetype-resources根目錄下有一個(gè)pom.xml,將來(lái)生成的父子模塊目錄結(jié)構(gòu),父目錄下會(huì)自動(dòng)包含該pom文件。

          再看archetype-resources目錄下的子模塊如圖:


          提示:
          1:子模塊包含的目錄結(jié)構(gòu)是將來(lái)生成工程后會(huì)包含的目錄,里面仍然會(huì)用到Velocity templates(需要在archetype-metadata.xml中子模塊的fileSet標(biāo)簽里設(shè)置元素filtered="true",如果還需要生成包那么packaged="true"即可),比如每個(gè)類(lèi)會(huì)有包名那么這樣寫(xiě):package ${package}.xxx,因?yàn)榘话悴捎胓roupId.artifactId的格式,也即用戶(hù)輸入的內(nèi)容,用${package}即可替換成包名。
          如圖:

          2:子模塊中建立的包如src/main/java下面,api、entity、services等見(jiàn)上上圖~,無(wú)需添加根包名,因?yàn)閙aven會(huì)根據(jù)groupId.artifactId自動(dòng)生成包名,也即如果fileSet標(biāo)簽的元素packaged="true"且包下面存在java類(lèi)文件,那么api、entity、services等會(huì)默認(rèn)生成在該groupId.artifactId包下面。
          3:子模塊module-service繼承父pom(archetype-resources根目錄下的pom.xml)的依賴(lài),無(wú)需在子模塊里面添加<parent/>標(biāo)簽,因?yàn)閙aven默認(rèn)會(huì)認(rèn)為子模塊繼承父pom的依賴(lài), 會(huì)自動(dòng)加入<parent/>標(biāo)簽,如圖:



          無(wú)需添加<parent/>標(biāo)簽,生成工程后,會(huì)自動(dòng)添加。

          至此一切完畢,然后運(yùn)行mvn clean install即可將該archetype安裝到本地倉(cāng)庫(kù),在控制臺(tái)輸入mvn archetype:generate -DarchetypeCatalog=local選擇你的archetype即可以交互方式生成工程,如果有錯(cuò)誤,控制臺(tái)會(huì)提示,按錯(cuò)排除即可。
          用eclipse也可安裝,點(diǎn)擊maven project-->next-->Catalog選擇Default Local-->Add Archetype-->輸入該archetype的groupId、artifactId、version確定即可出現(xiàn)。

          posted on 2015-02-12 00:43 朔望魔刃 閱讀(2220) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): maven

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 乳源| 肥西县| 聊城市| 富裕县| 万年县| 耿马| 苍溪县| 绍兴县| 克拉玛依市| 南开区| 饶平县| 丰宁| 集安市| 清丰县| 隆回县| 云龙县| 武清区| 朝阳市| 和龙市| 泊头市| 花莲县| 共和县| 都匀市| 沅江市| 杨浦区| 泽普县| 衡南县| 博兴县| 彰化市| 靖远县| 宁津县| 昌黎县| 张家界市| 平遥县| 株洲市| 井陉县| 龙南县| 济源市| 扎囊县| 五峰| 葵青区|