我有一个带有Web应用程序的war存档。我想在Spring Boot应用程序中启动该应用程序。因此,我遵循了that question的建议:
@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
return new TomcatEmbeddedServletContainerFactory() {
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(Tomcat tomcat) {
try {
tomcat.addWebapp("blog", "/tmp/roller.war");
} catch (ServletException ex) {
throw new IllegalStateException("Failed to add webapp", ex);
}
return super.getTomcatEmbeddedServletContainer(tomcat);
}
};
}
除非战争没有被提取,否则效果很好:
无法创建目录[/tmp/tomcat.9153500015669016883.8080/webapps/blog]
这是tomcat工作目录的布局:
$ find /tmp/tomcat.9153500015669016883.8080/
/tmp/tomcat.9153500015669016883.8080/
/tmp/tomcat.9153500015669016883.8080/work
/tmp/tomcat.9153500015669016883.8080/work/Tomcat
/tmp/tomcat.9153500015669016883.8080/work/Tomcat/localhost
/tmp/tomcat.9153500015669016883.8080/work/Tomcat/localhost/blog
/tmp/tomcat.9153500015669016883.8080/work/Tomcat/localhost/ROOT
breakpoint in ExpandWar.expand()
表示它想在webapps /中创建一个目录。此不存在的webapps文件夹取自Host.getAppBaseFile()
(来自ContextConfig.context
)。
所以对我来说,看起来很奇怪,配置它应该扩展到work / Tomcat / localhost / blog。我怎么能这样做?
答案 0 :(得分:3)
这似乎与Spring无关,而是嵌入式tomcat的预期行为。我找到了this related issue:
用户需要为主机的appBase定义一个有效的目录。
因此,只需在部署之前创建默认的appBase目录即可:
tomcat.getHost().getAppBaseFile().mkdir();
tomcat.addWebapp("blog", "/tmp/roller.war");