java工程自动生成的模板实现
背景
九月份的最后一天抽空跟公司的java大神聊了会天,发现每天跟大神们聊天总能收获很多思路,想想接受了大神那么多的指点,就把他的一点小技巧分享出来。
这次介绍的是JAVA 工程自动通过工具生成标准工程,按照指定步骤生成整个项目工程,解决每次新建项目工程相互拷贝的问题,我也是在用了一次以后发现这个功能很好,就去找原作者请教了一下,因而有了这篇文章用以致敬原作者。
效果展示
我们使用的微服务是基于阿里开源的dubbo框架,整个项目的目录结构如下图所示。如下图中我们生成了一个promotion的dubbo项目工程,当然我们也可以生成其他额外的项目工程,只需要修改工程名字(如trade、member等)即可。只需执行命令:java -jar service-eve.jar app XXXX //xxxx 您的服务工程名字 比如:promotion member。
通过反编译service-eve.jar了解了下内部是如何实现上述功能的,先看下整个功能实现的目录结构。
1、项目工程目录
说明:
- ServiceEve.java文件作为入口函数解析命令
- template作为工程模板存在,内部是一个完整的dubbo工程项目
- appServiceName作为关键字后面由希望生成的工程命令进行替换
2、模板内部java类实现
说明:
- java类内部的实现会涉及到项目的package名称,所以需要进行替换
- 内部通过占位符${appServiceName}先占用,后期进行替换
- java类的占位符通过velocity模板进行替换
代码实现
public class ServiceEve { public static void main(String[] args) throws IOException { if ((args == null) || (args.length < 2)) { System.exit(0); } if (args[0].equals("app")) { genServiceTemplate(args[1]); } else { System.exit(0); } } public static void genServiceTemplate(String appServcieName) { try { // 获取当前jar包的文件内容,因为整个模板在jar包的template目录当中 JarFile jar = new JarFile("service-eve.jar"); Enumeration<JarEntry> re = jar.entries(); // 遍历jar包中的所有文件,针对在template目录下的文件进行处理 while (re.hasMoreElements()) { String name = ((JarEntry)re.nextElement()).getName(); if (name.contains("template/")) { if (!name.endsWith("/")) { // 读取template目录下的文件,通过非/结尾来判断是否为文件 List<String> lines = IOUtils.readLines(ServiceEve.class.getClassLoader().getResourceAsStream(name), "UTF-8"); String targetFile = new File(".").getAbsolutePath() + "/" + name; // 替换appServiceName为项目工程名 targetFile = targetFile.replaceAll("appServiceName", appServcieName); // 替换文件内容并写到文件当中 merge(lines, targetFile, appServcieName); } } } System.out.println("done!"); } catch (Exception e) { e.printStackTrace(); } } public static void merge(List<String> contents, String targetFile, String appServcieName) { try { // 文件的内容合并到StringBuffer当中 StringBuffer sb = new StringBuffer(); for (String content : contents) { sb.append(content).append("\n"); } // 通过velocity模板引擎替换文件内容的占位符 VelocityEngine ve = new VelocityEngine(); ve.init(); VelocityContext context = new VelocityContext(); context.put("appServiceName", appServcieName); StringWriter writer = new StringWriter(); // 模板引擎替换占位符,并将内容写入文件当中 ve.evaluate(context, writer, "", sb.toString()); FileUtils.writeStringToFile(new File(targetFile), writer.toString(), "UTF-8"); } catch (Exception e) { e.printStackTrace(); } } }
说明:
- 源码实现中读取service-eve.jar并开始遍历模板工程/template目录
- 第一步替换文件路径当中的appServiceName为新建项目的项目名
- 第二步替换java源码文件中的占位符为新建项目的项目名
- 核心思路在于读取jar包内容替换目录和内容,内容需要通过velocity引擎进行文本替换
结语
论java我很服海军,上述实现也是海军的杰作,让我也开了眼界
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
PostgreSQL 10.1 手册_部分 I. 教程
部分I.教程 欢迎来到PostgreSQL教程。下面的几章将为那些新接触PostgreSQL、关系数据库概念和 SQL 语言的读者给出一个简单介绍。我们只假定读者拥有关于如何使用计算机的一般知识。读者不需要特殊的 Unix 或编程经验。这一部分主要希望给你一些关于PostgreSQL系统的重要方面的手把手的体验。我们并不准备把它写成一份能覆盖这些主题所有内容的文档。 当你完成了这份教程之后,你可能希望继续去阅读第II部分来得到 SQL 语言更正式的知识,或者阅读第IV部分来了解如何开发PostgreSQL应用程序。希望搭建并且管理自己的服务器的用户还应该阅读第III部分。 目录 1. 从头开始 1.1. 安装 1.2. 架构基础 1.3. 创建一个数据库 1.4. 访问数据库 2.SQL语言 2.1. 引言 2.2. 概念 2.3. 创建一个新表 2.4. 在表中增加行 2.5. 查询一个表 2.6. 在表之间连接 2.7. 聚集函数 2.8. 更新 2.9. 删除 3. 高级特性 3.1. 简介 3.2. 视图 3.3. 外键 3.4. 事务 3.5. 窗口函数 3.6. 继承 3....
- 下一篇
程序员到了 35 岁,还能找到工作吗?
国庆闲聊,程序员真的吃青春饭吗? 由于互联网的蓬勃发展,科技技术的不断迭代更新,中国的互联网行业已经步入的世界的前列,因为,我们常常能看到,在各种各样的报道中,程序员都会誉为未来最有发展潜力的职业之一。 看看现在流行的大数据,看看现在火热的AI,引导万物互联的物联网。 所有的这一切,都需要一个职业来实现,那就是程序员。 程序员的生命周期 但是由于程序员工作的特性,可能从30岁开始,很多人就已经花白头发,可能除了考虑那些复杂的业务逻辑实现以外,就是考虑未来的路应该如何前进了。 看看下面这个曲线,可能很多行业都是这样,到了一定的年龄,人的价值体现就开始慢慢的下降了,只是程序员的时间更短一点。 因此,在34岁左右,差不多就是一个程序员的巅峰了,越往后,这个程序员的价值就越低。 这一现象不光是出现在中国,在硅谷也一样。 相信大家都听过61岁的Java之父James Gosling找不到工作的新闻。 如何延长程序员的生命周期 1、写好代码 写好代码,是我们工作的本分,所以,写代码就是程序员的实践,我们需要写代码的过程中,明白什么是优秀的代码,什么是垃圾代码,然后让自己的代码易读易懂,高效,无错。...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS8编译安装MySQL8.0.19
- Docker安装Oracle12C,快速搭建Oracle学习环境