解决SpringBoot多模块发布时99%的问题

新闻 前端
本文归纳了以下 8 个原则和发布时经常出现的 4 个问题的解决方案,掌握了这些原则和解决方案,几乎可以解决绝大数 SpringBoot 发布问题。
 解决SpringBoot多模块发布时99%的问题?

如果使用的是 SpringBoot 多模块的项目,在发布的时候可能遇到各种各样的问题。本文归纳了以下 8 个原则和发布时经常出现的 4 个问题的解决方案,掌握了这些原则和解决方案,几乎可以解决绝大数 SpringBoot 发布问题。

SpringBoot 多模块发布的 8 大原则

1.在发布模块打包,而不是父模块上打包

比如,以下项目目录:

解决SpringBoot多模块发布时99%的问题?

如果要发布 api 就直接在它的模块上打包,而不是在父模块上打包。

2 .公共调用模块,打包类型设置为 jar 格式

公共模块,比如 common 和 model 需要设置 packaging 为 jar 格式,在 pom.xml 配置:

  1. <packaging>jar</packaging> 

3 .发布模块打包类型设置为 war 格式

在发布的模块 pom.xml 中设置:

  1. <packaging>war</packaging> 

4 .排除内置 tomcat

在发布的模块 pom.xml 中设置:

  1. <dependency> 
  2.  <groupId>org.springframework.boot</groupId> 
  3.  <artifactId>spring-boot-starter-tomcat</artifactId> 
  4.  <scope>provided</scope> 
  5. </dependency> 

当设置 scope=provided 时,此 jar 包不会出现在发布的项目中,从而就排除了内置的 tomcat。

5 .设置启动类

此步骤相当于告诉 tomcat 启动的入口在哪。需要在启动类添加如下代码:

  1. @SpringBootApplication 
  2. public class ApiApplication extends SpringBootServletInitializer { 
  3.  @Override 
  4.  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
  5.  return application.sources(ApiApplication.class); 
  6.  } 
  7.  public static void main(String[] args) { 
  8.  SpringApplication.run(ApiApplication.class, args); 
  9.  } 

6 .如果使用拦截器一定要排除静态文件

比如我在项目中使用了 swagger,那我就需要排除 swagger 的静态文件,代码如下:

  1. @Configuration 
  2. public class WebMvcConfig extends WebMvcConfigurationSupport { 
  3.  @Override 
  4.  protected void addResourceHandlers(ResourceHandlerRegistry registry) { 
  5.  // 排除静态文件 
  6.  registry.addResourceHandler("swagger-ui.html"
  7.  .addResourceLocations("classpath:/META-INF/resources/"); 
  8.  registry.addResourceHandler("/webjars/**"
  9.  .addResourceLocations("classpath:/META-INF/resources/webjars/"); 
  10.  } 
  11.  // do something 

7 .先装载公共模块,再发布项目

如果发布的模块引用了本项目的其他公共模块,需要先把本项目的公共模块装载到本地仓库。

操作方式,双击父模块的 install 即可, install 成功之后,点击发布模块的 package 生成 war 包,就完成了项目的打包,如下图所示:

解决SpringBoot多模块发布时99%的问题?

8 .部署项目

有了 war 包之后,只需要把单个 war 包,放入 tomcat 的 webapps 目录,重新启动 tomcat 即可,如下图所示:

解决SpringBoot多模块发布时99%的问题?

项目正常运行会在 webapps 目录下生成同名的文件夹,如下图所示:

解决SpringBoot多模块发布时99%的问题?

完成以上配置,就可以 happy 的访问自己发布的项目了。

可能出现的问题和解决方案

问题一:SpringBoot 配置了端口号影不影响程序发布?

答:不影响,配置的 server.port 会被覆盖,以 tomcat 本身的端口号为准,tomcat 端口号在 tomcat/config/server.xml 文件中配置。

问题二:发布报错,不能找到其他模块或项目中的公共模块,怎么办?

答:因为没有执行父节点 maven 的 install 操作,install 就是把公共模块放入本地仓库,提供给其它项目使用。

问题三:不能找到 SpringBoot 运行的 main 类,怎么办?

答:因为没有设置启动类导致的,设置方式:

  • pom.xml 配置启动类,配置 configuration><mainClass>com.bi.api.ApiApplication</mainClass></configuration> 。
  • 启动类继承 SpringBootServletInitializer 实现 SpringApplicationBuilder 方法,具体代码参考文中第五部分。

问题四:把 SpringBoot 项目部署到 Tomcat 7 一直提示找不到 xxx.jar 包?

答:这是因为 SpringBoot 版本太高,tomcat 版本太低的原因。如果你使用的是***版的 SpringBoot,可以考虑把 tomcat 也升级为 tomcat 8.x+ ***的版本,就可以解决这个问题。

责任编辑:张燕妮 来源: 简书
相关推荐

2020-05-27 20:44:36

Windows 10WindowsU盘

2024-09-18 15:50:59

Docker容器日志

2023-12-13 18:46:51

Docker容器进程

2019-04-22 12:25:40

UbuntuLinux IP地址

2015-05-04 17:24:28

dockerlibnetwork网络管理

2021-01-07 08:43:11

微服务pipelineGitLabGroup

2024-10-29 16:41:24

SpringBoot跨域Java

2016-12-12 12:55:24

模块分析解决

2020-02-17 10:19:28

电脑WindowsWindows 10

2024-11-04 13:17:12

2016-09-23 11:08:35

前端Javascript模块化

2022-02-16 08:50:51

web自动化测试python

2010-04-02 10:29:02

CentOS安装

2020-09-19 15:47:32

华为智能微模块5.0数字能源

2018-07-10 10:50:03

数字体验数字性能数字体验管理

2018-06-29 16:00:05

SUSE

2010-07-27 09:06:11

Ruby on Rai

2011-07-19 12:53:37

MySQLNPTL

2009-12-28 14:15:06

ADO连接

2011-11-23 09:41:32

苹果iOS 5
点赞
收藏

51CTO技术栈公众号