Hello there,
I am using the Apache Commons Digester to load an XML config file via
a servlet with init params...
I keep getting this error when I start Tomcat 5.5.9 and have deployed
the war file via my build script:
INFO: Deploying web application archive coffeebreak.war
2007-01-14 03:10:33,050 WARN
[org.coffeebreak.logging.Log4jInitServlet] - Loaded: log4j.properties
file
attributes-config.xml not found, /Developer/JavaTools/tomcat/jakarta-
tomcat-5.5.9/bin/WEB-INF/classes/org/coffeebreak/config/attributes-
config.xml
2007-01-14 03:10:33,074 WARN
[org.coffeebreak.helper.AttributeBeanXmlConfigHelper] - rules: null
org.apache.commons.digester.xmlrules.XmlLoadException
at org.apache.commons.digester.xmlrules.FromXmlRuleSet
$URLXMLRulesLoader.loadRules(FromXmlRuleSet.java:199)
at
org.apache.commons.digester.xmlrules.FromXmlRuleSet.addRuleInstances
(FromXmlRuleSet.java:176)
at
org.apache.commons.digester.xmlrules.FromXmlRuleSet.addRuleInstances
(FromXmlRuleSet.java:141)
at org.apache.commons.digester.Digester.addRuleSet(Digester.java:1998)
at org.apache.commons.digester.xmlrules.DigesterLoader.createDigester
(DigesterLoader.java:80)
at org.coffeebreak.helper.AttributeBeanXmlConfigHelper.parse
(AttributeBeanXmlConfigHelper.java:29)
at org.coffeebreak.config.XmlConfigInitServlet.init
(XmlConfigInitServlet.java:22)
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)
Caused by: java.lang.NullPointerException
at org.apache.commons.digester.xmlrules.FromXmlRuleSet
$URLXMLRulesLoader.loadRules(FromXmlRuleSet.java:197)
... 33 more
java.lang.NullPointerException
at org.apache.commons.digester.xmlrules.FromXmlRuleSet
$URLXMLRulesLoader.loadRules(FromXmlRuleSet.java:197)
at
org.apache.commons.digester.xmlrules.FromXmlRuleSet.addRuleInstances
(FromXmlRuleSet.java:176)
at
org.apache.commons.digester.xmlrules.FromXmlRuleSet.addRuleInstances
(FromXmlRuleSet.java:141)
at org.apache.commons.digester.Digester.addRuleSet(Digester.java:1998)
at org.apache.commons.digester.xmlrules.DigesterLoader.createDigester
(DigesterLoader.java:80)
at org.coffeebreak.helper.AttributeBeanXmlConfigHelper.parse
(AttributeBeanXmlConfigHelper.java:29)
at org.coffeebreak.config.XmlConfigInitServlet.init
(XmlConfigInitServlet.java:22)
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)
java.lang.NullPointerException
at org.coffeebreak.helper.AttributeBeanXmlConfigHelper.parse
(AttributeBeanXmlConfigHelper.java:38)
at org.coffeebreak.config.XmlConfigInitServlet.init
(XmlConfigInitServlet.java:22)
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)
2007-01-14 03:10:33,687 WARN
[org.coffeebreak.config.ErrorInitServlet] - Loaded: error.properties
INFO: Server startup in 15130 ms
As one can see there's an obvious pathing issue:
/Developer/JavaTools/tomcat/jakarta-tomcat-5.5.9/bin/WEB-INF/classes/
org/coffeebreak/config/attributes-config.xml
As one can see there's an obvious pathing issu
Where does the tomcat_home/bin/... come from? The "bin" directory is
not supposed to be there!
Here's the specific target from my build script which places
attributes-config.xml into tomcat_home/WEB-INF/classes/org/
coffeebreak/config:
<target name="static" depends="prepare">
<!-- Copy web files -->
<copy todir="${webapp.build.dir}/">
<fileset dir="web" />
</copy>
<!-- Copy webapp configuration files -->
<copy todir="${webapp.build.dir}/WEB-INF/">
<fileset dir="etc" />
</copy>
<!-- Copy library files -->
<copy todir="${webapp.build.dir}/WEB-INF/lib/">
<fileset dir="lib" />
</copy>
<!-- Copy properties files -->
<copy todir="${webapp.build.dir}/WEB-INF/classes/">
<fileset dir="props" />
</copy>
<!-- Copy config files -->
<copy todir="${webapp.build.dir}/WEB-INF/classes/org/
coffeebreak/config/">
<fileset dir="config" />
</copy>
<!-- Copy rules files -->
<copy todir="${webapp.build.dir}/WEB-INF/classes/org/
coffeebreak/helper/">
<fileset dir="rules" />
</copy>
</target>
Here's my deployment descriptor (web.xml) file:
<!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>Coffee Break</display-name>
<description>
CoffeeBreak Application
</description>
<servlet>
<servlet-name>CoffeeBreakServlet</servlet-name>
<servlet-class>org.coffeebreak.CoffeeBreakServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CoffeeBreakServlet</servlet-name>
<url-pattern>/app</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>log4j-init</servlet-name>
<servlet-class>org.coffeebreak.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</servlet-name>
<servlet-class>org.coffeebreak.config.XmlConfigInitServlet</
servlet-class>
<init-param>
<param-name>xml-config-file</param-name>
<param-value>WEB-INF/classes/org/coffeebreak/config/
attributes-config.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet>
<servlet-name>error-init</servlet-name>
<servlet-class>org.coffeebreak.config.ErrorInitServlet</
servlet-class>
<init-param>
<param-name>error-init-file</param-name>
<param-value>WEB-INF/classes/error.properties</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
</web-app>
Here's my init servlet for the XML file:
package org.coffeebreak.config;
import org.apache.log4j.Logger;
import org.coffeebreak.helper.AttributeBeanXmlConfigHelper;
import java.io.File;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
public class XmlConfigInitServlet extends HttpServlet {
public void init() throws ServletException {
String file = getInitParameter("xml-config-file");
File xmlConfigFile = new File(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();
}
}
}
My helper file (which is showing that the rules file is not loading):
package org.coffeebreak.helper;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.digester.Digester;
import org.apache.commons.digester.xmlrules.DigesterLoader;
import org.apache.log4j.Logger;
import org.coffeebreak.model.AttributeBean;
import org.xml.sax.SAXException;
public class AttributeBeanXmlConfigHelper {
private static List<AttributeBean> attributeConfigList = null;
public static void parse(File xmlConfigFile) throws IOException,
SAXException {
URL rules = AttributeBeanXmlConfigHelper.class
.getResource("attributes-rules.xml");
Logger.getLogger(AttributeBeanXmlConfigHelper.class).warn(
"rules: " + rules);
Digester digester = null;
try {
digester = DigesterLoader.createDigester(rules);
}
catch (Throwable e) {
e.printStackTrace();
e.getCause().printStackTrace();
}
// Push empty List onto Digester's Stack
attributeConfigList = new ArrayList<AttributeBean>();
digester.push(attributeConfigList);
// Parse the XML document
InputStream input = new FileInputStream(xmlConfigFile);
digester.parse(input);
}
public static List<AttributeBean> getConfig() {
return attributeConfigList;
}
}
What could I possibly be doing wrong?
Why is it stating this when I start Tomcat:
attributes-config.xml not found, /Developer/JavaTools/tomcat/jakarta-
tomcat-5.5.9/bin/WEB-INF/classes/org/coffeebreak/config/attributes-
config.xml
it should be without the bin directory:
/Developer/JavaTools/tomcat/jakarta-tomcat-5.5.9/WEB-INF/classes/org/
coffeebreak/config/attributes-config.xml
Why is the rules file coming out as null?
2007-01-14 03:10:33,074 WARN
[org.coffeebreak.helper.AttributeBeanXmlConfigHelper] - rules: null
WIth thanks!
James Dekker