jrebelWord下载.docx

上传人:b****4 文档编号:16423898 上传时间:2022-11-23 格式:DOCX 页数:19 大小:25.92KB
下载 相关 举报
jrebelWord下载.docx_第1页
第1页 / 共19页
jrebelWord下载.docx_第2页
第2页 / 共19页
jrebelWord下载.docx_第3页
第3页 / 共19页
jrebelWord下载.docx_第4页
第4页 / 共19页
jrebelWord下载.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

jrebelWord下载.docx

《jrebelWord下载.docx》由会员分享,可在线阅读,更多相关《jrebelWord下载.docx(19页珍藏版)》请在冰豆网上搜索。

jrebelWord下载.docx

如果你的工程的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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 中职中专

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1