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

SpringBoot 多模块发布的 8 大原则

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

比如,以下项目目录:

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

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

公共模块,比如 commonmodel 需要设置 packagingjar 格式,在 pom.xml 配置:

<packaging>jar</packaging>

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

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

<packaging>war</packaging>

4 排除内置 tomcat

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

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope>
</dependency>

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

5 设置启动类

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

@SpringBootApplication
public class ApiApplication extends SpringBootServletInitializer {@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {return application.sources(ApiApplication.class);}public static void main(String[] args) {SpringApplication.run(ApiApplication.class, args);}
}

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

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

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {@Overrideprotected 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
}

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

如果发布的模块引用了本项目的其他公共模块,需要先把本项目的公共模块装载到本地仓库。
操作方式,双击父模块的 install 即可, install 成功之后,点击发布模块的 package 生成 war 包,就完成了项目的打包,如下图所示:

8 部署项目

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

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

完成以上配置,就可以 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+ 最新的版本,就可以解决这个问题。

解决SpringBoot多模块发布时99%的问题?SpringBoot发布的8个原则和4个问题的解决方案相关推荐

  1. springboot公共模块打包_解决SpringBoot多模块发布时99%的问题?

    每天都会分享Java架构文章,喜欢的朋友关注我.ps:文末有彩蛋,惊喜等着你 如果使用的是 SpringBoot 多模块的项目,在发布的时候可能遇到各种各样的问题.本文归纳了以下 8 个原则和发布时经 ...

  2. 解决 Gradle 进行多模块开发时,模块相互依赖的问题

    问题背景 在使用多模块开发时,通常一个模块(A)可能会需要其它模块(B)中的类或方法,这时就产生了依赖关系,也就是 A 依赖 B. 要解决上述依赖,有两种方案 1.将B发布到 repo 仓库(可以为本 ...

  3. QML程序发布时无法正常运行的解决办法

    1.运行依赖 以我的一个项目为例,此程序使用QQuickWidget将QWidget和QML结合.程序debug版发布时依赖的库如下: 大部分dll可以在Visual Studio中调试时的控制台中看 ...

  4. 火车头采集器对接织梦cms图集发布时, 采集网上图片超时的解决方法

    背景介绍: 火车头采集器对接织梦cms图片集发布时, 对于多张(超过30张)大图片时, 经常会出现图集发布超时的情况.  问题分析: 因为php对于资源的处理有默认的超时时间30秒, 而我尝试了好多方 ...

  5. 关于微赞,微擎,微动力模块安装时出现 版权保护,未在云平台注册 的解决办法

    关于微赞,微擎,微动力模块安装时出现 版权保护,未在云平台注册 等如下之类提示: 您的程序需要在微赞云服务平台注册你的站点资料, 来接入云平台服务后才能使用相应功能. 此模块已设置版权保护,您只能通过 ...

  6. 有自定义控件的网站项目发布时,“不允许循环文件引用”的错误”的解决方法

    写了一个自定义控件,在项目中使用了多层嵌套母版,在使用各级母版的各个页面中添加了上面的自定义控件,编译测试无错,但发布总因为""不允许循环文件引用"的错误"而过 ...

  7. 商城模块java_Java商城秒杀系统实战系列~构建SpringBoot多模块项目

    摘要:本篇博文是"Java秒杀系统实战系列文章"的第二篇,主要分享介绍如何采用IDEA,基于SpringBoot+SpringMVC+Mybatis+分布式中间件构建一个多模块的项 ...

  8. java 模块 分工_Java秒杀系统实战系列~构建SpringBoot多模块项目

    摘要:本篇博文是"Java秒杀系统实战系列文章"的第二篇,主要分享介绍如何采用IDEA,基于SpringBoot+SpringMVC+Mybatis+分布式中间件构建一个多模块的项 ...

  9. SpringBoot | 第三十二章:事件的发布和监听

    前言 今天去官网查看spring boot资料时,在特性中看见了系统的事件及监听章节.想想,spring的事件应该是在3.x版本就发布的功能了,并越来越完善,其为bean和bean之间的消息通信提供了 ...

最新文章

  1. Java中@Override的作用
  2. java后ping不是内部_ping不是内部或外部命令,也不是可运行的程序解决方案
  3. Qt SD卡 文件系统挂载、文件预览
  4. 《此生未完成》痛句摘抄(4)
  5. linux 关闭ext3日志,ssh – 可以在Linux(ext3)上减慢日志写入速度吗?
  6. cocos2dx中加入unzip
  7. 鬼题Ghost [manacher]
  8. C#属性(Attribute)用法实例解析
  9. 编程基础(五)—— 虚拟内存
  10. ros实现dhcp上网
  11. linux环境下pandas库的安装,Pandas库的基本使用 pip安装 Series DataFrame
  12. VC6.0致命错误 RC1015: 无法打开包含文件 'afxres.h'.解决方法
  13. 软件沙箱技术 – 安全分析沙箱Cuckoo Sandbox
  14. windows10系统盘瘦身
  15. 聊天类APP功能测试总结
  16. 机器视觉运动控制一体机应用例程|锂电池组装线上的读码应用
  17. PHICH介绍(2)
  18. “晓白”学python-科普篇(2)-人们都用python做什么?
  19. 微信小程序获取用户真实信息
  20. 抖快推出流媒体音乐平台 会改变在线音乐市场格局吗?

热门文章

  1. 16速 java_不停歇的 Java 即将发布 JDK 16,新特性速览!
  2. 【Docker】容器镜像有哪些特性
  3. 大型网站HTTPS 实践(一)| HTTPS 协议和原理
  4. 02-go的IDE安装
  5. 修改gitlab数据卷的位置
  6. 7-深入练习Dockerfile
  7. MySQL学习【第五篇SQL语句上】
  8. 《深入理解Elasticsearch(原书第2版)》一2.3.3 把查询模板保存到文件
  9. 【Maven学习笔记(二)】Maven的安装与配置
  10. 时间管理,从洗碗开始