Hi, 

  this is a question about embedding Tomcat into an application so that
it can still be configured using server.xml and web applications can be
added or removed programmatically.

  I am using Tomcat 6.0.24.

  The way I tried to make it work is by instantiating an instance of
Catalina, feeding in all necessary config and then adding
StandardContext instances as needed to a named host of a named service
etc. However there is a bug (I believe) in Catalina that made me
subclass Catalina and add a getServer() method:

public class MyCatalina extends Catalina {
        public Server getServer() {
                return this.server;
        }
}

  This is due to Catalina declaring its own protected member variable
"server" and a corresponding "setServer" method, while Catalina's super
class Embedded has a private member "server" and a "getServer" method,
so that Catalina sets its "service" member, but when asking, will return
super.server which is consistently null.

  With that fix, the sample code below works as expected. Still: As I
ran into the problem noted above, I was wondering whether the whole
approach makes sense or whether there is a better way of using
server.xml while embedding tomcat but without using the Catalina class.

Thanks,
  Henning

Sample code:

// 
//
MyCatalina c = new MyCatalina();
File cf = new File("conf/server.xml");
c.setConfig(cf.getAbsolutePath());
c.setUseShutdownHook(false);
c.setAwait(false);
c.start();

// add a web app from a folder
File wc = new File("webapp");
StandardContext sc = (StandardContext)
c.createContext("/test",wc.getAbsolutePath());
File wd = new File("work");
if (!wd.exists()) {
    wd.mkdir();
}
sc.setWorkDir(wd.getAbsolutePath());
// could be made configurable!
Container ch =
c.getServer().findService("Catalina").getContainer().findChild("localhost");
ch.addChild(sc);



Reply via email to