`

Tomcat向Weblogic迁移的问题

 
阅读更多

Spring+Hibernate+Struts的web应用程序开放过程一般在tomcat中运行。但实际应用一般会要求部署在WebLogic中。在移植过程中总结出以下问题:


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的解决方式解决.


个人感觉在UNIX下BEA不是很稳定,如果类似出Crash问题,最好请BEA Support解决。BEA Support定位问题需要出现问题的原因、出错生成的日志文件,并且配合他修改一些参数获得更多的日志文件,这些日志文件都在启动的Domain目录 下。当购买BEA服务后,不建议过多花费时间在解决这类问题上(网上基本没有太多资料)。

9. 还有this.getServletContext()要改为this.getServletConfig().getServletContext()

分享到:
评论

相关推荐

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

    WebLogic 项目移植到 Tomcat 配置说明 在进行 WebLogic 项目移植到 Tomcat 之前,需要确保已经成功安装了 Tomcat。下面将对 WebLogic 项目移植到 Tomcat 的配置进行详细说明。 配置 Tomcat 1. 在 Tomcat 安装目录...

    tomcat工程迁移至weblogic文档

    ### Tomcat工程迁移至WebLogic的关键步骤与注意事项 在企业级应用开发中,根据业务需求和技术选型的变化,有时需要将部署在Tomcat上的应用程序迁移到WebLogic服务器上。这一过程涉及多方面的调整与优化,确保应用能...

    weblogic10.3.3之后版本升级至weblogic10.3.6文档.docx

    - **迁移**:将应用程序或配置从其他平台(例如Tomcat)迁移到WebLogic Server的过程。 - **兼容性**:指一个在某个WebLogic Server版本上构建的应用程序能够在另一个版本上运行而不需重建的能力。 #### 三、适用...

    weblogic部署项目jar冲突解决

    在将一个已经在Tomcat上正常运行的应用迁移到WebLogic时,可能会遇到各种问题,其中最常见的是配置问题和JAR包冲突。 标题"weblogic部署项目jar冲突解决"指出的核心问题是JAR包冲突。这是因为不同的应用服务器可能...

    把 MapXtreme for Java 迁移到 Tomcat 5.5 上

    在迁移过程中,可能遇到MapXtreme for Java代码与Tomcat 5.5不兼容的问题。例如,在HTMLEmbeddedMapServlet.java文件的第380行,“res.setLocale(req.getLocale());”这行代码在Tomcat 4.1和5.5之间的表现可能有差异...

    将应用部署到weblogic10及oracle linux时遇到的问题 .docx

    在将应用程序从Tomcat环境迁移到WebLogic 10并部署到Oracle Linux环境中时,可能会遇到一系列挑战。本文档详细记录了迁移过程中遇到的问题及解决方案。 首先,迁移过程中的第一个问题是由于应用程序较大,导致在上...

    将应用部署到weblogic及oracle linux时遇到的问题e.docx

    在将应用程序从Tomcat环境迁移到WebLogic时,开发者可能会遇到一系列挑战。本文将详细讨论在部署过程中遇到的问题以及相应的解决方案。 首先,遇到的第一个问题是由于文件上传时内存不足导致的。在尝试将Web应用...

    将应用部署到weblogic及oracle linux时遇到的问题e.pdf

    在将应用从Tomcat迁移到WebLogic服务器以及Oracle Linux操作系统时,可能会遇到一系列问题。以下是一些关键知识点和解决策略: 1. **错误一:意外的异常 - OutOfMemoryError** 这个错误通常表明Java虚拟机(JVM)...

    将应用部署到weblogic10及oracle linux时遇到的问题 .pdf

    在将应用从Tomcat迁移到WebLogic 10并部署在Oracle Linux上时,开发者可能会遇到一系列挑战。本文将详细解析这些挑战以及相应的解决方案。 首先,我们遇到的第一个问题是“意外的异常”和“java.lang....

    apache-tomcat-8.5.16.tar.gz

    Tomcat可以作为其他重量级应用服务器(如JBoss、WebLogic)的Servlet容器,提供轻量级部署选项。 10. **升级与维护** 要升级到新版本,只需下载新版本的Tomcat,停止旧版本,然后替换旧目录。确保备份配置文件,...

    将应用部署到weblogic10及oraclelinux时遇到的问题.pdf

    总结来说,将应用从Tomcat迁移到WebLogic时,开发者需要关注的问题包括但不限于:异常处理、内存配置、路径访问和应用部署方式的选择。对于每个问题,都需要深入理解WebLogic的工作原理以及Java应用程序的生命周期...

    Tomcat6.0

    10. **升级与迁移**:随着技术发展,Tomcat后续发布了更高版本,如7.0、8.0、9.0等,开发者需要了解如何从6.0迁移到新版本,以利用新功能并解决潜在的安全问题。 综上所述,Tomcat6.0作为一款重要的Java Web应用...

    weblogic weblogic 8.14 license

    6. **合规性**:非法使用WebLogic可能会导致法律问题,因此理解并遵守许可证条款至关重要。这包括但不限于不超出许可证范围使用,不分享或出售许可证,以及定期进行许可证审计以确保合规。 7. **迁移策略**:随着...

    将应用部署到weblogic10及oracle linux时遇到的问题.docx

    总结,将应用从Tomcat迁移到WebLogic涉及到多个环节,包括JVM内存优化、部署方式的调整、应用代码的适应性改造以及对WebLogic管理服务器的深入理解。遇到问题时,日志分析和测试是解决问题的关键步骤。通过适当的...

    将应用部署到weblogic10及oracle linux时遇到的问题.doc

    在将应用从Tomcat移植到WebLogic 10并部署在Oracle Linux环境下时,开发者可能会遇到一系列挑战。本文档详细记录了在迁移过程中遇到的主要问题及其解决方案。 首先,遇到的第一个问题是“错误一:意外的异常”。这...

    apache-tomcat-8.0.47-windows-x64.zip

    8. **集成其他应用服务器**:Tomcat可以与其他Java应用服务器(如JBoss、WebLogic)集成,作为Servlet容器使用,或者在需要轻量级部署的情况下替代它们。 9. **升级和维护**:要更新到新版本,只需下载新的Tomcat ...

    liferay5.1布署到weblogic9.2

    - **资源迁移:** 将原有的 Tomcat 环境中的资源(如 Jar 包)准确无误地迁移到 WebLogic 中。 - **配置调整:** 根据新环境的需求调整各项配置,特别是 JDBC 连接池和 Email Session 的配置。 - **测试验证:** 部署...

    apache-tomcat-6.0.41.rar

    此外,Tomcat与其他应用服务器,如Jetty、JBoss和WebLogic等相比,具有轻量级、简单易用的特点。因此,在小型项目或者测试环境中,Tomcat经常被作为首选的Java Web服务器。但是,大型企业级应用可能需要更强大、更...

    Tomcat 6x应用服务器

    与重量级的应用服务器如IBM WebSphere或Oracle WebLogic相比,Tomcat因其轻量级的特性而受到青睐。它的体积小、启动快速,适合小型到中型的Web应用程序,尤其适用于开发和测试环境。 3. **部署与管理** 在Tomcat ...

Global site tag (gtag.js) - Google Analytics