SpringBoot jar发布换war发布与springboot+netty发布到tomcat无法访问问题

项目介绍
一个公司的Spring Boot项目,但是包含有一个Netty实现的Socket Server,用来与硬件端进行通信,与web的8080端口分开,socket的端口为9911;

jar->war 转换方式
方式非常简单,baidu和谷歌都能找到非常多的答案

启动类修改
启动类继承 SpringBootServletInitializer,并且@Override configure方法
参考如下:

   @SpringBootApplication
    public class Application extends SpringBootServletInitializer {
    	@Override
    	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    		return application.sources(Application.class);
    	}
    	public static void main(String[] args) throws Exception {
    		SpringApplication.run(Application.class, args);
    	}
    }

pom.xml修改【Maven修改】
打开pom.xml文件,主要的修改地方有两处
①打包方式声明修改

<packaging>jar</packaging>

修改为

<packaging>war</packaging>

如果使用的是Gradle,修改如下:

apply plugin: 'war'

②在依赖中【也就是】中添加如下代码:

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

如果使用的是Gradle,修改如下:

dependencies {
	// …
	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
	// …
}

这一步的目的在于确保嵌入式servlet容器不会干扰部署war文件的servlet容器。其实这里不加也可以正常的部署成功,但是为了消除干扰,请添加。
需要注意的是,添加如下代码之后,使用Spring
的启动类就无法启动项目了,需要采用Maven的方式启动。

Idea直接在maven的侧边栏中找到Plugins下的spring-boot中的run执行就可以了,也可以采用maven命令的方式执行。
不过maven执行的方式没有日志着色,很难看,所以笔者选择调试的时候把这段话给注释掉。或者更改scope属性应该也可以。
Netty对于Tomcat部署的干扰笔者之前的项目采用jar的方式运行无问题。

修改为war包后无论怎么修改也无法执行,是因为项目中添加了Netty作为Socket的服务端,导致使用tomcat部署的时候显示部署成功,日志正常,但是访问页面始终失败,其中有404问题,也有页面始终在加载,但是最终失败的情况。
其实原因也非常的简单。
问题:
Netty监听端口导致tomcat假死,访问web页面失败;tomcat关闭异常,netty始终监听此端口,必须强制杀死进程才能关闭。

原因
因为Netty里面的sync()方法是阻塞的,可以理解成启动此部分之后,由Netty这个通信框架来接管了;而且Netty所监听的端口必须与tomcat的端口不一致。

解决方法

  1. 最好的方法当然是把Netty这个框架剔除出去,单独设定为一个服务,这样更加的整洁统一。
  2. 如果一定要放在一起呢?
    那么可以采用线程的方式来启动Netty,这样就可以了。
    经测试,tomcat部署成功。

注意
也有部分人喜欢在spring-boot-starter-web剔除spring-boot-starter-tomcat,但是我自己测试,效果是一致的,Spring的官方文档中是采取文中内容的方式。

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<!--&lt;!&ndash; 移除嵌入式tomcat插件 &ndash;&gt;
	<exclusions>
		<exclusion>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
		</exclusion>
	</exclusions>-->
</dependency>
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LuckyTHP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值