基于Freemarker的eclipse plugin代码生成器插件开发
固定类型的软件写多了,里面总是有一些复制粘贴改变类名改变量的基础文件,相似程度非常高。作为一名程序员,坚持不多写一行重复代码的精神,写了一个Eclipse的代码生成器插件。插件通过在xml文件中配置的变量信息及模版位置、目标文件位置信息,直接生成目标文件,减少了大量的重复工作。
1.建立一个plug-in with a popup menu工程,引入freemarker.jar,配置popup menu的对应文件扩展名为.coding.xml
2.先写核心的文档生成代码,保证使用main函数可调用。核心的内容是按照freemarker的要求写好 模版路径、模板文件名、目标文件路径、目标文件名、文件所使用的字符集、以及包含所有数据的map
public class CodegenUtil { public static void genFile(String templatePath, String templateFileName, String targetPath, String targetFileName, String charset, Map paramMap) throws IOException, TemplateException { File localFile = new File(targetPath, targetFileName); if (!localFile.exists()) { if (!localFile.getParentFile().exists()) localFile.getParentFile().mkdirs(); localFile.createNewFile(); } OutputStreamWriter localOutputStreamWriter = new OutputStreamWriter(new FileOutputStream(localFile), charset); Configuration freemarkerConfigration = new Configuration(); freemarkerConfigration.setDirectoryForTemplateLoading(new File(templatePath)); Template localTemplate = freemarkerConfigration.getTemplate(templateFileName, charset); localTemplate.process(paramMap, localOutputStreamWriter); localOutputStreamWriter.close(); } }
3.写Action调用
public void run(IAction action) { //读取选定的配置文件 IStructuredSelection selection =(IStructuredSelection) this.selection; ConsoleFactory.printToConsole("--------Start Coding--------", true); for(Object element:selection.toList()){ File file = (File)element; String fullpath = file.getLocationURI().getPath(); Map<String, String> params; List<Map<String,String>> templateMapList=new ArrayList<Map<String,String>>(); try { String configfilepath=fullpath.substring(1); ConsoleFactory.printToConsole("...load coding config "+configfilepath, true); params = XmlUtil.getVars(configfilepath); templateMapList=XmlUtil.getTemplates(configfilepath); for(Map<String ,String > templateMap:templateMapList){ String templateFilePath=templateMap.get(XmlUtil.TEMPLATE_PATH); String templateFileName=templateMap.get(XmlUtil.TEMPLATE_NAME); String targetFilePath=templateMap.get(XmlUtil.TARGET_PATH); String targetFileName=templateMap.get(XmlUtil.TARGET_NAME); ConsoleFactory.printToConsole("... ... coding ... "+targetFilePath+"\\"+targetFileName, true); params.put(XmlUtil.TEMPLATE_PATH, templateFilePath); params.put(XmlUtil.TEMPLATE_NAME, templateFileName); params.put(XmlUtil.TARGET_PATH, targetFilePath); params.put(XmlUtil.TARGET_NAME, targetFileName); String charset=params.get(XmlUtil.CHARSET); CodegenUtil.genFile(templateFilePath,templateFileName,targetFilePath,targetFileName,charset,params); } } catch (Exception e) { e.printStackTrace(); } } ConsoleFactory.printToConsole("--------Finish Coding--------", true); }
4.使用System.out.print所打印的东西在插件的运行环境下是不显示的,ConsoleFactory是我写的一个控制台输出类,调用了Eclipse的控制台,主要用来在使用时给出相关的代码生成提示。
public class ConsoleFactory implements IConsoleFactory { private static MessageConsole console=new MessageConsole("",null); static boolean exists=false; @Override public void openConsole() { showConsole(); } private static void showConsole(){ if(console!=null){ IConsoleManager manager=ConsolePlugin.getDefault().getConsoleManager(); IConsole[] existing = manager.getConsoles(); exists=false; for(int i=0;i<existing.length;i++){ if(console==existing[i]){ exists=true; } } if(!exists){ manager.addConsoles(new IConsole[]{console}); } } } public static void closeConsole(){ IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager(); if(console!=null){ manager.removeConsoles(new IConsole[]{console}); } } public static MessageConsole getConsole(){ showConsole(); return console; } public static void printToConsole(String message , boolean activate){ MessageConsoleStream printer = ConsoleFactory.getConsole().newMessageStream(); printer.setActivateOnWrite(activate); printer.println(message); } }
5.主要内容完毕。使用时先配好xml文件,如下示例。在Eclipse中选中.coding.xml文件,右键菜单 [代码生成器]-->[生成代码]
<?xml version="1.0" encoding="utf-8" ?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <variables> <variable name="developer" value="PennPeng" /> <variable name="charset" value="utf-8" /> <variable name="class" value="CodeGen" /> <variable name="name" value="姓名" /> <variable name="age" value="年龄" /> </variables> <templates> <template> <variable name="templatepath" value="E:\CodeGenTest\template" /> <variable name="templatename" value="a.ftl" /> <variable name="targetpath" value="E:\CodeGenTest" /> <variable name="targetname" value="CodeGen.java" /> </template> <template> <variable name="templatepath" value="E:\CodeGenTest\template" /> <variable name="templatename" value="b.ftl" /> <variable name="targetpath" value="E:\CodeGenTest" /> <variable name="targetname" value="CodeGen2.java" /> </template> </templates> </config>
还有很多需要扩展完善的地方,比如数据库的自动支持、各类型文档的生成。
项目地址 https://github.com/buaawp/codegen
基于Freemarker的eclipse plugin代码生成器插件开发的更多相关文章
- 基于 SWTBot 进行 Eclipse GUI 自动化测试
背景简介 在软件开发领域,持续集成和部署对于软件测试自动化提出了越来越高的要求,基于 Eclipse 应用在这一需求中仍然占据重要的组成部分.目前主流的测试自动化工具主要以录制回放的功能为主,辅助以脚 ...
- Hadoop 1.1.2 eclipse plugin 编译 win7 集成
Windows平台上使用ANT编译Hadoop Eclipse Plugin 一.准备工作: 1.安装JDK 下载页面:http://www.oracle.com/technetwork/java ...
- Peer Code Reviews Made Easy with Eclipse Plug-In
欢迎关注我的社交账号: 博客园地址: http://www.cnblogs.com/jiangxinnju/p/4781259.html GitHub地址: https://github.com/ji ...
- freemarker编辑器eclipse插件
freemarker编辑器eclipse插件 支持语法高亮,语法校验,代码提示的工具 freemarker IDE(JBoss): http://download.jboss.org/jbossto ...
- GWT(Google Web Tookit) Eclipse Plugin的zip下载地址(同时提供GWT Designer下载地址)
按照Eclipse Help->Install new software->....(这里是官方安装文档:http://code.google.com/intl/zh-CN/eclipse ...
- Installing the Eclipse Plugin
Installing the Eclipse Plugin Android offers a custom plugin for the Eclipse IDE, called Android Dev ...
- Eclipse Plugin Dev Materials
以下资料是本人在开发Eclipse 插件时候收集的一些比较有用的资料Link,和大家分享下. 比较权威的资料: Helpful Eclipse Plugin Websites: Eclipse Art ...
- Eclipse plugin web site 发布和版本更新
Eclipse plugin web site 发布和版本更新 在eclipse插件开发过程中免不了要发布1.0, 1.1, 1.2…….等等,随着版本的递增,假如每次都发布一个插件zip包,那使用者 ...
- eclipse plugin 导出插件包
当我们的插件在完成一个阶段性开发的时候,我们要发布一个1.0的版本.这个时候会碰到一个问题.如何把我们的插件打成包?有多种途径,下面具体讨论一下. 首先从插件完成到被他人(或者我们自己)使用有两个步骤 ...
随机推荐
- linux 服务启动
在linux上部署java服务的时候,发现服务启动正常,但是[ps -ef|grep java].[jps]看不到服务的运行. 查资料发现,[Java -jar Test.jar & ...
- ~ManancherQwQ
例题传送门 好久没写博客了,写一发. 之前学的Manacher算法拿到模板题找到那最后一个点的错误了,TMD没开long long. Manachar算法主要是处理字符串中关于回文串的问题的,它可以在 ...
- 16-[JavaScript]-ECMAScript 2
1.流程控制:if switch <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...
- 使用Keil下载单独的Hex文件到单片机内
前言 初学STM32时,是通过串口1把Hex文件下载进STM32的,需要一个串口模块,而且还要设置BOOT0和BOOT1电平,然后通过FlyMcu软件进行下载,这也是一种不错的方法,这里我要介绍的是使 ...
- python实战——教你用微信每天给女朋友说晚安
但凡一件事,稍微有些重复.我就考虑怎么样用程序来实现它. 这里给各位程序员朋友分享如何每天给朋友定时微信发送”晚安“,故事,新闻,等等··· ··· 最好运行在服务器上,这样后台挂起来更方便. 准备 ...
- (转)为什么所有浏览器的user-agent都是Mozilla
最早的时候有一个浏览器叫NCSA Mosaic,把自己标称为NCSA_Mosaic/2.0 (Windows 3.1),它支持文字显示的同时还支持图片,于是Web开始好玩起来. 然后出现了一个新的网页 ...
- XAF-如何实现自定义权限系统用户对象
本示例使用XPO. 新建一个XAF项目.填加两个类进来: [DefaultClassOptions] public class Employee : Person { public Employe ...
- Google 日历短信通知没有了
关于 Google 日历短信通知的重要通知 从 2015 年 6 月 27 日起,Google 日历将不再发送短信通知.短信通知是我们在智能手机问世之前推出的功能.如今,智能手机和通知随处可见,即使处 ...
- JMeter的__threadGroupName使用注意事项
JMeter从4.1版本开始引入了一个新函数"${__threadGroupName}",这个函数的作用是返回当前线程组的名字.${__threadGroupName}的用途也较为 ...
- 解决ScrollViewer嵌套的DataGrid、ListBox等控件的鼠标滚动事件无效
C# 中,两个ScrollViewer嵌套在一起或者ScrollViewer里面嵌套一个DataGrid.ListBox.Listview(控件本身有scrollviewer)的时候,我们本想要的效果 ...