重新部署应用出现ClassCastException

      若开发者重新部署某应用,与此同时有其他的应用引用了该应用的类,则此时ClassCastException异常经常出现,如单独的Web应用(.war)访问EJB。如果重新部署了某应用,所有依赖于它的应用必须刷新(flush)它们的类引用。一般情况下,这要求依赖的应用程序能够自动重新部署。

 

    做了如下的实验:

    jboss已经部署a.ear,通过页面触发action,打印其中一个类的信息,信息如下:

    2010-07-02 14:56:11,062 INFO  [STDOUT] (http-0.0.0.0-8080-3) action's CmtCtrlMgr cast::org.jboss.mx.loading.UnifiedClassLoader3@562d4b{ url=file:/usr/jboss/jboss/server/default/tmp/deploy/tmp801559332682014361Jdom.ear ,addedOrder=50}

 

   重新部署a.ear,通过页面触发action,打印其中一个类的信息,信息如下:

2010-07-02 15:03:18,395 INFO  [STDOUT] (http-0.0.0.0-8080-3) action's CmtCtrlMgr cast::org.jboss.mx.loading.UnifiedClassLoader3@d40c4e{ url=file:/usr/jboss/jboss/server/default/tmp/deploy/tmp548120413744882785Jdom.ear ,addedOrder=52}

 

可以看出,同一个类,重新部署后,加载器的实例不同,这样尽管类全限定名相同,也不能进行cast的。

 

解决方法:重新部署调用a.ear的应用。以后部署时,最好都重启一下应用服务器。

 

在网上找到这样的一句话:

在JAVA中,一个类用其完全匹配类名(fully qualified class name)作为标识,这里指的完全匹配类名包括包名和类名。但在JVM中一个类用其全名和一个加载类ClassLoader的实例作为唯一标识。因此,如果一个名为Pg的包中,有一个名为Cl的类,被类加载器KlassLoader的一个实例kl1加载,Cl的实例,即C1.class在JVM中表示为(Cl, Pg, kl1)。这意味着两个类加载器的实例(Cl, Pg, kl1) 和 (Cl, Pg, kl2)是不同的,被它们所加载的类也因此完全不同,互不兼容的。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值