- 浏览: 224036 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (212)
- 架构师-01-文档目录 (3)
- 架构师-02-组织 (7)
- 架构师-03-实施 (35)
- 架构师-04-监督 (14)
- 架构师-05-工具 (29)
- 架构师-09-引用文集 (63)
- 专题-01-微博应用 (5)
- 专题-02-GoogleEarth (1)
- 专题-03-运行维护 (9)
- 专题-04-经纪人营平 (3)
- 专题-05-RCP&RAP (5)
- 专题-06-框架PK (3)
- 专题-07-Android (13)
- 专题-08-UI (3)
- 专题-liferay6 (6)
- 专题-extjs4 (3)
- 专题-CXF (3)
- 专题-封闭网络的社会化 (0)
- 扯谈 (4)
- 外包 (9)
- 专题-C++ (4)
- 专题-09-BI (2)
- jquery&easyui (2)
- 专题-搜索引擎 (1)
最新评论
-
brighter:
oMapper.configure(Deserializati ...
jackson 抛出 bean 中没有定义字段的错误,只好用 gson -
PassFeed_free:
public Bitmap decode(ImageDecod ...
android universalimageloader 几点改进 -
PassFeed_free:
楼主你好, 请问这个库, 在大屏显示高清图片 ,listvie ...
android universalimageloader 几点改进 -
yonghong:
楼主只是揣测
JIRA4.1 升级到 JIRA5.1 -
abdxj:
"Could NOT parse license t ...
JIRA4.1 升级到 JIRA5.1
甚至有人为了实现热部署,放弃各种框架(struts, spring mvc, servlet),java 代码全部在 jsp 中编码,全面效仿 php,对热部署的狂热,也算是对得起这个“热”字了。其实热部署会有那么难吗?不会吧。试试 jrebel 。
已知 jrebel 是收费产品,且需要 license key,但这些东东在国人面前似乎是不存在,有钱出钱,没钱出人而已。有钱的出钱买 license,没钱的人会感激他们,因为需要看到优秀产品。没钱的人出力破解一下,出钱的人也会感谢他们,因为需要体验优越感。
原文:http://truemylife.iteye.com/blog/1140921
背景与愿景:开发环境下,tomcat对热布署的支持还不够全面,致使开发人员浪费大量时间在重起服务上。为了提高开发效率,决定引入Jrebel,它对热布署的支持相对比较全面。虽然Jrebel官方号称使用它不存在内存泄漏问题,但是占用一定的资源是肯定的,因此不考虑在正式环境下使用热布署。Jrebel实际上支持非常多中间件,除了Tomcat还包括Jetty、Resin、Weblogic等等,从理论上来讲,他跟中间件也没什么关系,但实际配置的时候还是会根据中间件有所不同,具体可以上官网查看,本文要讲的是tomcat+ eclipse+ spring+ struts2+ maven的环境。在使用Jrebel后,我们期望看到开发人员早上开机启动一次tomcat后就够了。
使用场景:Tomcat对热布署的使用场景是Servlet+JSP+JaveBean。如果项目含有其他框架时,其热布署效果就会大大降低,在与同事一同测试观察后发现:tomcat6在spring+struts框架下的项目,对java文件修改后的成功热布署概率偏低。由于概率太低,而且有无热布署成功不能确定,大部分开发人员修改类后不管什么情况直接选择重起,长此以往,浪费的时间积累起来不在少数。下面把tomcat和jrebel对热布署测试结果对比一下:
对比项 |
Jrebel |
Tomcat |
Class文件 |
绝大部分能热布署 |
小部分能热布署 |
Spring支持 |
改成用注释的方式后,可支持 |
不支持 |
Struts配置文件 |
支持 |
支持 |
页面相关文件 |
支持 |
支持 |
从对比可以看到,Jrebel最大的提升是对java类修改时,热布署大大提高;而对spring的支持实际上还是有限的,需要把IoC的实现改成使用注释的方式,而不能是配置的方式。如果你的工程的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、Eclipse window->preference->tomcat->JVM Settings,加入以下参数
-Drebel.spring_plugin=true 支持spring框架
-Drebel.aspectj_plugin=true 支持aspectj
-Drebel.struts2_plugin=true 支持strut2
-javaagent:D:\jrebel.jar 这里自行修改jrebel.jar正确的路径
-noverify
如果你要支持更多的框架,可以参考官网http://www.zeroturnaround.com/jrebel/features/frameworks/
如果你要了解更多的参数配置,可以参考官网
http://www.zeroturnaround.com/jrebel/configuration/
jrebel支持监控多个目录下的classes、配置文件、jar包是否被修改,因此建议新建并配置rebel.xml文件,如果Eclipse安装了官网的jrebel plugin,那么可以从eclipse菜单里产生rebel.xml文件。以下是rebel.xml的简单手动配置:
<?xml version="1.0" encoding="UTF-8"?>
<application
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.zeroturnaround.com"
xsi:schemaLocation="http://www.zeroturnaround.com/alderaan/rebel-2_0.xsd">
<classpath>
<dir name="E:\projects\cmac\target\classes"/>
<dir name="E:\projects\cmac\target\test-classes"/>
</classpath>
<web>
<link target="/">
<dir name="E:\projects\cmac\src\main\webapp"/>
</link>
</web>
</application>
rebel.xml更详细配置说明参考官网(http://www.zeroturnaround.com/jrebel/configuration/)
3、此时启动tomcat,会发现如下错误信息
严重: Exception starting filter Struts2
java.lang.NoClassDefFoundError: Lorg/apache/velocity/app/VelocityEngine;
...
Caused by: java.lang.ClassNotFoundException: org.apache.velocity.app.VelocityEngine
... 53 more
竟然报出需要velocity相关包,那好吧,我的项目是用maven来做管理的,在pom.xml里加上相关依赖如下:
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-tools</artifactId>
<version>2.0</version>
</dependency>
再次重起tomcat后,一切正常,可以看到jrebel关键信息在console里输出:
JRebel: Directory 'E:\projects\cmac\target\classes' will be monitored for changes.
JRebel: Directory 'E:\projects\cmac\target\test-classes' will be monitored for changes.
JRebel: Directory 'E:\projects\cmac\src\main\webapp' will be monitored for changes.
4、如果你使用maven发布并启动tomcat,那么需要安装jrebel-maven-plugin。本文前面提到只是满足开发阶段而且启动tomcat方式不是使用mvn命令方式,因此不需要安装jrebel-maven-plugin。
Spring利用注释方式实现IoC
现在大部分java项目有使用Spring框架,为了能使Jrebel更好的对Spring相关资源发生热布署作用,就得充分使用注释的方式实现依赖注入。这里对Spring实现注释方式作一下最简单的介绍,首先在applicationContext.xml里配置如下两行代码:
<context:annotation-config/>
<context:component-scan base-package="*"/>
简单的说,以上的配置让spring支持了我们将要实现的注释依赖注入。以下以登录为实例,按action层、业务层、数据库操作层、PO层分别新建四个类:
LoginAction.java//struts action
UserServiceImpl.java//business layer
UserDaoImpl.java//dao layer
User.java //pojo
那么怎样通过注释方式进行调用的呢,首先给要被调用的类加上@Component注释,Spring为了区分不同层次的类,分别定义了以下四种注释
@Reposity
@Service
@Controller
@Component
目前阶段这四个注释实际上效果是一样的,我们约定如下:PO类如有需要使用@Reposity注释;Dao和Service使用@Service注释;Action使用@Controller注释;剩余分不出层次的类使用@Component注释。
如本例,action、service、dao分别加上注释
@Scope("prototype")
@Controller("loginAction")
public class LoginAction extends BaseAction{
}
@Service("userService")
public class UserServiceImpl implements UserService{
}
@Service("userDao")
public class UserDaoImpl extends BaseDao implements UserDao{
}
Scope注释默认是singleton,可以缺省。使用这四个标签时,如果不使用参数值,那么spring会按自己规范取名,比如LoginAction,使用@Controller()注释,默认取名为loginAction。取好了名,相当于在配置文件里配置了一组bean,接下来看怎么注入依赖,比如LoginAction要调用UserService,代码片段如下:
@Scope("prototype")
@Controller("loginAction")
public class LoginAction extends BaseAction{
…
@Autowired
Private UserService userService
…
}
就这么简单,添加xwork.xml配置,新加跳转页面,这些操作统统不用重起服务。
弹出Continue or Terminate疑问
装上jrebel后,可以进入你的tomcat/conf/context.xml或server.xml,其中有一个参数reload=true,把它改成false。表示关闭tomcat自身的热布署,在eclipse里启动tomcat,修改了类,有时还是会弹出Continue or Terminate框,难道是个Bug?不得而知。不过有jrebel在不用担心,继续continue,会发现你的修改是有效的。只有碰到前面提到的不适合jrebel热布署的场景时,即使没弹出Continue or Terminate提示框,你也要自己重起服务。
Jrebel官方对热布署支持的场景列表(查看官网说明http://www.zeroturnaround.com/jrebel/features/)
Java EE Support |
Jrebel |
JVM Hot Swap |
Time to reload |
< 1s |
< 1s |
No memory leak |
YES |
YES |
Changes to method bodies |
YES |
YES |
Adding/removing Methods |
YES |
NO |
Adding/removing constructors |
YES |
NO |
Adding/removing fields |
YES |
NO |
Adding/removing classes |
YES |
NO |
Adding/removing annotations |
YES |
NO |
Changing static field value |
YES JRebel 3.0+ |
NO |
Adding/removing enum values |
YES JRebel 3.0+ |
NO |
Changing interfaces |
YES |
NO |
Replacing superclass |
NO |
NO |
Adding/removing implemented interfaces |
NO |
NO |
Skip builds for WAR directories |
YES |
YES |
Skip builds for .WAR/.EAR class updates |
YES |
YES |
Skip builds for .WAR/.EAR resource updates |
YES |
NO |
Map multiple source dirs to one .WAR/.EAR target dir |
YES |
NO |
Map classes and resources with include/exclude patterns |
YES |
NO |
Map multiple source dirs with Ant-style patterns |
YES |
NO |
Use system properties to make mapping machine-independent |
YES |
NO |
Maven plugin |
YES |
NO |
JSP EL changes |
YES |
NO |
JSP Scriptlet changes |
YES Enterprise Add-on |
NO |
EJB 1.x session bean interface changes |
YES Enterprise Add-on |
NO |
EJB 2.x session bean interface changes |
YES Enterprise Add-on |
NO |
EJB 3.x session bean interface changes |
YES JRebel 3.0+ |
NO |
JSF changes (Mojarra) |
YES JRebel 3.0+ |
NO |
JPA changes (Hibernate, EclipseLink, TopLink, OpenJPA) |
YES JRebel 3.0+ |
NO |
CDI changes (Weld) |
YES JRebel 3.0+ |
NO |
ResourceBundle |
YES |
NO |
Spring Framework 2.x or later |
YES |
NO |
Hibernate |
YES JRebel 3.0+ |
NO |
JBoss Seam 2.x or later |
YES JRebel 3.0+ |
NO |
Google Guice |
YES |
NO |
Stripes 1.x or later |
YES |
NO |
Apache log4j 1.2.x or later |
YES |
NO |
Apache Struts 1.x |
YES |
NO |
Apache Struts 2.x or later |
YES |
NO |
Apache Tapestry4 |
YES |
NO |
Apache Velocity |
YES |
NO |
Apache Wicket |
YES |
NO |
CgLib |
YES JRebel 3.0+ |
NO |
Javassist |
YES JRebel 3.0+ |
NO |
Atlassian Confluence plugins |
YES |
NO |
ClassWorlds |
YES Beta |
NO |
Apache Felix |
YES Beta |
NO |
Eclipse Equinox |
YES Beta |
NO |
IntelliJ IDEA 7.x, 8.x plugins |
YES Beta |
NO |
NetBeans plugins |
YES Beta |
NO |
发表评论
-
深入理解Java:SimpleDateFormat安全的时间格式化
2014-06-26 01:45 447原文引用自:http://www.cnblogs.com/p ... -
注册MS CRM 2011 online
2014-04-24 00:38 494http://www.cnblogs.com/StoneGa ... -
微信架构推测
2013-08-06 09:45 1329原文:http://wenku.baidu.com/vie ... -
arc-04-10-手机应用的性能测试
2013-01-05 15:01 668手机性能测试的工具一大堆,但专门针对开发手机应用的性能测试工 ... -
GraphicsMagick 介绍及安装
2012-12-26 16:56 1224引用说明:原文来自 http://paris8.org/a/b ... -
在windows系统中生成数字证书-V3
2012-12-10 16:43 1039引用说明:原文来自 http://zhouyongqiang. ... -
如何从最大用户并发数推算出系统最大用户数
2012-11-19 14:52 1409引用说明:原来来自 ht ... -
使用JIRA搭建企业问题跟踪系统
2012-07-20 09:33 0原文来自:http://www.blogjava.net/zh ... -
Eclipse rcp/rap 开发经验总结
2012-01-11 23:48 1224有牛人将 Eclipse RCP & RAP 开发经验 ... -
VMware Server 在 CentOS 下的安装与配置
2012-01-08 09:46 1083引用说明:原文来 ... -
rdesktop:Linux 下的远程桌面客户端
2012-01-07 11:37 930引用说明:原文来自于 http://blog. ... -
解决 Oracle 11g存在密码过期问题
2012-01-04 09:52 786引用说明:原文来自 ... -
角色权限,RBAC
2011-12-27 23:00 854引用说明:原文来 ... -
Spring Security 2 配置精讲
2011-12-12 20:10 766引用说明:原文来 ... -
Linux下Mongodb的分布式分片群集(sharding cluster)配置
2011-12-12 09:45 812引用说明:原文来自于http://www.linux ... -
基于MongoDB的好友消息动态的实现思路
2011-10-18 13:45 1537引用说明:原文来自 ... -
Linkedin网站技术架构简介
2011-10-11 14:41 1205引用说明:原文来 ... -
微薄后台架构浅析
2011-10-11 14:00 771引用说明:原文来自于http://blog.sina.c ... -
通过 Flick 看数据库集群
2011-09-19 14:14 781原文参见 http://www.cchere.com/arti ... -
利用DNS+GeoIP+Nginx+Varnish做世界顶级的CDN
2011-08-10 11:45 1264http://bbs.3344.eu/archiver/ser ...
相关推荐
idea jrebel 热布署 项目时,代码生效特别慢的相关配置
springboot-example#springboot22021/4/154年后再刷spring#reference#source#spring official site#gradle取消CMD快速编辑模式#lombok还有日志功能#devtools热布署功能ctrl + F9只是restartJRebel付费,但是真的热...
光电离是一种将电子从原子或分子中除去的过程,通常通过光子(光粒子)的作用来实现。电离限指的是原子电离所需的最小能量。在本研究中,使用了两脉冲激光两步激发和光电离的方法来观察钐原子在电离限附近的光电离谱...
在太阳能驱动的不可逆中冷回热再热布雷顿热机系统中,通过分析其㶲损失和㶲效率,可以优化系统的性能并提供节能运行的理论指导。 热力学第二定律指出,在一个封闭系统中,热能只能从高温物体传递到低温物体,无法...