若是使用 SpringBoot 多模块发布到外部 Tomcat,可能会遇到各类各样的问题。本文概括了如下 8 个原则和发布时常常出现的 4 个问题的解决方案,掌握了这些原则和解决方案,几乎能够解决绝大数 SpringBoot 发布问题。html
好比,如下项目目录:
若是要发布 api
就直接在它的模块上打包,而不是在父模块上打包。java
公共模块,好比 common
和 model
须要设置 packaging
为 jar
格式,在 pom.xml
配置:web
<packaging>jar</packaging>
在发布的模块 pom.xml
中设置:spring
<packaging>war</packaging>
在发布的模块 pom.xml
中设置:api
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
当设置 scope=provided
时,此 jar 包不会出如今发布的项目中,从而就排除了内置的 tomcat。tomcat
此步骤至关于告诉 tomcat 启动的入口在哪。须要在启动类添加以下代码:app
@SpringBootApplication public class ApiApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(ApiApplication.class); } public static void main(String[] args) { SpringApplication.run(ApiApplication.class, args); } }
好比我在项目中使用了 swagger,那我就须要排除 swagger 的静态文件,代码以下:webapp
@Configuration public class WebMvcConfig extends WebMvcConfigurationSupport { @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { // 排除静态文件 registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); } // do something }
若是发布的模块引用了本项目的其余公共模块,须要先把本项目的公共模块装载到本地仓库。
操做方式,双击父模块的 install
便可, install
成功以后,点击发布模块的 package
生成 war 包,就完成了项目的打包,以下图所示:maven
有了 war 包以后,只须要把单个 war 包,放入 tomcat 的 webapps 目录,从新启动 tomcat 便可,以下图所示:
项目正常运行会在 webapps 目录下生成同名的文件夹,以下图所示:
完成以上配置,就能够 happy 的访问本身发布的项目了。ide
答:不影响,配置的 server.port
会被覆盖,以 tomcat 自己的端口号为准,tomcat 端口号在 tomcat/config/server.xml
文件中配置。
答:由于没有执行父节点 maven 的 install 操做,install 就是把公共模块放入本地仓库,提供给其它项目使用。
答:由于没有设置启动类致使的,设置方式:
configuration><mainClass>com.bi.api.ApiApplication</mainClass></configuration>
。SpringBootServletInitializer
实现 SpringApplicationBuilder
方法,具体代码参考文中第五部分。答:这是由于 SpringBoot 版本过高,tomcat 版本过低的缘由。若是你使用的是最新版的 SpringBoot,能够考虑把 tomcat 也升级为 tomcat 8.x+ 最新的版本,就能够解决这个问题。