Java Mailing List Archive

http://www.junlu.com/

Home » Home (12/2007) » Apache Tomcat »

Re: Helping setting appropriate prefix when using ServletContext.getResourceAsStream()

James Dekker

2006-12-22

Replies:

Dear Chuck Caldarale & Others,

Thank you for your response!

Chuck - Your e-mail was very informative... I did remove the
servlet-apis from my %CATALINA_HOME%/mywebapp/%WEB-INF/lib directory.
The only reason I had it there was because I use Eclipse for
development and its easier to configure the build path by clicking on
"Add Jar" rather than clicking on "Add External Jar". But I took your
advice and removed it and now use "Add External Jar".

Here's my situation...

I changed my Ant build script to move the log4j.properties file into
my WEB-INF/classes dir. Also, my log4j-1.2.9.jar gets moved inside my
WEB-INF/lib dir. But for some odd reason, when I run Tomcat, it
doesn't seem to know where my log4j.properties file is! My
Log4jInitServlet seems to have the path wrong!

It looks inside:

C:\DevTools\tomcat\jakarta-tomcat-5.5.9\bin\WEB-INF\classes\log4j.properties

instead of:

C:\DevTools\tomcat\jakarta-tomcat-5.5.9\mywebapp\WEB-INF\classes\log4j.properties.

Furthermore, it throws a NullPointerException but at the same time,
right afterwards, it logs my XmlConfigInitServlet (I have it set
there!).

Here's what my console says:

--------------------------------------------------------------------------------------------------------

Dec 22, 2006 9:45:05 AM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive mywebapp.war
propFile path is: WEB-INF\classes\log4j.properties
log4j.properties not found,
C:\DevTools\tomcat\jakarta-tomcat-5.5.9\bin\WEB-INF\classes\log4j.properties
2006-12-22 09:45:07,653 ERROR
[org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/mywebapp]]
- StandardWrapper.Throwable
java.lang.NullPointerException
 at java.util.Properties$LineReader.readLine(Properties.java:365)
 at java.util.Properties.load (Properties.java:293)
 at com.acme.mywebapp.logging.Log4jInitServlet.init(Log4jInitServlet.java:27)
 at javax.servlet.GenericServlet.init (GenericServlet.java:211)
 at org.apache.catalina.core.StandardWrapper.loadServlet (StandardWrapper.java:1091)
 at org.apache.catalina.core.StandardWrapper.load (StandardWrapper.java:925)
 at org.apache.catalina.core.StandardContext.loadOnStartup (StandardContext.java:3857)
 at org.apache.catalina.core.StandardContext.start (StandardContext.java:4118)
 at org.apache.catalina.core.ContainerBase.addChildInternal (ContainerBase.java:759)
 at org.apache.catalina.core.ContainerBase.addChild (ContainerBase.java:739)
 at org.apache.catalina.core.StandardHost.addChild (StandardHost.java:524)
 at org.apache.catalina.startup.HostConfig.deployWAR (HostConfig.java:788)
 at org.apache.catalina.startup.HostConfig.deployWARs (HostConfig.java:677)
 at org.apache.catalina.startup.HostConfig.deployApps (HostConfig.java:473)
 at org.apache.catalina.startup.HostConfig.start (HostConfig.java:1102)
 at org.apache.catalina.startup.HostConfig.lifecycleEvent (HostConfig.java:311)
 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent (LifecycleSupport.java:119)
 at org.apache.catalina.core.ContainerBase.start (ContainerBase.java:1020)
 at org.apache.catalina.core.StandardHost.start (StandardHost.java:718)
 at org.apache.catalina.core.ContainerBase.start (ContainerBase.java:1012)
 at org.apache.catalina.core.StandardEngine.start (StandardEngine.java:442)
 at org.apache.catalina.core.StandardService.start (StandardService.java:450)
 at org.apache.catalina.core.StandardServer.start (StandardServer.java:683)
 at org.apache.catalina.startup.Catalina.start (Catalina.java:537)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke (Method.java:585)
 at org.apache.catalina.startup.Bootstrap.start (Bootstrap.java:271)
 at org.apache.catalina.startup.Bootstrap.main (Bootstrap.java:409)
2006-12-22 09:45:07,669 ERROR
[org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/mywebapp]]
- Servlet /mywebapp threw load() exception
java.lang.NullPointerException
 at java.util.Properties$LineReader.readLine(Properties.java:365)
 at java.util.Properties.load (Properties.java:293)
 at com.acme.mywebapp.logging.Log4jInitServlet.init(Log4jInitServlet.java:27)
 at javax.servlet.GenericServlet.init (GenericServlet.java:211)
 at org.apache.catalina.core.StandardWrapper.loadServlet (StandardWrapper.java:1091)
 at org.apache.catalina.core.StandardWrapper.load (StandardWrapper.java:925)
 at org.apache.catalina.core.StandardContext.loadOnStartup (StandardContext.java:3857)
 at org.apache.catalina.core.StandardContext.start (StandardContext.java:4118)
 at org.apache.catalina.core.ContainerBase.addChildInternal (ContainerBase.java:759)
 at org.apache.catalina.core.ContainerBase.addChild (ContainerBase.java:739)
 at org.apache.catalina.core.StandardHost.addChild (StandardHost.java:524)
 at org.apache.catalina.startup.HostConfig.deployWAR (HostConfig.java:788)
 at org.apache.catalina.startup.HostConfig.deployWARs (HostConfig.java:677)
 at org.apache.catalina.startup.HostConfig.deployApps (HostConfig.java:473)
 at org.apache.catalina.startup.HostConfig.start (HostConfig.java:1102)
 at org.apache.catalina.startup.HostConfig.lifecycleEvent (HostConfig.java:311)
 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent (LifecycleSupport.java:119)
 at org.apache.catalina.core.ContainerBase.start (ContainerBase.java:1020)
 at org.apache.catalina.core.StandardHost.start (StandardHost.java:718)
 at org.apache.catalina.core.ContainerBase.start (ContainerBase.java:1012)
 at org.apache.catalina.core.StandardEngine.start (StandardEngine.java:442)
 at org.apache.catalina.core.StandardService.start (StandardService.java:450)
 at org.apache.catalina.core.StandardServer.start (StandardServer.java:683)
 at org.apache.catalina.startup.Catalina.start (Catalina.java:537)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke (Method.java:585)
 at org.apache.catalina.startup.Bootstrap.start (Bootstrap.java:271)
 at org.apache.catalina.startup.Bootstrap.main (Bootstrap.java:409)
2006-12-22 09:45:08,018 WARN
[com.acme.mywebapp.config.XmlConfigInitServlet] - Finished parsing the
config file.
Dec 22, 2006 9:45:09 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 4495 ms

--------------------------------------------------------------------------------------------------------

My Log4jInitServlet:

--------------------------------------------------------------------------------------------------------

package com.acme.mywebapp.logging;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.apache.log4j.PropertyConfigurator;

public class Log4jInitServlet extends HttpServlet {
 public void init() throws ServletException {
    Properties p = new Properties();
    String file = getInitParameter("log4j-init-file");
    File propFile = new File(file);
    System.out.println("propFile path is: " + propFile);
    try {
      InputStream is = getServletContext().getResourceAsStream("propFile");
 
      if(!propFile.exists()){
         System.out.println("log4j.properties not found, " +
propFile.getAbsolutePath());
      }
      p.load(is);
      is.close();
    } catch(IOException e) {
     e.printStackTrace();
    }
    PropertyConfigurator.configureAndWatch(propFile.getAbsolutePath(),10000);
  }
}

--------------------------------------------------------------------------------------------------------

My web.xml:

--------------------------------------------------------------------------------------------------------

<!DOCTYPE web-app
  PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

  <display-name>mywebapp</display-name>
  <description>
    My web app
  </description>

  <servlet>
   <servlet-name>MyWebAppServlet</servlet-name>
   <servlet-class>com.acme.mywebapp.MyWebAppServlet</servlet-class>
  </servlet>

  <servlet-mapping>
   <servlet-name>MyWebAppServlet</servlet-name>
   <url-pattern>/app</url-pattern>
  </servlet-mapping>

 <servlet>
    <servlet-name>log4j-init</servlet-name>
    <servlet-class>
 com.acme.mywebapp.logging.Log4jInitServlet
    </servlet-class>
    <init-param>
      <param-name>log4j-init-file</param-name>
      <param-value>WEB-INF/classes/log4j.properties</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
 </servlet>  

 <servlet>
    <servlet-name>xml-config-init</servlet-name>
    <servlet-class>
 com.acme.mywebapp.config.XmlConfigInitServlet
    </servlet-class>
    <init-param>
      <param-name>xml-config-file</param-name>
      <param-value>/WEB-INF/attributes-config.xml</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
 </servlet>

</web-app>

--------------------------------------------------------------------------------------------------------

My XmlConfigInitServlet class (as you can see that I am still using
getRealPath()) but will change it when I get my Log4jInitServlet
properly set up. For some odd reason, its logging what I have put in
here into my Tomcat's console. How could this be if Tomcat complained
that it couldn't find my log4j.properties file?

--------------------------------------------------------------------------------------------------------

package com.acme.mywebapp.config;

import java.io.File;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.apache.log4j.Logger;

import edu.ucsd.security.affiliates.model.AttributeBeanXmlConfigHelper;

public class XmlConfigInitServlet extends HttpServlet {
 
 public void init() throws ServletException {
   String prefix = getServletContext().getRealPath("/");
   String file = getInitParameter("xml-config-file");
   File xmlConfigFile = new File(prefix + file);
   if (!xmlConfigFile.exists()) {
     System.out.println("attributes-config.xml not found, "
         + xmlConfigFile.getAbsolutePath());
   }
   try {

     // Configure Digester from XML ruleset
     AttributeBeanXmlConfigHelper.parse(xmlConfigFile);
   
     Logger.getLogger(this.getClass()).warn("Finished parsing the config file.");

   } catch (Exception ex) {
     ex.printStackTrace();
   }
 }
}

--------------------------------------------------------------------------------------------------------

Here's the contents of my log4j.properties file located under
mywebapp/WEB-INF/classes:

log4j.rootCategory=WARN, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

--------------------------------------------------------------------------------------------------------

From the looks of everything, obviously there's a pathing issue in my
Log4jInitServlet but I still don't understand how it can successfully
log my XmlConfigServlet if my log4j.properties is supposed to be
unavailable?!

Can anyone suggest a better way to use getResourceAsStream()? What I
am trying to do is set my undeployWars to false in server.xml so that
Tomcat can read my log4j.properties file and my xml config file
(attributes-config.xml) from within the war file.

Many, many thanks!

Sincerely yours,

James Dekker

---------------------------------------------------------------------
To start a new topic, e-mail: users@(protected)
To unsubscribe, e-mail: users-unsubscribe@(protected)
For additional commands, e-mail: users-help@(protected)

©2008 junlu.com - Jax Systems, LLC, U.S.A.