jrebelWord下载.docx
《jrebelWord下载.docx》由会员分享,可在线阅读,更多相关《jrebelWord下载.docx(19页珍藏版)》请在冰豆网上搜索。
如果你的工程的Spring已经是注释的方式,那就比较顺利,装好插件后,绝大部分情况下都能使用热布署了。
如果你不是使用注释方式,那就麻烦了,要么全都改成注释方式,要么Jrebel对spring作用有限,看你自己的选择了。
下面把已知Jrebel不能成功的热布署的情况作一列举:
1、替换了父类。
2、增加或删除了继承的接口。
3、Spring布署文件修改(如果改成注释方式,实际上spring只剩个别固定的第三方包的beans描述,比如数据库链接等)
4、web.xml,虽然jrebel和tomcat都支持web.xml修改的热布署,但是如果项目比较复杂,初始化工作较多的话,还是直接重起吧,直接热布署意义不大,而且重复初始化对于某些业务来说是会报错,所以建议有较复杂的初始化项目来说,还是直接重起算得了。
Jrebel安装和使用
1、jrebel是商用软件,而且价格不扉,去下载个破解版吧,最新的破解版是4.0,如果网上找不到,请留下邮件。
下载jrebel.jar到本地,比如放在d:
\jrebel.jar
2、Eclipsewindow->
preference->
tomcat->
JVMSettings,加入以下参数
-Drebel.spring_plugin=true支持spring框架
-Drebel.aspectj_plugin=true支持aspectj
-Drebel.struts2_plugin=true支持strut2
-javaagent:
D:
\jrebel.jar这里自行修改jrebel.jar正确的路径
-noverify
如果你要支持更多的框架,可以参考官网
如果你要了解更多的参数配置,可以参考官网
jrebel支持监控多个目录下的classes、配置文件、jar包是否被修改,因此建议新建并配置rebel.xml文件,如果Eclipse安装了官网的jrebelplugin,那么可以从eclipse菜单里产生rebel.xml文件。
以下是rebel.xml的简单手动配置:
<
?
xmlversion="
1.0"
encoding="
UTF-8"
>
application
xmlns:
xsi="
http:
//www.w3.org/2001/XMLSchema-instance"
xmlns="
"
xsi:
schemaLocation="
<
classpath>
dirname="
E:
\projects\cmac\target\classes"
/>
\projects\cmac\target\test-classes"
/classpath>
web>
linktarget="
/"
\projects\cmac\src\main\webapp"
/link>
/web>
/application>
rebel.xml更详细配置说明参考官网(
3、此时启动tomcat,会发现如下错误信息
严重:
ExceptionstartingfilterStruts2
java.lang.NoClassDefFoundError:
Lorg/apache/velocity/app/VelocityEngine;
atjava.lang.Class.getDeclaredFields0(NativeMethod)
atjava.lang.Class.privateGetDeclaredFields(Class.java:
2291)
atjava.lang.Class.getDeclaredFields(Class.java:
1743)
atcom.opensymphony.xwork2.inject.ContainerImpl.addInjectors(ContainerImpl.java:
102)
atcom.opensymphony.xwork2.inject.ContainerImpl$1.create(ContainerImpl.java:
84)
82)
atcom.opensymphony.xwork2.inject.util.ReferenceCache$CallableCreate.call(ReferenceCache.java:
155)
atjava.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:
303)
atjava.util.concurrent.FutureTask.run(FutureTask.java:
138)
atcom.opensymphony.xwork2.inject.util.ReferenceCache.internalCreate(ReferenceCache.java:
81)
atcom.opensymphony.xwork2.inject.util.ReferenceCache.get(ReferenceCache.java:
121)
atcom.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector.<
init>
(ContainerImpl.java:
333)
atcom.opensymphony.xwork2.inject.ContainerImpl$5.create(ContainerImpl.java:
299)
298)
atcom.opensymphony.xwork2.inject.ContainerImpl.getConstructor(ContainerImpl.java:
578)
atcom.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:
476)
atcom.opensymphony.xwork2.inject.ContainerImpl$7.call(ContainerImpl.java:
517)
atcom.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:
565)
515)
atcom.opensymphony.xwork2.config.impl.LocatableFactory.create(LocatableFactory.java:
32)
atcom.opensymphony.xwork2.inject.ContainerBuilder$4.create(ContainerBuilder.java:
135)
atcom.opensymphony.xwork2.inject.Scope$2$1.create(Scope.java:
49)
atcom.opensymphony.xwork2.inject.ContainerImpl$ParameterInjector.inject(ContainerImpl.java:
447)
atcom.opensymphony.xwork2.inject.ContainerImpl.getParameters(ContainerImpl.java:
462)
atcom.opensymphony.xwork2.inject.ContainerImpl.access$000(ContainerImpl.java:
48)
atcom.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.inject(ContainerImpl.java:
288)
atcom.opensymphony.xwork2.inject.ContainerImpl$2.call(ContainerImpl.java:
117)
115)
558)
atcom.opensymphony.xwork2.inject.ContainerImpl.injectStatics(ContainerImpl.java:
114)
atcom.opensymphony.xwork2.inject.ContainerBuilder.create(ContainerBuilder.java:
495)
atcom.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:
170)
atcom.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:
55)
atorg.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:
371)
atorg.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:
424)
atorg.apache.struts2.dispatcher.FilterDispatcher.init(FilterDispatcher.java:
213)
atorg.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:
273)
atorg.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:
254)
atorg.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:
372)
atorg.apache.catalina.core.ApplicationFilterConfig.<
(ApplicationFilterConfig.java:
98)
atorg.apache.catalina.core.StandardContext.filterStart(StandardContext.java:
4562)
atorg.apache.catalina.core.StandardContext$2.call(StandardContext.java:
5240)
5235)
atjava.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:
886)
atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:
908)
atjava.lang.Thread.run(Thread.java:
619)
Causedby:
java.lang.ClassNotFoundException:
org.apache.velocity.app.VelocityEngine
atorg.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:
1676)
1521)
atjava.lang.ClassLoader.loadClassInternal(ClassLoader.java:
316)
...53more
竟然报出需要velocity相关包,那好吧,我的项目是用maven来做管理的,在pom.xml里加上相关依赖如下:
dependency>
<
groupId>
org.apache.velocity<
/groupId>
artifactId>
velocity<
/artifactId>
version>
1.7<
/version>
/dependency>
velocity-tools<
2.0<
再次重起tomcat后,一切正常,可以看到jrebel关键信息在console里输出:
JRebel:
Directory'
\projects\cmac\target\classes'
willbemonitoredforchanges.
\projects\cmac\target\test-classes'
\projects\cmac\src\main\webapp'
4、如果你使用maven发布并启动tomcat,那么需要安装jrebel-maven-plugin。
本文前面提到只是满足开发阶段而且启动tomcat方式不是使用mvn命令方式,因此不需要安装jrebel-maven-plugin。
Spring利用注释方式实现IoC
现在大部分java项目有使用Spring框架,为了能使Jrebel更好的对Spring相关资源发生热布署作用,就得充分使用注释的方式实现依赖注入。
这里对Spring实现注释方式作一下最简单的介绍,首先在applicationContext.xml里配置如下两行代码:
context:
annotation-config/>
component-scanbase-package="
*"
简单的说,以上的配置让spring支持了我们将要实现的注释依赖注入。
以下以登录为实例,按action层、业务层、数据库操作层、PO层分别新建四个类:
LoginAction.java//strutsaction
UserServiceImpl.java//businesslayer
UserDaoImpl.java//daolayer
User.java//pojo
那么怎样通过注释方式进行调用的呢,首先给要被调用的类加上@Component注释,Spring为了区分不同层次的类,分别定义了以下四种注释
@Reposity
@Service
@Controller
@Component
目前阶段这四个注释实际上效果是一样的,我们约定如下:
PO类如有需要使用@Reposity注释;
Dao和Service使用@Service注释;
Action使用@Controller注释;
剩余分不出层次的类使用@Component注释。
如本例,action、service、dao分别加上注释
@Scope("
prototype"
)
@Controller("
loginAction"
publicclassLoginActionextendsBaseAction{
}
@Service("
userService"
publicclassUserServiceImplimplementsUserService{
userDao"
publicclassUserDaoImplextendsBaseDaoimplementsUserDao{
Scope注释默认是singleton,可以缺省。
使用这四个标签时,如果不使用参数值,那么spring会按自己规范取名,比如LoginAction,使用@Controller()注释,默认取名为loginAction。
取好了名,相当于在配置文件里配置了一组bean,接下来看怎么注入依赖,比如LoginAction要调用UserService,代码片段如下:
…
@Autowired
PrivateUserServiceuserService
就这么简单,添加xwork.xml配置,新加跳转页面,这些操作统统不用重起服务。
弹出ContinueorTerminate疑问
装上jrebel后,可以进入你的tomcat/conf/context.xml或server.xml,其中有一个参数reload=true,把它改成false。
表示关闭tomcat自身的热布署,在eclipse里启动tomcat,修改了类,有时还是会弹出ContinueorTerminate框,难道是个Bug?
不得而知。
不过有jrebel在不用担心,继续continue,会发现你的修改是有效的。
只有碰到前面提到的不适合jrebel热布署的场景时,即使没弹出ContinueorTerminate提示框,你也要自己重起服务。
Jrebel官方对热布署支持的场景列表(查看官网说明
JavaEESupport
JVMHotSwap
Timetoreload
1s
Nomemoryleak
YES
Changestomethodbodies
Adding/removingMethods
NO
Adding/removingconstructors
Adding/removingfields
Adding/removingclasses
Adding/removingannotations
Changings