weblogic classes里面的一个class修改,热部署

来源:互联网 发布:java图形界面教程 编辑:程序博客网 时间:2024/05/22 13:42
一下措施可以保证这一点,建议在开发过程中使用:

1. startWebLogic.cmd:
set STARTMODE=false

2. web.xml:
<servlet-mapping>
<servlet-name>loginA</servlet-name>
<url-pattern>/servlet/loginCheckA</url-pattern>
<load-on-startup>0</load-on-startup>
</servlet-mapping>

3. weblogic.xml:
<jsp-param>
<param-name>pageCheckSeconds</param-name>
<param-value>0</param-value>
</jsp-param>
4.Make sure that your servlet classes are not in your classpath which can cause this problem.
5.在WLS console中,在该web app的Files页中,把<Reload Period>设为1

----------------------------
呵呵,我来说说原理吧。weblogic允许在wls运行时部署组件的新版本。这个过程被称作热部署。因为java classloader没有任何一种机制来卸下一系列存在的类,也不能用类的新版本来替换老版本,为了在一个运行的虚拟机中更新相关的类,classloader必须被替换掉。当它被替换时,它所装载的所有类以及衍生的子classloader也要被重新装载。这些类的所有实例也必需被重新装载。在wls中,每一个应用组件都有一个层次化的classloaders,它们都是system classloader的子类,这种结构有助于每个应用或应用的一部分能被单独重新加载,而不会影响其它的组件。所以我们只要理解这个原理,类似的困惑也就迎刃而解了。 :-)
-------------------------------------
多谢斑竹的回答。
既然你说到原理,我就想问点深入的问题,你说“为了在一个运行的虚拟机中更新相关的类,classloader必须被替换掉。”你只说出了结果,没有说出原因。classloader是每次运行这个class时候就替换掉呢,还是判断被修改以后,才替换掉呢?
比如jsp 都会编译成servlet,我把jsp修改了,可能weblogic会比较现在的jsp与它编译的servlet是否一致,如果不一致,重新编译(我猜的,请指正)。但class不一样,比如我一个class修改了,我直接把它拷贝过来把原来的覆盖掉,它拿什么做比较呢。是按照时间或者看有没有人修改过它,我知道我们修改redeploy那个文件的话,weblogic会自动部署。
还有一个问题,比如我们做的项目的servlet里面去解析了一个xml,如果我的xml添加了一些新东西,我想如果不启动的话,weblogic不会重新去解析这个xml吧。

有点钻牛角尖,请斑竹指点。
----------------------------------------
to:zhouhg
你说的第4点:
4.Make sure that your servlet classes are not in your classpath which can cause this problem. (翻译为:如果你的servlet类不在你的classpath 路径里面也可能引起这种问题)

不知道翻译的对否。没有看明白,你说的classpath 是那个,是weblogic启动时的
classpath 吗?如果是的话,为什么需要放在那里,不是放在web.xml里面,weblogic启动会加载这个servlet,
能否具体说明。
多谢!
-----------------------------------
第一个问题:原因不是有吗?
“因为java classloader没有任何一种机制来卸下一系列存在的类,也不能用类的新版本来替换老版本。”
这是由JVM本身的规范而决定的。
第二个问题:servlet的动态装载原理如下
当一个servlet响应http请求时,wls首先检查这个servlet类的时间戳,把它和内存里servlet类的时间戳作比较。一旦发现是一个新的版本,wls将会自动重新装载当前这个webapp所有的servlet类,我们可以通过Servlet Reload属性来设置wls检查时间戳的间隔时间。如果设置为-1则从不检查(用于产品模式),设置为0则在每次请求时都会检查。
第三个问题:当然不会啦。xml数据源变化自然不会影响classloader
----------------------------------
再次解释一下:
我说的第一点和第四点是前提,第二点是针对servlet的,第三点是针对jsp的,
第五点正好包容了,第二、三点,即针对jsp和servlet。
----------------------------------
因为jsp/servlet的class所在的位置是由wls启动后动态添加到CLASSPATH的最后的,如果jsp/servlet的class的目录已被你添加到CLASSPATH里了,那么你就丧失了动态更新的能力,因为wls已经在静态的CLASSPATH里找到了这个class,它当然不会自己再去load一次了。
关于更新的问题,基本上是你理解了也无解。正像yanglf911说的,JVM classloader已经决定了这个局限性。不过有2种解决的可能性,一种是全部依赖wls的hot deploy,也就是web application和ejb的hot deploy。你只做jsp/servlet + javabean的实现,或者用ejb的client-jar把你的ejb所需的class全部一起打包发布。一种是基于协同开发,就像你用jdk,或者用log4j,这些东西都是相对稳定的,版本变更不会很多,也就不会引起你的系统频繁重起。而设计自己的系统的时候,也要管理好系统的模块和层次,不要随心所欲的更新,把接口预先设计好,多运用一些自己的分析设计能力,变更一定先在自己的测试环境测试好,形成稳定版本再发布给其他系统、模块使用。这样也能解决部分问题。我们现在用的就是第二种。
---------------------------
原创粉丝点击