虽然maven已经提供了maven-archetype-webapp、maven-archetype-quickstart等项目骨架帮助咱们快速构建项目架构,可是默认提供的archetype初始化的项目架构并不能知足开发需求,这时候就有必要本身写一个知足项目需求的archetype了java
为了激发阅读兴趣,先放一张使用自定义archetype生成项目的项目结构图 mysql
archetype
生成的,为了让大家学习真是用尽办法
能够简单的理解为模板工具类,经过archetype
咱们能够快速的生成项目的基本架构。好比咱们使用idea
建立一个maven web
项目时,经常会选择maven-archetype-webapp
模板来初始化项目,使用maven-archetype-webapp
生成的项目中包括webapp
目录,里面包含web
的配置文件 linux
要想写一个自定义archetype
,首先得知道一个archetype的组成。archetype由四部分组成:git
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
的四个组成部分,两个pom
文件,一个archtype-metadata
文件和五个原型文件[__rootArtifactId__-*
],其中__rootArtifactId__
在生成模板工程时会被传入的值替代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中的命令行传进来的<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
:子模块的名字.<!--项目子模块-->
<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>
标签附:superman archetype代码github
1.下载源码web
git clone https://github.com/TiantianUpup/superman.git
复制代码
2.打开superman工程,将其安装到本地仓库
运行命令前先切换到20190815-v2update分支,master分支被我玩坏了【真丢人!!!】
运行以下命令spring
mvn clean install
复制代码
3.使用自定义archetype初始化项目sql
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.修改resources文件夹下的配置文件,而且将resources文件标记成Resources Rootwindows
该文件夹下有application.properties
,logback.properties
,logback-spring.xml
三个配置文件
application.properties
配置文件的修改 application.properties
主要是Spring
、MyBatisPlus
和数据库的配置信息
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
层包名,默认MybatiPlus
的mapper
文件保存在resource
下的mapper
文件夹下,可自行修改
logback.properties
配置文件的修改 logback.properties
定义了error
级别日志和info
级别日志的保存地址
LOG_ERROR_HOME=
LOG_INFO_HOME=
复制代码
logback-spring.xml
配置文件的修改 logback-spring.xml
主要是日志输出规则的定义,若为windows
系统无需进行修改,若为linux os
或mac os
,则需修改日志保存地址
<fileNamePattern>${LOG_ERROR_HOME}//%d.log</fileNamePattern>
复制代码
将//
修改成/
5 使用代码生成器生成controller
、service
、dao
、po
层代码 代码生成器类位于service
模块下的generator
包下,只须要初始化几个字段值运行就能够生成相应的代码。在运行前首先在项目根目录下建立一个mp-generator-output
文件夹,该文件夹的名字和OUTPUT_DIR
字段值保持一致
PACKAGE_NAME
OUTPUT_DIR
生成代码保存文件地址,默认保存在项目下的mp-generator-output
文件夹下,能够修改成自定义保存地址AUTHOR
DRIVER_NAME
HOST
PORT
DATABASE
USERNAME
PASSWORD
6.将生成的代码移动到对应模块对应包下
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
类 包含了id
、gmtCreate
、gmtModified
、deleted
这些数据库基本字段,需将生成的实体类手动删除这些重复字段。同时自动生成的po
类缺失了@TableName
、@TableField
注解需手动补充。注解的使用方式可参考BasePO
类
7.修改web
模块aspect
包下的环绕通知
@Around("execution(* yourpackage.controller..*(..))")
复制代码
该切面主要用于拦截controller层返回的结果,将其封装成统一结果返回
8 启动项目
web
模块下的Runner
类为启动类,运行该类便可启动,默认端口为8081
附:superman archetype生成demo工程地址
欢迎fork与star[划重点],因为开发经验有限,有些地方可能考虑不周,欢迎提bug。而且该archetype
只定义了一些基础功能,欢迎提需求。