ROR之所以开发效率比java高,除了语法的简洁和框架本身强大的功能之外,程序员不必反复的重启服务也是重要原因之一。JavaRebel 给Java带来了Ruby和PHP风格的动态重新装载类特性。虽然现在还有些局限性,但它可以显著地增加开发速度。JavaRebel允许一个应用程序(独立的或运行在应用服务器上的应用)重新装载在运行过程中发生的大多数类变化,包括增加或删除方法和域。JavaRebel可以帮助java实现快速反馈循环,使得JavaEE开发像ROR、PHP一样方便。
使用
Javarebel是一个Jvm插件,使用非常简单,只需要两步:
- 将javarebel.jar加入classpath(不建议将javarebel.jar放在WEB-INF/lib下,因为生产环境不需要它)
- 命令行中加入下面的启动参数
java -noverify -javaagent:C:/libraries/javarebel.jar -Drebel.dirs=c:/workspace/project/classes
Drebel.dirs指向工程中.class文件的目录,不必指定具体的类名。另外,javarebel.jar的名字不能修改。
感受
用了一个月,总得感觉是javarebel很好很强大,大约减少了80%的重启时间。很多时候都不要debug了,直接修改,然后刷新页面(ajax的话,都不用刷)就可以看到效果。以前因为担心Jboss等支持EJB3的container启动慢而没有使用seam这个强劲的框架,现在可以试试了。
Javarebel使用了动态代理,调试的时候会出现很多奇怪的类名,有点乱,不过这并不影响调试,反正spring、hibernate之类的也用了动态代理,乱就乱吧。
问题
在修改配置文件的时候仍然需要重新启动,幸好比起修改代码我们很少修改配置文件,随着Annotation的使用,这种修改配置的情况会越来越少。Javarebel会对性能产生影响,所以在性能测试和生产环境中不要使用。它会影响启动速度,但是开发中我们使用jetty,因为jetty的启动非常快,所以javareble的影响基本感觉不到。