java 脚手架_撸一个Java脚手架,一统团队项目结构风格
虽然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生成模板工程需要传入的参数
com.h2t.test
demo
${groupId}
${}标识的变量都是通过maven中的命令行传进来的
2.定义原型文件
src/main/java
**/*.*
src/test/java
**/*.*
src/main/resources
**/*.*
src/test/resources
**/*.*
module属性介绍:
id:子模块工程的artifactId
dir:子模块工程源文件在archetype-resources里对应的directory
name :子模块的名字.
prototype pom文件
1.定义了五个子模块
${rootArtifactId}-common
${rootArtifactId}-dao
${rootArtifactId}-service
${rootArtifactId}-web
${rootArtifactId}-model
子模块依赖版本统一管理
${groupId}
${rootArtifactId}-common
${version}
${groupId}
${rootArtifactId}-dao
${version}
${groupId}
${rootArtifactId}-service
${version}
${groupId}
${rootArtifactId}-model
${version}
子模块所需依赖都定义在该pom中,子模块使用依赖时不需要标签
原型文件以web模块说明
就是一个简单的maven工程,里面写了使用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.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,则需修改日志保存地址
${LOG_ERROR_HOME}//%d.log
将`//`修改为`/`
6 使用代码生成器生成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
数据库密码
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类 包含了id、gmtCreate、gmtModified、deleted这些数据库基本字段,需将生成的实体类手动删除这些重复字段。同时自动生成的po类缺失了@TableName、@TableField注解需手动补充。注解的使用方式可参考BasePO类
8.修改web模块aspect包下的环绕通知
@Around("execution(* yourpackage.controller..*(..))")
该切面主要用于拦截controller层返回的结果,将其封装成统一结果返回
9 启动项目
web模块下的Runner类为启动类,运行该类即可启动,默认端口为8081
欢迎fork与star[划重点],由于开发经验有限,有些地方可能考虑不周,欢迎提bug。并且该archetype只定义了一些基础功能,欢迎提需求。
java 脚手架_撸一个Java脚手架,一统团队项目结构风格相关推荐
- idea 制作maven脚手架_开发一个maven脚手架
写在前面 开发新项目就需要搭建新工程,但是搭建新工程的这个过程是非常繁琐浪费时间的,并且不可避免的需要踩坑.更可怕的是,如果是在一个团队中,每新起一个项目都由不同的开发人员去自定义的搭建工程结构,那么 ...
- java 级数_编写一个Java程序实现级数运算。
编写一个Java程序实现级数运算.其中:定义级数求和类,以及级数求积(阶乘)类,在项目主类中声明一个级数求和对象和求阶乘对象,由键盘输入级数的n值,并打印出1+2+...+n的和,以及... 编写一个 ...
- java猜拳_求一个java猜拳游戏程序
展开全部 package test; import java.util.Random; import java.util.Scanner; /** * 猜拳游戏思路 * 1.定义输入函数 * 2.提示 ...
- 有哪些小游戏的java代码_求一个Java小游戏代码(鼠标点击类小游戏)最好代码里面不要有中文...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 } else{ black_count=0; } if(chess[i][j]==2) { white_count++; if(white_count== ...
- A002、java环境搭建_第一个java程序
目录 1.内容介绍 2.软件开发概述 2.1 软件开发概念 2.2 软件开发示例 2.3 软件开发语言 2.3.1 计算机语言概述 2.3.2 计算机语言分类 2.4 小结 3.Java概述 3.1 ...
- java编程用户输入两个数字_编写一个Java应用程序,要求从键盘输入两个整数,计算这两个数据...,编写一个Java应用程序,要求从键盘输入一个数,判断该数是不...
导航:网站首页 > 编写一个Java应用程序,要求从键盘输入两个整数,计算这两个数据...,编写一个Java应用程序,要求从键盘输入一个数,判断该数是不 编写一个Java应用程序,要求从键盘输入 ...
- (一)初识java ---我的第一个java程序
初识java ---我的第一个java程序 课程目录 l 準備 l 開発環境的準備 l 環境変数Path設定 l 第一个程序 目标 « 实现自己的HelloWorld并运行看到结果 一.準備 ...
- java输入字符串异常_设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为“XYZ”。。。...
设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为"XYZ",则抛出一个异常信息"This is a XYZ",如果从命令 ...
- java脚本_写一个在线Java脚本执行器
在生产环境中,有时候我们想要快速执行一段代码,但是又不得不经历上线的痛苦(分情况哈,有时候这种痛苦是必须的)或者在某些场景中,不能重启避免破坏现场,那么有个在线脚本执行器就最好不过了.于是在工作之余, ...
最新文章
- vrp车辆路径问题 php,蚁群算法在车辆路径问题(VRP)中的应用.ppt
- JSR315(JavaTM Servlet 3.0 Specification)
- DeviceToken 获取失败,原因:Error Domain=NSCocoaErrorDomain Code=3000 未找到应用程序的“aps-environment”的授权字符串......
- php一次性执行多条sql_PHP循环执行多条SQL
- node.js小案例_留言板
- 发布nuget包的正确姿势---cicd自动打包发布
- 重学TCP协议(6) 四次挥手
- sql中left join后用on还是where
- OC中NSString 的常用方法
- matplotlib数据可视化实战——折线图+散点图
- vfp复制表结构_《VisualFoxPro复制生成表》教学设计
- scala闭包 变量_Scala闭包,自由和绑定变量,匿名函数
- w10运行游戏计算机中丢失xinput1-3.dll,win10游戏缺少xinput1_3.dll如何修复_win10电脑找不到xinput1_3.dll怎么解决...
- 时钟晶振电路EMC设计标准电路详解
- 计算机检索策略制定过程,计算机文献检索的基本方法与策略
- 《黑客与画家:硅谷创业之父Paul Graham文集》----读书笔记
- 小熊派BearPi-HM nano开发板 -- MobaXterm使用详情、VScode连接编译主机、小熊派源码获取及烧录
- 超棒的电烙铁的焊接方法图解
- 地形湿度指数(TWI)获取教程
- python社区微信群_Python 打造微信群聊天机器人(带操作界面)-Go语言中文社区...