使用Ebean ORM有个麻烦的地方,就是每次部署app前,需要enhanceentity类的class文件,所谓enhance,就是加强操作,用于修改实体bean,包括”编织“,”转换“,”字节码操作“等过程。如果没有enhance就使用ebean orm,则ebean会抛出异常。Ebean ORM提供了eclipse插件、idea插件、maven插件、ant等解决方案,虽然没有gradle插件支持,不过好在gradle支持ant任务,通过gradle调用ebean提供的ant target,完成编译后自动enhance操作。

示例源码下载

示例项目我已经放到github了,看源码更直观:
https://github.com/ichenkaihua/spring-ebean

gradle调用ant

gradle调用ant的一般步骤是

  1. 定义一个configuration配置组,就是一个依赖组,和compile,testCompile一个性质。
  2. configuration定义依赖,ant运行时需要依赖这些包。
  3. 使用ant.taskdef闭包定义一个ant task。
  4. 定义一个task,调用步骤3定义的ant。

build.gradle文件:

repositories {
    mavenCentral()
}

configurations{
    ebeanagent
}

dependencies {
    ebeanagent 'org.avaje.ebeanorm:avaje-ebeanorm-agent:4.7.1'
}

ant.taskdef(
        name: "ebeanEnhance",
        classname:"com.avaje.ebean.enhance.ant.AntEnhanceTask",
        classpath:configurations.ebeanagent.asPath

)

def ebeanEnhance = {dir, packages ->
    println dir
    println packages
    println '============================================'
    println '  Enhance ebean classes....' + dir
    println '============================================'
    ant.ebeanEnhance(classSource: dir,
            packages: packages,
            transformArgs: "debug=10")
    println 'Enhance ebean end....................'
}



compileJava.doLast {
    ebeanEnhance(destinationDir, "com.chenkaihua.springebean.entity.*")
}

这里没有定义task调用ant,而是让compileJava之后enhance,这样就保证了自动enhance,相比idea插件等手动enhance方式,省事多了。

小技巧

使用IDEA付费版时,跑server用idea集成工具,比如tomcat,jetty等,此时按照上述解决办法enhance后还是不能跑,报错为com.xxx.entity.User not enhance?,说明entity没有enhance,解决方法如下:

1.打开run configurations:
idea-run-configuration
2.增加build前的gradle task为’compileJava’
idea-run-config-view
idea-run-config-view-add-task-pop
idea-run-config-select-gradle-task
3. 调整顺序
idea-run-config-final

如果是使用grettyjetty等插件部署app,则不需要add这个task。

参考资料