公司一个项目准备在这几天上线,在用户现场搭建好服务器运行环境后,我们的主要工作就是将应用移植到新的环境中。
部署环境介绍
开发环境介绍
操作系统
Oracle Enterprise-R5-U5-Server-x86_6
windows7/windowsxp
中间件
Weblogic server 10.3
tomcat 6
JDK
jdk1.6
jdk1.6
J2EE SDK
5.0
5.0
数据库
Oracle
Oracle
在将tomcat环境下开发的应用移植到weblogic下的过程中遇到了各种问题,特在此记录。
一、在一开始时准备将web应用打成war包,使用weblogic管理服务器安装,遇到了第一个问题
错误一:
意外的异常 在处理请求时出现意外的异常情况
消息:
堆栈跟踪: java.lang.NullPointerException
at com.bea.console.actions.app.install.Flow.uploadApp(Flow.java:256)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
省略数千字……………
错误二:
java.lang.OutOfMemoryError: unable to create new native thread
问题分析:
这些错误都是在文件上传时,因为我们的工程较大,导致虚拟交换内存不足引起的,将修改weblogic的虚拟内存调大后,解决了问题。
解决办法:
找到weblogic启动文件 startWebLogic.sh,由于该文件实际上又调用了bin/setDomainEnv.sh文件,所以真正要改的是setDomainEnv.sh(在我这里该文件位于/Middleware/user_projects/domains/base_domains/bin)
将PermSize 和MaxPermSize调整到 256和 512(按实际需要来调)
二、这时候,我们这样可以没问题了吧,谁知一部署,第二个问题来了
错误:
java.lang.IllegalStateException: Cannot set web app root system property when WAR file is not expanded
问题分析:
出现这个原因是因为部署的时候使用的是war包, weblogic部署应用不像tomcat先将war解压在启动,而是直接使用war启动。因为我们在很多JSP和Servlet文件中使用了如:this.servletContext.getRealPath("/")等类似写法,因为在war中的文件时没有真实路径的,所以getRealPath("/")取出来的都是意向不到的值,例如null。
解决办法:
由于用这种写法获得web服务器路径的地方很多,一个个去换显然不是一个很好的办法,而且直接使用war部署对后续的应用更新也比较麻烦,所以准备采用另外一种部署方式,就是文件目录部署。