groovy 热部署

groovy 可以实现热部署。下面对groovy的初次使用进行简单记录。

1.引入groovy依赖包

<dependency>
   <groupId>org.codehaus.groovy</groupId>
   <artifactId>groovy-all</artifactId>
   <version>2.4.3</version>
</dependency>

2.groovy类加载器,在调用groovy前,要进行groovy加载。如果groovy文件被修改,或者替换,需要重新加载groovyClassKiader,否则新的groovy内容不会生效

private static GroovyClassLoader groovyClassLoader = null;

public static void initGroovy() {
    CompilerConfiguration compilerConfig = new CompilerConfiguration();
    compilerConfig.setSourceEncoding("UTF-8");
    groovyClassLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader(), compilerConfig);
}

3.从java类中调用groovy, File指向.groovy文件

public List<PlatformMatch>  test(Map<String,Object>param, String exceptOrgs ){
    initGroovy();//每调用一次该方法就重新加载一遍也不太好,可以开放个接口出去,当groovy有修改的时候再调用
    List<PlatformMatch> list = new ArrayList<PlatformMatch>();

    //groovy 的定制化查询,
    File groovyFile = new File(NativePath.get("groovy")+"/"+param.get("orgId")+".groovy");
    if (!groovyFile.exists()) {
        groovyFile = new File(NativePath.get("groovy")+"/Common"+".groovy");
    }

    String result = "";
    try {
        // 获得GroovyShell_2加载后的class
        Class<?> groovyClass = groovyClassLoader.parseClass(groovyFile);
        // 获得GroovyShell_2的实例
        GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
        // 反射调用sayHello方法得到返回值

        param.put("platFormMapper",platFormMapper);
        param.put("exceptOrg",ToolString.conventString(exceptOrgs.toString()));
        list = (List<PlatformMatch>)groovyObject.invokeMethod("customize",param);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
    return list;
}

4编写groovy文件里的内容。创建来.groovy文件,编辑方式与java一样,所有的java基础类都可以在groovy文件中使用。groovy文件可以放在任何地方。只要文件路径能找到就可以,当然要兼顾将来能够在服务运行中也能修改或者替换groovy文件,所以将groovy文件放到配置文件的路径下了。而不是放在类路径下。

public List<PlatformMatch>  customizePlatform (Map<String,Object>param, String exceptOrgs ){
    initGroovy();
List<PlatformMatch> list = new ArrayList<PlatformMatch>();
//groovy 的定制化查询
File groovyFile = new File(NativePath.get("groovy")+"/"+param.get("orgId")+".groovy");
    if (!groovyFile.exists()) {
        groovyFile = new File(NativePath.get("groovy")+"/Common"+".groovy");
}

    String result = "";
    try {
        // 获得GroovyShell_2加载后的class
Class<?> groovyClass = groovyClassLoader.parseClass(groovyFile);
// 获得GroovyShell_2的实例
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
// 反射调用sayHello方法得到返回值
param.put("platFormMapper",platFormMapper);
param.put("exceptOrg",ToolString.conventString(exceptOrgs.toString()));
list = (List<PlatformMatch>)groovyObject.invokeMethod("customize",param);
} catch (Exception e) {
        e.printStackTrace();
        return null;
}
    return list;
}
扫描二维码关注公众号,回复: 295845 查看本文章

 5.groovy 文件在打包发布时会被maven过滤掉。解决方法

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-antrun-plugin</artifactId>
   <version>1.7</version>
   <executions>
      <execution>
         <id>prepare-groovy-copy</id>
         <phase>generate-resources</phase>
         <goals>
            <goal>run</goal>
         </goals>
         <configuration>
            <tasks>
               <copy todir="target/groovy"
overwrite="true">
                  <fileset dir="src/main/resources/groovy">
                     <include name="*.groovy" />
                  </fileset>
               </copy>
            </tasks>
         </configuration>
      </execution>
   </executions>
</plugin>

猜你喜欢

转载自e-e.iteye.com/blog/2351873