java工程自动生成的模板实现

简介: 背景 九月份的最后一天抽空跟公司的java大神聊了会天,发现每天跟大神们聊天总能收获很多思路,想想接受了大神那么多的指点,就把他的一点小技巧分享出来。 这次介绍的是JAVA 工程自动通过工具生成标准工程,按照指定步骤生成整个项目工程,解决每次新建项目工程相互拷贝的问题,我也是在用了一次以后发现这个功能很好,就去找原作者请教了一下,因而有了这篇文章用以致敬原作者。

背景

 九月份的最后一天抽空跟公司的java大神聊了会天,发现每天跟大神们聊天总能收获很多思路,想想接受了大神那么多的指点,就把他的一点小技巧分享出来。

 这次介绍的是JAVA 工程自动通过工具生成标准工程,按照指定步骤生成整个项目工程,解决每次新建项目工程相互拷贝的问题,我也是在用了一次以后发现这个功能很好,就去找原作者请教了一下,因而有了这篇文章用以致敬原作者。


效果展示

 我们使用的微服务是基于阿里开源的dubbo框架,整个项目的目录结构如下图所示。如下图中我们生成了一个promotion的dubbo项目工程,当然我们也可以生成其他额外的项目工程,只需要修改工程名字(如trade、member等)即可。只需执行命令:java -jar service-eve.jar app XXXX //xxxx 您的服务工程名字 比如:promotion member

img_05cba914933e886a0eeb80359e786801.png
工程目录结构

 通过反编译service-eve.jar了解了下内部是如何实现上述功能的,先看下整个功能实现的目录结构。

1、项目工程目录

img_e3bea0e29c240c22968af8c4ef06d593.png
工程自动生成模板

说明:

  • ServiceEve.java文件作为入口函数解析命令
  • template作为工程模板存在,内部是一个完整的dubbo工程项目
  • appServiceName作为关键字后面由希望生成的工程命令进行替换

2、模板内部java类实现

img_53070e1b05187d19f7ddda4782a80f7f.png
代码内容

说明:

  • 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我很服海军,上述实现也是海军的杰作,让我也开了眼界

目录
相关文章
|
存储 Java
Dijkstra最短路径(Java)(详细+模板)
Dijkstra最短路径(Java)(详细+模板)
320 4
|
机器学习/深度学习 算法 Java
全排列(分治)(Java语言 +全排列模板)
全排列(分治)(Java语言 +全排列模板)
194 2
|
搜索推荐 Java 数据库连接
Java|在 IDEA 里自动生成 MyBatis 模板代码
基于 MyBatis 开发的项目,新增数据库表以后,总是需要编写对应的 Entity、Mapper 和 Service 等等 Class 的代码,这些都是重复的工作,我们可以想一些办法来自动生成这些代码。
615 6
|
算法 Java Linux
java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。
1136 1
|
Java
Java PDF模板生成PDF
Java PDF模板生成PDF
472 1
|
小程序 Java
【aspose-words】Aspose.Words for Java模板语法详细剖析
本文通过详细分析Aspose.Words for Java模板语法,介绍了使用条件块、变量和动态合并表格单元格三个常用模板标签,并结合实际案例进行演示。通过这三个标签的实操,帮助读者更好地掌握Aspose.Words的使用技巧。此外,还提供了官方文档链接以便进一步学习。
750 0
【aspose-words】Aspose.Words for Java模板语法详细剖析
Java系列之 IDEA 为类 和 方法设置注解模板
这篇文章介绍了如何在IntelliJ IDEA中为类和方法设置注解模板,包括类模板的创建和应用,以及两种不同的方法注解模板的创建过程和实际效果展示,旨在提高代码的可读性和维护性。
|
Java Android开发
如何使用IDEA创建一个简单的java工程?
这篇文章提供了使用IntelliJ IDEA创建简单Java工程的步骤,包括在`src`目录下建立两个特定的包。
如何使用IDEA创建一个简单的java工程?
|
存储 Java 应用服务中间件
Java中套路和实现问题之基于组合/模板的套路常见框架中的应用有什么
Java中套路和实现问题之基于组合/模板的套路常见框架中的应用有什么
|
小程序
java--微信小程序发送模板消息
java--微信小程序发送模板消息
764 0