自定義archetype妆够,一統(tǒng)團(tuán)隊(duì)項(xiàng)目結(jié)構(gòu)風(fēng)格

雖然maven已經(jīng)提供了maven-archetype-webapp炭臭、maven-archetype-quickstart等項(xiàng)目骨架幫助我們快速構(gòu)建項(xiàng)目架構(gòu),但是默認(rèn)提供的archetype初始化的項(xiàng)目架構(gòu)并不能滿足開發(fā)需求敌呈,這時(shí)候就有必要自己寫一個(gè)滿足項(xiàng)目需求的archetype了

使用自定義archrtype生成的項(xiàng)目結(jié)構(gòu)圖

為了激發(fā)閱讀興趣贸宏,先放一張使用自定義archetype生成項(xiàng)目的項(xiàng)目結(jié)構(gòu)圖


基本上的類都是archetype生成的

archetype是什么

可以簡(jiǎn)單的理解為模板工具類,通過archetype我們可以快速的生成項(xiàng)目的基本架構(gòu)驱富。比如我們使用idea創(chuàng)建一個(gè)maven web項(xiàng)目時(shí)锚赤,常常會(huì)選擇maven-archetype-webapp模板來初始化項(xiàng)目,使用maven-archetype-webapp生成的項(xiàng)目中包括webapp目錄褐鸥,里面包含web的配置文件

archetype的組成

要想寫一個(gè)自定義archetype线脚,首先得知道一個(gè)archetype的組成。archetype由四部分組成:

  • prototype files 原型文件
    位于src/main/resources/archetype-resource目錄下叫榕。prototype files 原型文件可以理解為多模塊中的子模塊或是單模塊工程中的源文件[即src文件]浑侥。這些原型文件在使用對(duì)應(yīng)archetype生成項(xiàng)目時(shí)被生成
  • archetype-metadata.xml
    位于src/main/resources/META-INF/maven/目錄下。該配置文件中主要列出了原型文件以及使用archetype生成模板工程需要的參數(shù)
  • prototype pom
    位于src/main/resources/archetype-resources目錄下晰绎。這個(gè)pom文件會(huì)出現(xiàn)在archetype創(chuàng)建的模板工程中寓落,如果是單模塊工程,則是對(duì)整個(gè)項(xiàng)目的依賴管理荞下;如果是多模塊工程伶选,該pom是總pom文件,該文件中會(huì)定義項(xiàng)目的子模塊以及對(duì)子模塊的依賴進(jìn)行管理等尖昏,子模塊pom定義在子模塊下仰税,子模塊pom文件只管理子模塊的依賴。
  • archetype pom
    位于自定義archetype工程的根目錄下抽诉。這是archetype工程項(xiàng)目的pom文件陨簇,里面一般沒什么東西,不會(huì)出現(xiàn)在archetype創(chuàng)建的模板工程中

superman[自定義archetype]結(jié)構(gòu)說明

  • superman項(xiàng)目結(jié)構(gòu)圖

    包含了archetype的四個(gè)組成部分迹淌,兩個(gè)pom文件河绽,一個(gè)archtype-metadata文件和五個(gè)原型文件[__rootArtifactId__-*]己单,其中__rootArtifactId__在生成模板工程時(shí)會(huì)被傳入的值替代
  • archtype-metadata配置文件
    • 1.定義使用archetype生成模板工程需要傳入的參數(shù)
    <!--需要輸入的屬性-->
        <requiredProperties>
            <requiredProperty key="groupId">
                <!--默認(rèn)的groupId-->
                <defaultValue>com.h2t.test</defaultValue>
            </requiredProperty>
            <requiredProperty key="artifactId">
                <!--默認(rèn)的artifactId-->
                <defaultValue>demo</defaultValue>
            </requiredProperty>
            <requiredProperty key="package">
                <!--默認(rèn)的包名和groupId一樣-->
                <defaultValue>${groupId}</defaultValue>
            </requiredProperty>
        </requiredProperties>
    
    ${}標(biāo)識(shí)的變量都是通過maven中的命令行傳進(jìn)來的
    • 2.定義原型文件
      <module id="${rootArtifactId}-web" name="${rootArtifactId}-web" dir="__rootArtifactId__-web">
                <fileSets>
                    <fileSet filtered="true" encoding="UTF-8" packaged="true">
                        <directory>src/main/java</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                    <fileSet filtered="true" encoding="UTF-8" packaged="true">
                        <directory>src/test/java</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                    <fileSet encoding="UTF-8">
                        <directory>src/main/resources</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                    <fileSet encoding="UTF-8">
                        <directory>src/test/resources</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                </fileSets>
            </module>
    
    module屬性介紹:
    id:子模塊工程的artifactId
    dir:子模塊工程源文件在archetype-resources里對(duì)應(yīng)的directory
    name :子模塊的名字.
  • prototype pom文件
    • 1.定義了五個(gè)子模塊
        <!--項(xiàng)目子模塊-->
        <modules>
            <module>${rootArtifactId}-common</module>
            <module>${rootArtifactId}-dao</module>
            <module>${rootArtifactId}-service</module>
            <module>${rootArtifactId}-web</module>
            <module>${rootArtifactId}-model</module>
        </modules>
    
    • 子模塊依賴版本統(tǒng)一管理
    <dependencyManagement>
                <!--modules-->
                <dependency>
                    <groupId>${groupId}</groupId>
                    <artifactId>${rootArtifactId}-common</artifactId>
                    <version>${version}</version>
                </dependency>
    
                <dependency>
                    <groupId>${groupId}</groupId>
                    <artifactId>${rootArtifactId}-dao</artifactId>
                    <version>${version}</version>
                </dependency>
    
                <dependency>
                    <groupId>${groupId}</groupId>
                    <artifactId>${rootArtifactId}-service</artifactId>
                    <version>${version}</version>
                </dependency>
    
                <dependency>
                    <groupId>${groupId}</groupId>
                    <artifactId>${rootArtifactId}-model</artifactId>
                    <version>${version}</version>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
    子模塊所需依賴都定義在該pom中,子模塊使用依賴時(shí)不需要<version>標(biāo)簽
  • 原型文件以web模塊說明

    就是一個(gè)簡(jiǎn)單的maven工程耙饰,里面寫了使用archetype生成模板項(xiàng)目的類


附:superman archetype代碼


快速開始【superman archetype使用指南】

  • 1.下載源碼
git clone https://github.com/TiantianUpup/superman.git
  • 2.打開superman工程纹笼,將其安裝到本地倉(cāng)庫(kù)
    運(yùn)行如下命令
mvn clean install
  • 3.使用自定義archetype初始化項(xiàng)目
mvn archetype:generate 
-DgroupId=com.h2t.test 
-DartifactId=superman-demo 
-Dversion=1.0.0-SNAPSHOT 
-DarchetypeGroupId=com.h2t.study 
-DarchetypeArtifactId=superman -DarchetypeVersion=0.0.1-SNAPSHOT -X -DarchetypeCatalog=local

參數(shù)說明
-DgroupId組ID,默認(rèn)項(xiàng)目的包名的組ID相同
DartifactId:項(xiàng)目唯一標(biāo)識(shí)符苟跪,即項(xiàng)目名稱
-DarchetypeGroupId:superman的組ID允乐,值不需要進(jìn)行修改
-DarchetypeArtifactId:superman的artifactId,值不需要進(jìn)行改變

  • 4.移動(dòng)配置文件
    因?yàn)槭褂?code>archetype生成項(xiàng)目時(shí)會(huì)將resource下面的文件丟失削咆,所以目前將配置文件放在了web模塊下的resource包下,創(chuàng)建項(xiàng)目成功后需手動(dòng)將文件移動(dòng)到web模塊下的resource文件夾下蠢笋,并將resource文件成標(biāo)記成Resources Root

  • 5.修改resource文件夾下的配置文件
    該文件夾下有application.properties 拨齐,logback.propertieslogback-spring.xml三個(gè)配置文件

    • application.properties配置文件的修改
      application.properties 主要是Spring昨寞、MyBatisPlus和數(shù)據(jù)庫(kù)的配置信息
    spring.datasource.url=jdbc:mysql://localhost:3306/your_database?characterEncoding=UTF8&serverTimezone=UTC
    spring.datasource.username=root
    spring.datasource.password=your password
    

    修改數(shù)據(jù)庫(kù)瞻惋、密碼,默認(rèn)用戶名為root

    mybatis-plus.mapper-locations=classpath*:/mapper/*.xml  
    # mybatis-plus.type-aliases-package=
    

    指定MybatisPlus實(shí)體類別名的包援岩,即model模塊的po層包名歼狼,默認(rèn)MybatiPlusmapper文件保存在resource下的mapper文件夾下,可自行修改

    • logback.properties配置文件的修改
      logback.properties定義了error級(jí)別日志和info級(jí)別日志的保存地址
    LOG_ERROR_HOME=  
    LOG_INFO_HOME=
    
    • logback-spring.xml配置文件的修改
      logback-spring.xml主要是日志輸出規(guī)則的定義享怀,若為windows系統(tǒng)無需進(jìn)行修改羽峰,若為linux osmac os,則需修改日志保存地址
    <fileNamePattern>${LOG_ERROR_HOME}//%d.log</fileNamePattern>
    

    //修改為/

  • 6 使用代碼生成器生成controller添瓷、service梅屉、daopo層代碼
    代碼生成器類位于service模塊下的generator包下鳞贷,只需要初始化幾個(gè)字段值運(yùn)行就可以生成相應(yīng)的代碼坯汤。在運(yùn)行前首先在項(xiàng)目根目錄下創(chuàng)建一個(gè)mp-generator-output文件夾,該文件夾的名字和OUTPUT_DIR字段值保持一致

    • PACKAGE_NAME
      生成代碼的包名搀愧,和項(xiàng)目的包名一致惰聂,負(fù)責(zé)復(fù)制過去代碼會(huì)有一些小問題
      -OUTPUT_DIR
      生成代碼保存文件地址,默認(rèn)保存在項(xiàng)目下的mp-generator-output文件夾下咱筛,可以修改為自定義保存地址
    • AUTHOR
      注釋中作者的名字
    • DRIVER_NAME
      數(shù)據(jù)庫(kù)驅(qū)動(dòng)
    • HOST
      數(shù)據(jù)庫(kù)主機(jī)號(hào)
    • PORT
      數(shù)據(jù)庫(kù)端口
    • DATABASE
      數(shù)據(jù)庫(kù)名字
    • USERNAME
      數(shù)據(jù)庫(kù)用戶名
    • PASSWORD
      數(shù)據(jù)庫(kù)密碼
  • 7.將生成的代碼移動(dòng)到對(duì)應(yīng)模塊對(duì)應(yīng)包下

    • controller文件夾
      實(shí)體類對(duì)應(yīng)的Controller搓幌,將該目錄下的類移到web模塊下的controller包下

    • mapper文件夾
      實(shí)體類對(duì)應(yīng)的DAO層,該目錄下包含xml文件和對(duì)應(yīng)實(shí)體的接口類眷蚓,將xml文件移到dao模塊resource 下的mapper文件夾下鼻种,需自行建立mapper文件夾,將接口移到dao模塊下的mapper包下并在接口類上添加@Mapper注解沙热,需自行建立 mapper包叉钥。同時(shí)將resource文件夾標(biāo)記成Resources root

    • service 對(duì)應(yīng)實(shí)體類接口

      • impl 對(duì)應(yīng)實(shí)體類接口實(shí)現(xiàn)類

      service目錄下的接口移到service模塊下的service包下罢缸,impl目錄下的類移到service模塊下的service.impl包下

    • po文件夾
      將該目錄下的類移到model模塊下的po包下,并修改繼承關(guān)系投队,統(tǒng)一繼承BasePO類枫疆,因?yàn)?code>BasePO類 包含了idgmtCreate敷鸦、gmtModified息楔、deleted這些數(shù)據(jù)庫(kù)基本字段,需將生成的實(shí)體類手動(dòng)刪除這些重復(fù)字段扒披。同時(shí)自動(dòng)生成的po類缺失了@TableName值依、@TableField注解需手動(dòng)補(bǔ)充。注解的使用方式可參考BasePO

  • 8.修改web模塊aspect包下的環(huán)繞通知

    @Around("execution(* yourpackage.controller..*(..))")
    

    該切面主要用于攔截controller層返回的結(jié)果碟案,將其封裝成統(tǒng)一結(jié)果返回

  • 9 啟動(dòng)項(xiàng)目
    web模塊下的Runner類為啟動(dòng)類愿险,運(yùn)行該類即可啟動(dòng),默認(rèn)端口為8081



    附:superman archetype生成demo工程地址

    歡迎fork與star[劃重點(diǎn)]价说,
    由于開發(fā)經(jīng)驗(yàn)有限辆亏,有些地方可能考慮不周,歡迎提bug鳖目。并且該archetype只定義了一些基礎(chǔ)功能扮叨,歡迎提需求。



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末领迈,一起剝皮案震驚了整個(gè)濱河市彻磁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狸捅,老刑警劉巖兵迅,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異薪贫,居然都是意外死亡恍箭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門瞧省,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扯夭,“玉大人,你說我怎么就攤上這事鞍匾〗幌矗” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵橡淑,是天一觀的道長(zhǎng)构拳。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么置森? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任斗埂,我火速辦了婚禮,結(jié)果婚禮上凫海,老公的妹妹穿的比我還像新娘呛凶。我一直安慰自己,他們只是感情好行贪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布漾稀。 她就那樣靜靜地躺著,像睡著了一般建瘫。 火紅的嫁衣襯著肌膚如雪崭捍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天啰脚,我揣著相機(jī)與錄音缕贡,去河邊找鬼。 笑死拣播,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的收擦。 我是一名探鬼主播贮配,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼塞赂!你這毒婦竟也來了泪勒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤宴猾,失蹤者是張志新(化名)和其女友劉穎圆存,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仇哆,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沦辙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讹剔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片油讯。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖延欠,靈堂內(nèi)的尸體忽然破棺而出陌兑,到底是詐尸還是另有隱情,我是刑警寧澤由捎,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布兔综,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏软驰。R本人自食惡果不足惜涧窒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碌宴。 院中可真熱鬧杀狡,春花似錦、人聲如沸贰镣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碑隆。三九已至恭陡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間上煤,已是汗流浹背休玩。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留劫狠,地道東北人拴疤。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像独泞,于是被迫代替她去往敵國(guó)和親呐矾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353