You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by James Dekker <ja...@gmail.com> on 2007/01/14 12:20:51 UTC
Help loading XML config file via Init Servlet
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
Re: Help loading XML config file via Init Servlet
Posted by David Smith <dn...@cornell.edu>.
I think you are really after this.class.getResourceAsStream(
"org/coffeebreak/config/attributes-config.xml" ) ; which would use the
classloader to locate your xml file in WEB-INF/classes or your jar file
and return an InputStream to it.
--David
James Dekker wrote:
> Robert,
>
> The problem with the getRealPath() is that I have the undeployWars
> set to false in server.xml
> and getRealPath() is just for raw File I / O, it can't be used to
> read from a jar file...
>
> Thanks for the suggestion, nonetheless!
>
> Sincerely,
>
> James Dekker
>
> On Jan 15, 2007, at 4:54 AM, robert lazarski wrote:
>
>> On 1/14/07, James Dekker <ja...@gmail.com> wrote:
>>
>>> 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
>>
>>
>> Try using getRealPath() . Here's some code a wrote a while back:
>>
>> /**
>> * Load log4j
>> *
>> * @web.servlet
>> * display-name="log4j-init"
>> * load-on-startup="1"
>> * name="com.infoseg.mr.xtutil.Log4jInit"
>> *
>> * @web.servlet-init-param name="log4j-init-file"
>> * value="WEB-INF/properties/log4j.properties"
>> *
>> */
>>
>> public class Log4jInit extends HttpServlet
>> {
>> public void init()
>> {
>> String prefix = getServletContext().getRealPath("/");
>> String file = getInitParameter("log4j-init-file");
>> // if the log4j-init-file is not set, then no point in trying
>> if(file != null)
>> {
>> PropertyConfigurator.configure(prefix+file);
>> }
>> else
>> {
>> throw new RuntimeException("Cannot load InitParameter from
>> web.xml: log4j-init-file");
>> }
>> }
>>
>> public void doGet(HttpServletRequest req, HttpServletResponse
>> res) {}
>>
>> HTH,
>> Robert
>>
>> ---------------------------------------------------------------------
>> To start a new topic, e-mail: users@tomcat.apache.org
>> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
>> For additional commands, e-mail: users-help@tomcat.apache.org
>>
>
>
> ---------------------------------------------------------------------
> To start a new topic, e-mail: users@tomcat.apache.org
> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: users-help@tomcat.apache.org
>
---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org
Re: Help loading XML config file via Init Servlet
Posted by James Dekker <ja...@gmail.com>.
Robert,
The problem with the getRealPath() is that I have the undeployWars
set to false in server.xml
and getRealPath() is just for raw File I / O, it can't be used to
read from a jar file...
Thanks for the suggestion, nonetheless!
Sincerely,
James Dekker
On Jan 15, 2007, at 4:54 AM, robert lazarski wrote:
> On 1/14/07, James Dekker <ja...@gmail.com> wrote:
>> 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
>
> Try using getRealPath() . Here's some code a wrote a while back:
>
> /**
> * Load log4j
> *
> * @web.servlet
> * display-name="log4j-init"
> * load-on-startup="1"
> * name="com.infoseg.mr.xtutil.Log4jInit"
> *
> * @web.servlet-init-param name="log4j-init-file"
> * value="WEB-INF/properties/log4j.properties"
> *
> */
>
> public class Log4jInit extends HttpServlet
> {
> public void init()
> {
> String prefix = getServletContext().getRealPath("/");
> String file = getInitParameter("log4j-init-file");
> // if the log4j-init-file is not set, then no point in trying
> if(file != null)
> {
> PropertyConfigurator.configure(prefix+file);
> }
> else
> {
> throw new RuntimeException("Cannot load InitParameter from
> web.xml: log4j-init-file");
> }
> }
>
> public void doGet(HttpServletRequest req, HttpServletResponse
> res) {}
>
> HTH,
> Robert
>
> ---------------------------------------------------------------------
> To start a new topic, e-mail: users@tomcat.apache.org
> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: users-help@tomcat.apache.org
>
---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org
Re: Help loading XML config file via Init Servlet
Posted by robert lazarski <ro...@gmail.com>.
On 1/14/07, James Dekker <ja...@gmail.com> wrote:
> 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
Try using getRealPath() . Here's some code a wrote a while back:
/**
* Load log4j
*
* @web.servlet
* display-name="log4j-init"
* load-on-startup="1"
* name="com.infoseg.mr.xtutil.Log4jInit"
*
* @web.servlet-init-param name="log4j-init-file"
* value="WEB-INF/properties/log4j.properties"
*
*/
public class Log4jInit extends HttpServlet
{
public void init()
{
String prefix = getServletContext().getRealPath("/");
String file = getInitParameter("log4j-init-file");
// if the log4j-init-file is not set, then no point in trying
if(file != null)
{
PropertyConfigurator.configure(prefix+file);
}
else
{
throw new RuntimeException("Cannot load InitParameter from
web.xml: log4j-init-file");
}
}
public void doGet(HttpServletRequest req, HttpServletResponse
res) {}
HTH,
Robert
---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org