写一个代码生成器的心路历程,和一个只需要一天就能完成的代码生成器maven插件源码
为什么要写一个代码生成器
在写后端项目的时候,基础的实现功能都是增删查改,通常以表或者指定的数据模型为单位进行增删查改。
在大部分的Web项目中,通常写一个增删查改需要新建很多个基础类。
假设你的项目是由 控制层、服务层、数据访问层组成,那么如果新增一个表的增删查改功能,我们就也许需要针对这个表创建以下这些类。
Model.java ModelController.java IModelService.java ModelService.java IModelDao.java ModelDao.java
创建完成后,某些项目结构是有通用的基础类,可能还需要根据Model类型来添加泛型,这样又是需要一顿复制粘贴的操作。
interface IModelService extends IBaseService<Model,Long> {} class ModelService extends BaseService<Model,Long> implements IModelService {} interface IModelDao extends IBaseDao<Model,Long> {} class ModelDao extends BaseDao<Model,Long> implements IModelDao {}
当然每个公司的项目结构都不同,以上操作可能有多有少,但是对于一个后台系统来说,大量类似的增删查改类是少不了的。 如果你的项目结构是无规律的,那么代码生成器可能不太适合你
代码生成器的级别
- 复制粘贴型代码生成器
顾名思义,最简单也是用的最多的方式,直接将现有的其他类似文件复制一份,改一改关键信息即可。成本最低,耗时根据项目需要复制的文件决定。有可能因为少改某些内容导致代码异常。
总的来说,通过复制粘贴的方式来生成代码,简单易用,无学习成本,但是比较容易出错,有一定修改成本,耗时和文件数量、修改内容成正比。
-
框架自带代码生成器
通常和框架绑定,对于已有的系统难以植入,局限性高。生成的代码格式较为单一,很难做灵活配置化使用。 -
自定义代码生成器
因为大部分系统的代码结构比较统一,但又有些不同,所以在市场上没有适合自己的生成器的时候,我们就会选择自己写一个,通过直接执行main
方法来生成文件,定义几个参数,在需要生成的时候进行修改执行。
本文介绍的代码生成器主要在此基础上进行扩展,通过maven插件的方式,将需要自定义的参数通过插件配置来运行,这样一套代码多地使用,只需要添加maven依赖,不需要将生成器的代码复制多遍难以维护。
自定义代码生成器maven插件
代码生成器的原理,大体就是根据指定的模板,传入动态的参数,替换模板内容,动态生成不同的文件代码。
通过maven插件的方式,可以很好的集成到我们的项目中,只需要添加插件依赖,然后添加几个配置,执行maven相关命令,就可以完成代码生成的操作。
这是我在工作当中为了给组员提供更优质的开发体验,而编写的一款代码生成器。
-
simple-codegen
使用freemarker作为模板引擎,结合maven插件,使参数配置简单化, 并且多项目使用只需要添加插件依赖,并且修改制定参数,定制好模板,即可一键生成代码。 -
因为模板可以根据项目自定义,基本所有情况下,只需要定义好模板,配置参数,即可开始使用
-
目前的参数都算是固定参数,未来可能还将支持一些动态参数例如:
- 读取表结构作为参数
- 直接调用接口, 获取返回值作为参数
- 直接调用本地代码,获取返回值作为参数
代码实现细节讲解
- 代码真的很简单,目前总共就一个模板渲染的功能,大家可以自行看源码,不懂的可以提Issue, 有优化可以提 Pull Request
上传至中央仓库教程
我真是边写教程边上传,真正的一手实操经验
1. 申请中央仓库账号
- 进入 https://issues.sonatype.org
- 点击 Sign up 创建账号
- 新建一个问题类型为New Project的, 注意Group Id和自己项目pom.xml要一致,如果是自己的域名,需要有域名DNS管理权限,因为仓库管理员会要求你添加TXT记录指向指定地址。如果没有自己的域名,可以用自己的Github地址,管理员会要求你创建一个指定名称的仓库
- 提交申请完成后,管理员就会通知你用户已经可以上传快照版本或者发布版本了
前期注册工作就完成了,接下来是上传流程,接下来流程用到的用户名密码使用刚刚创建的用户名密码
2. pom.xml 修改和 settings.xml 配置
- 在本地maven配置
settings.xml
内添加自己的账号密码(上传需要), id可以自定义。账号密码可以明文输入,也可以登陆 https://oss.sonatype.org 点击右上角用户名进入Profile
, 然后选择User Token
创建一个加密的Access User Token
, 可以替换settings.xml
内的账号密码,这样可以避免明文保存用户名密码
<servers> <server> <id>sonatype-center</id> <username>youRegisterUsername</username> <password>youRegisterPassword</password> </server> </servers>
- 在
pom.xml
内添加远程发布仓库地址,注意id需要和settings-xml
配置的一致
<distributionManagement> <repository> <id>sonatype-center</id> <name>releases repo</name> <url>https://oss.sonatype.org/service/local/staging/deploy/maven2</url> </repository> <snapshotRepository> <id>sonatype-center</id> <name>snapshots repo</name> <url>https://oss.sonatype.org/content/repositories/snapshots</url> </snapshotRepository> </distributionManagement>
pom.xml
文件内容如要标准化,需要添加以下标签描述,内容自定义,已添加请忽略,可参考 pom.xml
<name>simple-codegen</name> <url>https://diamondfsd.com</url> <description> simple code generate maven plugin. Template rendering through Java and freemarker. </description> <developers> <developer> <id>diamondfsd</id> <name>Diamond Zhou</name> <email>diamondfsd@gmail.com</email> <url>https://diamondfsd.com</url> <timezone>8</timezone> </developer> </developers> <licenses> <license> <name>The MIT License</name> <url>https://opensource.org/licenses/MIT</url> <distribution>repo</distribution> </license> </licenses> <scm> <url> https://github.com/k55k32/simple-codegen.git </url> </scm>
3. 文件签名 (不签名无法发布)
- 签名教程
- windows版本密钥生成工具下载: https://gpg4win.org/download.html
安装完成后的名字叫: Kleopatra
打开后,新建一个密钥对,创建完成后。
注意如果是在IDE等环境中运行maven,安装完Kleopatra需要重启IDE,否则环境变量未生效,执行maven插件的时候,找不到 gpg
命令
pom.xml
添加插件配置
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> <version>1.5</version> <executions> <execution> <id>sign-artifacts</id> <phase>verify</phase> <goals> <goal>sign</goal> </goals> </execution> </executions> </plugin>
4. 到中央仓库发布
- 执行
mvn clean deploy
上传到中央仓库 - 登陆 https://oss.sonatype.org/ 点击左侧
Staging Repositoryies
菜单,然后下拉到最下面,可以找到你刚刚上传的包 - 选中改包点击
Close
Close
完成后,点击Release
(如果Close失败, 点击项目,可以在底部Activity内看到失败原因,根据原因自行解决)Release
完成后,你的包就进入了中央仓库同步队列了,同步完成后,其他人就可以直接在pom.xml
内添加你的包依赖了,具体的同步时间,官方给出的是10分钟内会同步到中央仓库,可以引用依赖。然后2小时内同步到搜索引擎,可以在 https://search.maven.org 搜索到。
更多经验分享欢迎大家关注我的个人博客: https://diamondfsd.com
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
使用 Quarkus/GraalVM 将 JGroups 编译成可执行文件
本文翻译自:http://belaban.blogspot.com/2019/07/compiling-jgroups-to-native-code-with.html 我很高兴的宣布Quarkus官方发布 JGroups 的扩展! What? Quarkus 是一个将 Java 代码编译为本机代码(使用GraalVM)并删除运行时不需要的代码的框架。 Quarkus 在构建阶段分析代码,并删除在运行时未使用的代码,以便拥有一个可以快速启动的小型可执行文件。不过这意味着无法在运行时使用反射,因为在构建时删除了所有未使用的类。 但是,可以在构建时使用反射。 影响 JGroups 的其他限制是线程和套接字的创建。 两者都无法在构建时完成,但必须在运行时完成。 那么为Quarkus提供JGroups扩展的重点是什么呢? 虽然JGroups应用程序可以直接编译为本机代码(使用GraalVM的本机映像),但它很麻烦,并且必须重新构建应用程序以适应本机编译的限制。 相反,JGroups 扩展提供了一个可以注入应用程序的JChannel。 已根据配置文件创建通道,并通过扩展连接(=加入群集)。 扩展...
- 下一篇
(4) 基于领域分析设计的架构规范 - 充血模型之实体
本系列目录: 改变与优势 领域分析基础 读写隔离 充血模型之实体 充血模型之Service 关于重构与落地 读写隔离后的世界 基于上面提到的读写隔离的思想,那么我们可以很清楚地看到上面这种情况可以看到: 查询业务,从入口层(如Controller),调用Finder,而Finder调用Repository(具体实现如Hiberante,Mybatis等等均可),这一条线下来,我们全然不用考虑这个系统的增删改就是如何做的,就像他们完全处于不同的空间一样,互不干涉,互不影响,甚至,永远互不相见。 某种程度上来说,这种这种架构追求的效果,一种美感。 所以,接下来,我们关注的,就是增删改这一部分了,也就是命令操作 是开始要扎扎实实地来对这个系统进行修改了 首先让我们把视野抬高一些,从整个项目产品的上空来看看 业务灵魂-状态图 除开少数非常扁平的纯技术服务项目(比如AI识别,文本分析等等),其他绝大部分企业项目都有其核心的商业逻辑,而这些逻辑,往往也会以核心的领域概念来提现,从简单粗暴一点角度映射到设计开发中,那就是类class 电商系统,核心领域至少有【商品】,【订单】,【用户】,【物流】等;...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- Mario游戏-低调大师作品
- MySQL8.0.19开启GTID主从同步CentOS8
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS关闭SELinux安全模块