Ok, I got it working but in doing so I found a couple of weaknesses in the
WebXmlReader class (it is difficult to extend), I think. I think that there
might be room here for improvements in tomcat, flexibility could be added
without breaking the requirements of the spec. I realize that there are
proper ways to get the behaviour I want but supporting multiple contexts
from one web-app is pretty convenient in this case.
What I wanted to do was add an attribute to my context specifying the name
of the the web-app descriptor. If the attribute is not specified then tomcat
would implicitly load web.xml.
<?xml version="1.0" encoding="ISO-8859-1"?>
<webapps>
<Context path="/pub"
docBase="webapps/myapp"
descriptor="pub.xml"
crossContext="false"
debug="0"
reloadable="true">
</Context>
</webapps>
I then wanted to sub-class WebXmlReader and provide my own implementation of
contextInit(Context ctx) that would get the descriptor file from the Context
and read that file.
This seems like it would be a pretty clean implementation to me but I could
not do it for a couple reasons:
1) I did not have the time to properly reasearch how "descriptor" attrib
would be parsed and stored in Context.java. I'm sure though that you guys
who know how it all works could implement that in a snap.
2) I had trouble sub-classing WebXmlReader. The method "processWebXmlFile()"
is package private and must be called. If it were protected I dont thing I
would have had any trouble. If anything please open up the access on this
method.
I eventually hacked up an implementation that works for me but is definately
not good. I actually just modified WebXmlReader so that it gets the Path
from the Context, builds the xml file name from the path (in my case it
assumes pub.xml because the path is /pub) and if that file exists it reads
that one, if not it reads web.xml. I then just found it easiest to rebuilt
the whole facade22.jar and updated it in lib/container.
Is this the sort of change you guys would be willing to make in Tomcat? Or
would something like this not fly because its not in the spec?
Thanks for all of your advice on this one Larry
Matt
-----Original Message-----
From: Larry Isaacs [mailto:[EMAIL PROTECTED]]
Sent: Tuesday, September 11, 2001 5:19 AM
To: '[EMAIL PROTECTED]'
Subject: RE: Two contexts sharing one WebApp
Hi Matt,
Congratulations on getting this far. Off the top of my head, I'm
not sure if "tomcat/classes" is supported. I'll try to review
what methods are available to add classes rather than jars to
Tomcat 3.3's classloader hierarchy. I suspect there is room for
improvement here.
In the meantime, the simplest way to add your class to Tomcat 3.3
is to put it in a jar and put that jar in the "tomcat/lib/container"
directory. This will get your class into the correct classloader.
Cheers,
Larry
> -----Original Message-----
> From: Matt Small [mailto:[EMAIL PROTECTED]]
> Sent: Monday, September 10, 2001 6:11 PM
> To: '[EMAIL PROTECTED]'
> Subject: RE: Two contexts sharing one WebApp
>
>
> Ok, so I extended WebXmlReader and added the functionality I need and
> compiled it. I added the class to /tomcat/classes/. I updated
> my modules.xml
> and server.xml to use my new CustWebXmlReader. I think
> everything is set up
> right.
>
> When I start Tomcat I get A class not found Exception though:
>
> E:\scripts>ERROR reading
> E:\jakarta-tomcat-3.3-b2\conf\server.xml
> At Line 28 /Server/ContextManager/CustWebXmlReader/
> validate=true
>
> java.lang.ClassNotFoundException:
> org.apache.tomcat.facade.CustWebXmlReader
> at
> java.net.URLClassLoader$1.run(URLClassLoader.java:200)
> at java.security.AccessController.doPrivileged(Native
> Method)
> at
> java.net.URLClassLoader.findClass(URLClassLoader.java:188)
>
> According to the user docs, if you make a classes dir: "Any
> class that you
> add to this directory will find its place in Tomcat's
> classpath." Am I doing
> something wrong here. I would prefer not to have to re-jar
> all of the tomcat
> classes.
>
> Thanks
>
> Matt
>
> -----Original Message-----
> From: Larry Isaacs [mailto:[EMAIL PROTECTED]]
> Sent: Monday, September 10, 2001 11:26 AM
> To: '[EMAIL PROTECTED]'
> Subject: RE: Two contexts sharing one WebApp
>
>
> Hi Matt,
>
> Use of web.xml is mandated by the Servlet 2.2 spec, so there
> isn't supposed to be a way to do what you want. However,you are
> welcome to try customizing org.apache.tomcat.facade.WebXmlReader
> to make a choice somehow.
>
> Cheers,
> Larry
>
>
> > -----Original Message-----
> > From: Matt Small [mailto:[EMAIL PROTECTED]]
> > Sent: Monday, September 10, 2001 2:11 PM
> > To: Tomcat (E-mail)
> > Subject: Two contexts sharing one WebApp
> >
> >
> >
> > I have my tomcat server set up with two contexts that share
> > the same web-app
> > directory. I want to specify a different web.xml in each
> > context though so
> > that different servlets are available from each context. Is
> > there any way to
> > specify the web.xml file name or path from the context
> > definition? I am
> > hoping that there is just a simple config line for this. I
> > know I get the
> > behavior I want by building my code into two different
> > web-apps, but I want
> > to keep my build file simple. I am using Tomcat 3.3 beta 2.
> >
> > Thanks,
> > Matt
> >
>