Hi everyone,
I was playing with embedded Tomcat 8.0.33 and I noticed something
unexpected.
If I create my embedded Tomcat like this:
Tomcat tomcat = new Tomcat();
tomcat.setPort(8080);
tomcat.setBaseDir("myBaseDir");
start the server and then try to programmatically deploy a webapp like this:
tomcat.addWebapp(tomcat.getHost(), "/foo", "<absolute path to foo.war>");
I get:
java.io.IOException: Unable to create the directory
[/my-path/myBaseDir/webapps/foo]
at org.apache.catalina.startup.ExpandWar.expand(ExpandWar.java:115)
~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at
org.apache.catalina.startup.ContextConfig.fixDocBase(ContextConfig.java:619)
[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at
org.apache.catalina.startup.ContextConfig.beforeStart(ContextConfig.java:752)
[tomcat-embed-core-8.0.33.jar!/:8.0.33]
...
If I programmatically create the folder "webapps" in my baseDir after
starting tomcat but before deploying the webapp everything works fine.
So I checked the line of code which throws the exception in the class
org.apache.catalina.startup.ExpandWar:
[line 113] // Create the new document base directory
[line 114] if(!docBase.mkdir() && !docBase.isDirectory()) {
[line 115] throw new IOException(sm.getString("expandWar.createFailed",
docBase));
[line 116] }
and I guess if the "mkdirs" method was used instead of "mkdir" everything
would work.
The questions are:
- is it done on purpose? (not creating the webapps folder within the
baseDir when needed e.g. when an application is programmatically deployed)
- if yes, what is the reason beyond this technical decision?
Thanks in advance,
Fabrizio