最近出现的一个问题。
我用的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()
分享到:
相关推荐
WebLogic 项目移植到 Tomcat 配置说明 在进行 WebLogic 项目移植到 Tomcat 之前,需要确保已经成功安装了 Tomcat。下面将对 WebLogic 项目移植到 Tomcat 的配置进行详细说明。 配置 Tomcat 1. 在 Tomcat 安装目录...
项目框架从 Tomcat 移植到 WebLogic 需要注意以下几个方面: 1. JDK 版本:由于项目使用 JDK 1.5 版本,因此需要使用 WebLogic 9 或以上版本。这里使用 WebLogic 10 作为示例。 2. 部署项目:从 MyEclipse 部署...
### Tomcat移植到WebLogic问题及解决方法 #### 背景 在IT项目开发过程中,经常需要将现有的应用程序从一种应用服务器环境移植到另一种环境中。例如,将使用Tomcat作为应用服务器的Java Web应用程序移植到WebLogic...
### 知识点详解:“TOMCAT移植到JBOSS” ...通过以上步骤和注意事项的详述,我们可以看到从TOMCAT移植到JBOSS不仅是一个技术性的转换过程,也是一个涉及系统架构、配置管理和性能优化的综合性项目。
在将 Tomcat 环境下的应用移植到 WebLogic 下的过程中,遇到了第一个问题,那就是意外的异常错误。在处理请求时出现意外的异常情况,消息堆栈跟踪显示了异常的 StackTrace。解决办法是修改 WebLogic 的虚拟内存调大...
在将应用从Tomcat环境移植到WebLogic 10及Oracle Linux时,开发者经常会遇到一些挑战。本篇文章将深入探讨这些问题及其解决方案。 首先,我们遇到的第一个问题是“意外的异常”,表现为NullPointerException。这个...
在将应用从Tomcat环境移植到WebLogic 10及Oracle Linux时,开发者经常会遇到一些挑战。以下是一些关键知识点的详细说明: 1. **Java虚拟机(JVM)内存配置**: - 当将大型应用部署到WebLogic时,可能会遇到`...
在将应用从Tomcat移植到WebLogic 10并部署在Oracle Linux环境下时,开发者可能会遇到一系列挑战。本文档详细记录了在迁移过程中遇到的主要问题及其解决方案。 首先,遇到的第一个问题是“错误一:意外的异常”。这...
这个东东 是我们项目里面改版的 之前在项目里面 是Windows下面的 tomcat里面 开发的 但是 后来移植到weblogic下面后 就出现乱码 还有 就是 页面无法正常显示。于是就改了 这个 sitemesh 包。
10. **升级与迁移**:从Tomcat 1.6升级到更高版本时,需要注意兼容性问题,以及新的特性和改进。 综上所述,"TOMcat-v1.6.zip" 压缩包中的主要内容应为Tomcat服务器的1.6版本,尽管提供的文件列表中包含了一个看似...
综上所述,选择WebLogic还是Tomcat取决于具体项目的需求。如果需要完整的J2EE功能和企业级的支持,WebLogic可能是更好的选择;而对于轻量级应用或者预算有限的项目,Tomcat则足够胜任,并且有着广泛的用户基础和社区...
10. **Docker**:Docker提供了一种轻量级的虚拟化方式,使得应用程序及其依赖环境可以被封装到容器中,便于部署和移植。 以上这些开源项目在J2EE开发中起着至关重要的作用,它们各自解决了开发中的特定问题,同时也...
7. **Web应用服务环境**:描述Web服务器、应用服务器的选择及配置,如Tomcat、WebLogic等。 8. **系统流程设计**:详细描绘业务流程和数据流,确保流程的合理性与效率。 ### 关键技术解决方案 这部分通常会涵盖...
将项目从 Windows 环境移植到 Linux 后,遇到了一系列新的挑战,包括但不限于 struts 配置文件未被正确加载等问题。 **问题详情及解决方法:** 1. **Action 请求未被响应**:struts 配置文件未能正确加载,初步...
8. **容器与服务器**:J2EE应用通常运行在特定的容器(如Tomcat、Glassfish、WebLogic)中,这些容器提供运行时环境和J2EE服务。开发者需要了解如何将项目部署到这些服务器上,并进行调试和性能优化。 9. **框架...
在Servlet容器方面,常见的有IBM的WebSphere、Oracle的WebLogic(原BEA公司的产品)、Red Hat的JBoss和Apache的Tomcat。WebSphere和WebLogic是商业产品,提供全面的企业级服务,而JBoss主要通过提供服务盈利,Tomcat...
8. **容器**:MyEclipse作为开发工具,内建了Tomcat、WebLogic等应用服务器容器,这些容器负责管理和运行J2EE组件。 **网上办公系统功能模块** 1. **用户管理**:注册、登录、权限分配等功能,确保不同角色的用户...
除此之外,标书还可能包含数据库设计、安全策略、性能优化、测试计划等方面的内容,这些都将直接影响到项目的质量和成功度。因此,在编写和评审这样的技术标书时,必须深入理解并评估每一项技术决策对整个项目的影响...
常见的J2EE容器有Tomcat(仅支持Web层)、Jetty和完整的应用服务器如WebLogic、WebSphere和GlassFish。 四、开发工具与框架 在实际开发中,开发者通常会使用IDE如Eclipse或IntelliJ IDEA,配合Maven或Gradle构建...