自定义archetype,一统团队项目结构风格

虽然maven已经提供了maven-archetype-webapp、maven-archetype-quickstart等项目骨架帮助我们快速构建项目架构,但是默认提供的archetype初始化的项目架构并不能满足开发需求,这时候就有必要自己写一个满足项目需求的archetype了

使用自定义archrtype生成的项目结构图

为了激发阅读兴趣,先放一张使用自定义archetype生成项目的项目结构图


基本上的类都是archetype生成的

archetype是什么

可以简单的理解为模板工具类,通过archetype我们可以快速的生成项目的基本架构。比如我们使用idea创建一个maven web项目时,常常会选择maven-archetype-webapp模板来初始化项目,使用maven-archetype-webapp生成的项目中包括webapp目录,里面包含web的配置文件

archetype的组成

要想写一个自定义archetype,首先得知道一个archetype的组成。archetype由四部分组成:

  • prototype files 原型文件
    位于src/main/resources/archetype-resource目录下。prototype files 原型文件可以理解为多模块中的子模块或是单模块工程中的源文件[即src文件]。这些原型文件在使用对应archetype生成项目时被生成
  • archetype-metadata.xml
    位于src/main/resources/META-INF/maven/目录下。该配置文件中主要列出了原型文件以及使用archetype生成模板工程需要的参数
  • prototype pom
    位于src/main/resources/archetype-resources目录下。这个pom文件会出现在archetype创建的模板工程中,如果是单模块工程,则是对整个项目的依赖管理;如果是多模块工程,该pom是总pom文件,该文件中会定义项目的子模块以及对子模块的依赖进行管理等,子模块pom定义在子模块下,子模块pom文件只管理子模块的依赖。
  • archetype pom
    位于自定义archetype工程的根目录下。这是archetype工程项目的pom文件,里面一般没什么东西,不会出现在archetype创建的模板工程中

superman[自定义archetype]结构说明

  • superman项目结构图

    包含了archetype的四个组成部分,两个pom文件,一个archtype-metadata文件和五个原型文件[__rootArtifactId__-*],其中__rootArtifactId__在生成模板工程时会被传入的值替代
  • archtype-metadata配置文件
    • 1.定义使用archetype生成模板工程需要传入的参数
    <!--需要输入的属性-->
        <requiredProperties>
            <requiredProperty key="groupId">
                <!--默认的groupId-->
                <defaultValue>com.h2t.test</defaultValue>
            </requiredProperty>
            <requiredProperty key="artifactId">
                <!--默认的artifactId-->
                <defaultValue>demo</defaultValue>
            </requiredProperty>
            <requiredProperty key="package">
                <!--默认的包名和groupId一样-->
                <defaultValue>${groupId}</defaultValue>
            </requiredProperty>
        </requiredProperties>
    
    ${}标识的变量都是通过maven中的命令行传进来的
    • 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里对应的directory
    name :子模块的名字.
  • prototype pom文件
    • 1.定义了五个子模块
        <!--项目子模块-->
        <modules>
            <module>${rootArtifactId}-common</module>
            <module>${rootArtifactId}-dao</module>
            <module>${rootArtifactId}-service</module>
            <module>${rootArtifactId}-web</module>
            <module>${rootArtifactId}-model</module>
        </modules>
    
    • 子模块依赖版本统一管理
    <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中,子模块使用依赖时不需要<version>标签
  • 原型文件以web模块说明

    就是一个简单的maven工程,里面写了使用archetype生成模板项目的类


附:superman archetype代码


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

  • 1.下载源码
git clone https://github.com/TiantianUpup/superman.git
  • 2.打开superman工程,将其安装到本地仓库
    运行如下命令
mvn clean install
  • 3.使用自定义archetype初始化项目
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

参数说明
-DgroupId组ID,默认项目的包名的组ID相同
DartifactId:项目唯一标识符,即项目名称
-DarchetypeGroupId:superman的组ID,值不需要进行修改
-DarchetypeArtifactId:superman的artifactId,值不需要进行改变

  • 4.移动配置文件
    因为使用archetype生成项目时会将resource下面的文件丢失,所以目前将配置文件放在了web模块下的resource包下,创建项目成功后需手动将文件移动到web模块下的resource文件夹下,并将resource文件成标记成Resources Root

  • 5.修改resource文件夹下的配置文件
    该文件夹下有application.propertieslogback.propertieslogback-spring.xml三个配置文件

    • application.properties配置文件的修改
      application.properties 主要是SpringMyBatisPlus和数据库的配置信息
    spring.datasource.url=jdbc:mysql://localhost:3306/your_database?characterEncoding=UTF8&serverTimezone=UTC
    spring.datasource.username=root
    spring.datasource.password=your password
    

    修改数据库、密码,默认用户名为root

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

    指定MybatisPlus实体类别名的包,即model模块的po层包名,默认MybatiPlusmapper文件保存在resource下的mapper文件夹下,可自行修改

    • logback.properties配置文件的修改
      logback.properties定义了error级别日志和info级别日志的保存地址
    LOG_ERROR_HOME=  
    LOG_INFO_HOME=
    
    • logback-spring.xml配置文件的修改
      logback-spring.xml主要是日志输出规则的定义,若为windows系统无需进行修改,若为linux osmac os,则需修改日志保存地址
    <fileNamePattern>${LOG_ERROR_HOME}//%d.log</fileNamePattern>
    

    //修改为/

  • 6 使用代码生成器生成controllerservicedaopo层代码
    代码生成器类位于service模块下的generator包下,只需要初始化几个字段值运行就可以生成相应的代码。在运行前首先在项目根目录下创建一个mp-generator-output文件夹,该文件夹的名字和OUTPUT_DIR字段值保持一致

    • PACKAGE_NAME
      生成代码的包名,和项目的包名一致,负责复制过去代码会有一些小问题
      -OUTPUT_DIR
      生成代码保存文件地址,默认保存在项目下的mp-generator-output文件夹下,可以修改为自定义保存地址
    • AUTHOR
      注释中作者的名字
    • DRIVER_NAME
      数据库驱动
    • HOST
      数据库主机号
    • PORT
      数据库端口
    • DATABASE
      数据库名字
    • USERNAME
      数据库用户名
    • PASSWORD
      数据库密码
  • 7.将生成的代码移动到对应模块对应包下

    • controller文件夹
      实体类对应的Controller,将该目录下的类移到web模块下的controller包下

    • mapper文件夹
      实体类对应的DAO层,该目录下包含xml文件和对应实体的接口类,将xml文件移到dao模块resource 下的mapper文件夹下,需自行建立mapper文件夹,将接口移到dao模块下的mapper包下并在接口类上添加@Mapper注解,需自行建立 mapper包。同时将resource文件夹标记成Resources root

    • service 对应实体类接口

      • impl 对应实体类接口实现类

      service目录下的接口移到service模块下的service包下,impl目录下的类移到service模块下的service.impl包下

    • po文件夹
      将该目录下的类移到model模块下的po包下,并修改继承关系,统一继承BasePO类,因为BasePO类 包含了idgmtCreategmtModifieddeleted这些数据库基本字段,需将生成的实体类手动删除这些重复字段。同时自动生成的po类缺失了@TableName@TableField注解需手动补充。注解的使用方式可参考BasePO

  • 8.修改web模块aspect包下的环绕通知

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

    该切面主要用于拦截controller层返回的结果,将其封装成统一结果返回

  • 9 启动项目
    web模块下的Runner类为启动类,运行该类即可启动,默认端口为8081



    附:superman archetype生成demo工程地址

    欢迎fork与star[划重点],
    由于开发经验有限,有些地方可能考虑不周,欢迎提bug。并且该archetype只定义了一些基础功能,欢迎提需求。



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343