`
feicer
  • 浏览: 133077 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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,其工具的方法签名如下:

org.springframework.web.context.support.WebApplicationContextUtils. getWebApplicationContext(ServletContext); 



3、 Include问题

在BEA WebLogic中不允许在一个文件中出现一次以上类似<%@ page contentType="text/html; charset=GBK"%>的代码,所以使用include file时,请将被include的文件中类似代码删除。

在TOMCAT时允许上述代码出现多回,并且使用include file时,被include的文件中,不包含上述代码,编译后客户端显示为乱码。BEA为此解释为TOMCAT不符合J2EE规范。

为了增加代码的通用性和可移植性,建议使用<jsp:include>方式。

<jsp:include>将被include的jsp代码视为独立存在的文件,所以可以在不同文件内使用多个<%@ page contentType="text/html; charset=GBK"%>。<jsp:include>直接传参由<jsp:param>标签完成,在被 include页面可以通过request得到传入的值,也可以通过request.setAttribute()、 request.getAttribute()进行内外文件参数传递。


4、 打包后Log4j支持问题

打包成.war部署到WebLogic后,出现如下问题:

Error: weblogic.management.DeploymentException: Cannot set web app root system property when WAR file is not expanded - with nested exception: 

[java.lang.IllegalStateException: Cannot set web app root system property when WAR file is not expanded] 


问题解决:通常您不需要亲自编写servlet或者listener,比如直接利用log4j的 com.apache.jakarta.log4j.Log4jInit类,Spring的 org.springframework.web.util.Log4jConfigServlet和 org.springframework.web.util.ServletContextListener方式配置,找到.Log4jConfigServlet和ServletContextListener的源码,他们都在适当的地方(callback method)调用了Log4jWebConfigurer.initLogging(getServletContext());定位到这个方法,第一句就是:WebUtils.setWebAppRootSystemProperty(servletContext);再定位到该方法,方法很短:

public static void setWebAppRootSystemProperty(ServletContext servletContext) throws IllegalStateException { 

String param = servletContext.getInitParameter(WEB_APP_ROOT_KEY_PARAM); 

String key = (param != null ? param : DEFAULT_WEB_APP_ROOT_KEY); 

String oldValue = System.getProperty(key); 

if (oldValue != null) { 

throw new IllegalStateException("WARNING: Web app root system property already set: " + key + " = " + oldValue + " - Choose unique webAppRootKey values in your web.xml files!"); 

} 

String root = servletContext.getRealPath("/"); 

if (root == null) { 

throw new IllegalStateException("Cannot set web app root system property when WAR file is not expanded"); 

} 

System.setProperty(key, root); 

servletContext.log("Set web app root system property: " + key + " = " + root); 

} 


系统需要读取webAppRootKey这个参数,所以在部署到WebLogic里的时候,在web.xml中手动添加如下代码:

<context-param> 

<param-name>webAppRootKey</param-name> 

<param-value>webapp.root</param-value> 

</context-param> 



WebLogic自身也包含对Log4j的支持,在打包部署(.war)的时候,会和Spring的 org.springframework.web.util.Log4jConfigListener有冲突(拷贝到WebLogic散放部署不会出错)。所以改用Servlet加载。(不通过应用加载Log4j好像也可以使用,但未进行完整测试,下面代码修改后,系统会报Log4j加载重复错误,不影响应用启动。)

web.xml中删除下面代码:

<listener id="log4jConfigListener"> 

<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 

</listener> 


将Listener加载改为通过Servlet加载,再在web.xml增加:

<servlet> 

<servlet-name>log4jConfigListener</servlet-name> 

<servlet-class>org.springframework.web.util.Log4jConfigServlet</servlet-class> 

<load-on-startup>0</load-on-startup> 

</servlet> 



5、 Hibernate3、Axis部署问题

Hibernate3中hibernate.query.factory_class的默认值为 org.hibernate.hql.ast.ASTQueryTranslatorFactory,在WebLogic下系统运行时会抛出 org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken异常。

这个问题网上说的很多,解决方法也各式各样,其实很简单,Weblogic系统默认加载EJB-QL parser,存在重名类,所以使用时会出现ClassNotFoundException。一般网上的修改方式都是修改startWebLogic运行的脚本,将antlr-2.7.5H3.jar文件优先加载。但这样的方法会带来一些其他问题,所以不推荐使用。最好的方法是,在WEB-INF目录下建一个weblogic.xml文件,文件中写入如下代码:

<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd"> 

<weblogic-web-app> 

  <container-descriptor> 

    <prefer-web-inf-classes>true</prefer-web-inf-classes> 

  </container-descriptor> 

</weblogic-web-app> 


说明: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  
学习下· 感谢楼主

相关推荐

    weblogic项目移植到tomcat,配置说明

    weblogic项目移植到tomcat,配置说明

    Tomcate移植到webLogic问题及解决方法

    java的一些war包由Tomcate移植到webLogic所引起的一些常见问题及解决方法

    项目框架从tomcat到weblogic

    项目框架从tomcat到weblogic

    windows下 weblogic 下的 sitemesh jar

    这个东东 是我们项目里面改版的 之前在项目里面 是Windows下面的 tomcat里面 开发的 但是 后来移植到weblogic下面后 就出现乱码 还有 就是 页面无法正常显示。于是就改了 这个 sitemesh 包。

    常用J2EE应用服务器简介.docx

    这几天接触到两种Java的web服务器,做项目用的Tomcat,看视频看的是WebLogic Server(WLS),都是web服务器,有什么区分和联系呢? (一)先简洁介绍一下这两种服务器。 WebLogic是美国bea公司出品的一个application ...

    servlet-api.jar

    面向标准接口编程的好处就是我们开发出的一个web工程即可以部署到tomcat、也可以部署到weblogic或其他servlet容器下运行,所有的servlet容器都使用了相同接口所以我们可以无缝移植(定义标准很重要),还记得jdbc吧?...

    六大应用服务器用途及简介.docx

    Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的'一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat ...

    承元软件表单系统详细说明文档

    2、应用服务器:支持符合J2EE规范的应用服务器,如Tomcat 、WebLogic、WebSphere。 3、数据库:支持Oracle、Mysql、Sql Server等不同的数据库平台。 2、客户端: IE浏览器5.0以上。 四、应用效果 见“成功案例”...

    超级有影响力霸气的Java面试题大全文档

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

    java 面试题 总结

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

    Java版水果管理系统源码-syybi:西比

    Java版水果管理系统源码 syybi 平台简介 xxx 内置功能 xxx:xxx。 为何选择syybi xxx。 ...有Tomcat ...7、WebLogic ...数据库支持:目前仅提供MySql...语言开发,具有卓越的通用性、高效性、平台移植性和安全性。 分层设计:

    Oracle9i备课笔记——吕海东

    (8) 应用平台:IIS, Tomcat, Weblogic, WebShpere, Oracle AS. (9) 自然语言:英语,日语 1.2 学习Oracle数据库的重要性 (1) 数据库在当今世界的重要性。 (2) Oracle数据库的市场应用的广泛性。 (3) Oracle...

    javapms门户网站源码

    在应用服务器平台兼容性方面,系统支持跨应用服务器,如Tomcat、Weblogic、Webspere、JBoss等应用服务器,很好的满足了各层次用户的需求。 在浏览器兼容性方面,目前多种浏览器并存,使用非IE浏览器的用户越来越多,...

Global site tag (gtag.js) - Google Analytics