tomcat项目移植到weblogic问题
【转载】
tomcat项目移植到weblogic问题
我用的jdk是1.5,服务器tomcat5.5,由于项目需要,将jdk改为1.4.2,服务器weblogic 8.1
在转换时出现了一点问题,主要是页面的标签问题。经网上搜索查了以下资料。
1、 JDK和Servlet版本问题
WebLogic 8.1 sp4以前(包括sp4)只支持JDK1.4,建议使用JDK1.4进行编译代码,有时JDK1.5编译的程序无法运行。
由于WebLogic 8.1不支持J2EE1.4,不要使用Servlet2.4和JSP2.0进行编码。
2、 Struts 加载问题
在TOMCAT中,加载Struts的顺序是通过servlet加载,排在Listener加载之后。如果在Struts中使用Plugin,会在TOMCAT启动的最后加载,所以在Plugin中可以使用Spring中的Bean。
移植到WebLogic后,Struts会在容器启动的时候全部加载,包括Plugin。这样就出现了在Plugin加载的时候,不能得到 Spring管理的Bean,也就是说Struts Plugin在WebLogic里不能使用Spring管理的Bean。所以如果需要启动时加载部分代码,建议使用Servlet init()方法。
Spring为通过Web启动的程序提供了一个工具,该工具可以从Context中直接得到WebApplicationContext,其工具的方法签名如下:
系统需要读取webAppRootKey这个参数,所以在部署到WebLogic里的时候,在web.xml中手动添加如下代码:
说明:prefer-web-inf-classes=true是WebLogic's classloader在有重名类时,优先加载Web应用中WEB-INF内的类。
Axis部署同理。
注意:
1、如果有包在通过修改startWebLogic启动脚本优先加载后,web应用中有重复的包,并且将prefer-web-inf- classes=true,BEA WebLogic编译JSP时会报错。(直接设置true就可以,无需再修改脚本;如果已经修改过脚本,需要还原。)
2、在apache中提供两种方式部署Axis包,一种为prefer-web-inf-classes=true,另外一种将saaj.jar一个包在webservices.jar之前优先加载。经实际验证,只将saaj.jar一个包优先加载并不能解决全部问题,如果不使用前一种方法,请将 axis全部的包加载在webservices.jar之前。
6、 BEA WebLogic Crashes问题
在实际部署到Unix下的BEA时,我遇到过两回WebLogic Crash问题,都是通过BEA Support解决的,下面分享一下两回Crash的过程、解决方法及经验。
服务器环境:HP Unix 11.23;HP JDK1.4.2_10;WebLogic8.1 SP5
7. 发布Web Service接口,远程程序调用两回后BEA WebLogic Crash
在Tomcat上测试正常的Web Service接口,移植到BEA 后,第一回调用该接口一切正常,第二次调用时,系统直接报错,WebLogic进程从系统中消失。
BEA Support给出的解释是内存分配不足,增加BEA WebLogic应用内存最大值后,系统正常。
8. Axis远程调用.net Web Service接口,出现java.lang.NoSuchMethodError: javax.xml.namespace.QName.getPrefix()Ljava/lang/String;错误,将包含该类的包优先加载,调用.net Web Service接口时系统Crash
我所用的应用系统需要调用远程.net平台的Web Service接口,该程序在Tomcat和Windows 下BEA WebLogic 8.1 SP5下进行测试,全部正常使用,但移植到HPUX上,每次调用接口时都会找不到 javax.xml.namespace.QName.getPrefix()方法。查明该方法存在于jaxrpc.jar文件中,而 webservices.jar存在名为javax.xml.namespace.QName的重名类。在startWebLogic.sh文件中修改,手动将jaxpc.jar排在webservices.jar之前加载,重启系统后,调用.net Web Service时出现Crash。
BEA Support给的解释是classloader冲突,确切的冲突原因不明,Windows下没有问题的话考虑升级JVM,或者使用Application内的Class优先加载。
最后通过问题4的解决方式解决。(详细原理请参见http://e-docs.bea.com/wls/docs81/programming/classloading.html)
个人感觉在UNIX下BEA不是很稳定,如果类似出Crash问题,最好请BEA Support解决。BEA Support定位问题需要出现问题的原因、出错生成的日志文件,并且配合他修改一些参数获得更多的日志文件,这些日志文件都在启动的Domain目录下。当购买BEA服务后,不建议过多花费时间在解决这类问题上(网上基本没有太多资料)。
9. 还有this.getServletContext()要改为this.getServletConfig().getServletContext()
1 楼 skcmm 2010-04-02 学习下· 感谢楼主