文件名称:典型案例-y系列电机尺寸与功率资料
文件大小:3.26MB
文件格式:PDF
更新时间:2024-06-29 10:06:09
TongWeb6.0 用户使用手册
9.6 典型案例 9.6.1 问题场景 应用 MyApp.ear是实际项目的一个简略版,保留了可以重现实际项目中类冲突问题的代 码部分,此应用在 TongWeb 中可以正常部署,没有任何错误,但在访问其中某个业务时出现 错误: 错误信息片断: java.lang.ClassCastException: com.tongweb._MyEjbRemote_Wrapper cannot be cast to com.tongweb.MyEjbRemote 应用 MyApp.ear定义了一个 ejb和一个 web应用 MyWeb.war,其中 ejb的名称为 GenericSessionBean,它的接口为 com.tongweb.MyEjbRemote,该类分布在两个位置,一个 是 MyApp.ear包内 lib 目录下的 MyRemote.jar,暂记为位置一,另一个是 MyApp.ear 包内 MyWeb.war包内 lib目录的 MyRemote.jar,暂记为位置二。 出问题的类位于 web应用 MyWeb.war中的某 Servlet,该 Servlet中的业务逻辑代码如 下: Servlet 代码片断: Object remote = new InitialContext().lookup("***:com.tongweb.MyEjbRemote"); MyEjbRemote myEjb = (MyEjbRemote)remote;//此处出现问题 在 Web应用的类加载顺序默认采用子优先加载的情况下,Servlet代码中引用的 MyEjbRemote类由 Web 应用类加载器加载,加载的是位置二中的类,而通过 JNDI获取到的 MyEjbRemote接口的实现类(由 EJB容器生成的 com.tongweb._MyEjbRemote_Wrapper)由 Ejb 类加载器加载,该实现类实现的接口 MyEjbRemote也由 Ejb类加载器加载,加载的是位置一 中的类,两个位置的 MyEjbRemote 类由不同的类加载器加载,类定义也来自不同的文件,在 JVM 中被认为是不同的类,不能进行类型转换,所以产生 ClassCastException。 9.6.2 普通分析中的困难 从上面这个案例可以看出,如果能分析出来是由于两个不同的类加载器加载了 MyEjbRemote,从而导致类型转换异常,那么解决这个问题就变得非常容易,所以,关键是 能定位出类加载冲突的问题。而实际项目非常庞大,有成百上千的 jar包和 class文件,要 定位该类的分布位置及其类加载器是一件很枯燥又繁琐的事情,另外,如果遇到更糟的情况 比如无法确定冲突的类名,那么此问题又会变得更加棘手。 而类加载分析工具可以高效的 解决这个难题。 9.6.3 使用类加载分析工具 类加载分析工具为分析类加载冲突问题提供了很好的辅助作用,可以通过下面三种方式 进行问题定位: 1. 类名快速定位 根据错误提示信息,初步断定问题出在 com.tongweb.MyEjbRemote类,但我们还需要 更多的信息,使用 10.4 类资源分析功能,打开类资源分析页面,选择已部署的应用 MyApp, 输入类名“com.tongweb.MyEjbRemote”,点击“分析”按钮,分析结果如图 9.6.1所示: