基于springboot的web工程在打包时,一般情况下分为两种方式。一种为jar方式,这种方式包含一个嵌入式的web容器,例如tomcat或jetty。另一种方式则为war包方式。在工程实践中,我常常使用第一种jar方式,这种方式优点为部署简单。在toB业务中,实施人员不需要掌握tomcat等web容器的安装方式,减少了出错的可能性。但使用此种方式,也同时带来一个问题,springboot工程打包部署时,将web静态页及相关文件,也打入jar中,不利于现场的js页的调试和编码。
是否有办法可以将web静态资源外部化?答案是存在的。通过阅读springboot的源码,我发现在嵌入式tomcat的启动中,会经历以下步骤。
EmbeddedWebApplicationContext.createEmbeddedServletContainer()
TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer()
TomcatEmbeddedServletContainerFactory.prepareContext()
AbstractEmbeddedServletContainerFactory.getValidDocumentRoot()
AbstractEmbeddedServletContainerFactory.getCommonDocumentRoot()
最终在获取documentRoot的过程中,我们可以看到类成员,有如下定义。
private static final String[] COMMON_DOC_ROOTS = { "src/main/webapp", "public", "static" };
所以只要在${user.dir}目录下建立public或static目录,springboot的jar运行时可以加载这些目录下的web静态资源。