war包部署weblogic的Log4j支持问题

本文来自:http://www.codesky.net/article/200707/119054.html

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

Error:weblogic.management.DeploymentException:CannotsetwebapprootsystempropertywhenWARfileisnotexpanded-withnestedexception:

[java.lang.IllegalStateException:CannotsetwebapprootsystempropertywhenWARfileisnotexpanded]

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

publicstaticvoidsetWebAppRootSystemProperty(ServletContextservletContext)throwsIllegalStateException{

Stringparam=servletContext.getInitParameter(WEB_APP_ROOT_KEY_PARAM);

Stringkey=(param!=null?param:DEFAULT_WEB_APP_ROOT_KEY);

StringoldValue=System.getProperty(key);

if(oldValue!=null){

thrownewIllegalStateException("WARNING:Webapprootsystempropertyalreadyset:"+key+"="+oldValue+"-ChooseuniquewebAppRootKeyvaluesinyourweb.xmlfiles!");

}

Stringroot=servletContext.getRealPath("/");

if(root==null){

thrownewIllegalStateException("CannotsetwebapprootsystempropertywhenWARfileisnotexpanded");

}

System.setProperty(key,root);

servletContext.log("Setwebapprootsystemproperty:"+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中删除下面代码:

<listenerid="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>