让Studio只保留一份velocity.jarStudio中的很多代码生成,配置文件生成.doc

让Studio只保留一份velocity.jarStudio中的很多代码生成,配置文件生成.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
让Studio只保留一份velocity.jarStudio中的很多代码生成,配置文件生成.doc

让Studio只保留一份velocity.jar Studio中的很多代码生成,配置文件生成,功能向导等都使用了velocity。可能是对Velocity的一些特性没有了解,经常会出现执行模板的时候找不到模板文件。因此很多人的解决办法是在当前插件依赖一个velocity.jar。这样引一起了一个问题:整个Studio中出现很多个velocity.jar,而且这些jar有的版本还不一致,增加了Studio的维护成本。 本文介绍一个让Studio只保有一份velocity.jar的方法,各个插件如果需要使用Velocity都复用同一个jar. 首先新建一个插件cn.ccb.studio.codegen.core,这个插件依赖velocity.jar及相关的jar。其它需要使用Velocity的插件都依赖该插件。 接下来就是最重要的就是要解决模板文件的加载问题,这里提供两种方案。 把所有Velocity的操作都放在cn.ccb.studio.codegen.core插件中,然后再通过该插件提供一组API供其它插件使用。 以下是模板执行器的抽象父类AbstractVelocityTemplateExecuter几个主要方法的实现: execute方法 init方法 以上的初始化信息可以通过扩展点来收集,这样就可以实现不同插件使用不同的类加载器,不同的模板设置。 注意: file.resource.loader.class对应的模板加载器必须是 org.apache.velocity.runtime.resource.loader.ResourceLoader的子类,这个类必须中当前的cn.ccb.studio.codegen.core插件中,这样模板引擎初始化时才能加载到这个类。这里提供一个默认的实现类PluginTemplateResourceLoader,在该类的初始化方法中通过以下方式获取bundleName: bundleName = this.rsvc.getString(CodegenConstants.BUNDLE_NAME); 这样就可以通过Platform.getBundle(bundleName)获取指定插件的Bundle,从而可以获取插件相对路径下的模板资源。 getTemplate方法 其它插件要使用模板时就通过TemplateHelper的executeTemplate方法进行调用 注意: 这里让AbstractVelocityTemplateExecuter持有一个VelocityEngine(在类构造器中直接new出来),用VelocityEngine进行初始化,获取模板,执行模板,而不使用Velocity的静态方法。 原因是Velocity使用的是单例的RuntimeSingleton进行操作,整个过程只有第一次初始化是有效的,如果使用Velocity对不同插件进行操作,会发现第二次执行时Velocity的引擎设置跟第一个插件是一样的。 把ResourceLoader的子类放在codegen.core插件中,其它插件的初始化操作调用该ResourceLoader 这种情况对那些旧的使用Velocity的插件很有用,只需要改少量代码,即可实现复用codegen.core插件中velocity.jar 定义如下接口 定义一个扩展点收集bundleName与接口ITemplateResourceLoader的关系 在调用插件的模板初始化代码中使用新的ResourceLoader 说明: 定义ITemplateResourceLoader的目的是为了方便那些获取InputStream的具体逻辑比较复杂,需要调用到具体插件中的方法的ResourceLoader使用。 如果获取模板的InputStream逻辑简单,可以直接实现ResourceLoader即可。 public String execute(Object source, String templatePath) { if (this.isInit == false) { this.init();// 加载模板(执行n次,但只初始化一次,效率考虑) this.templatePath = templatePath;// 第一次必须先给模板路径赋值 this.template = this.getTempalte(); } this.oldTemplatePath = this.templatePath; if (null == this.template || !StringUtils.equalsIgnoreCase(templatePath, this.oldTemplatePath))

文档评论(0)

youbika + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档