情景
开发公司的websocket会话,本地tomcat8.5跑的没有问题,但是经理部署的时候用的是tomcat7。于是悲剧就发生了,显示连接已经建立了,但是就是握手失败。 我再本地用tomcat7跑,浏览器提示报错如下:
WebSocket connection to ‘ws://IP:port/socketChatServer/ws’ failed: Error during WebSocket handshake: Unexpected response code: 500
解决
这种情况肯定是跟tomcat版本相关的,参考了几个博客,了解到出现问题原因是,tomcat7自身有关于websocket的jar,当我们下项目中引入其他关于websocket的依赖的时候,发生冲突产生了问题。我自己的项目中加入的依赖如下:
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>
解决方法主要有下面几个:
- 解决一:
将自己加入的websocket相关的包的scope属性设置成provided,这意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期,相当于compile,但是在打包阶段做了exclude的动作。保证了tomcat自身的jar不会与当前jar产生冲突,但是我设置了没管用,可能滴Idea中还需要做相关动作 - 解决二
正常打包之后,项目部署在tomcat下面,打开下面的路径
apache-tomcat-7.0.82\webapps\你的项目名\WEB-INF\lib
找到上面的maven项目中提到的依赖对应的jar,我的是javax.websocket-api-1.1
,然后就可以成功启动(如果在webapp下面找不到对应项目名目录而只有war包的话,可以先运行一遍就出来了)
再次启动,大功告成!!
哪位可以跟我讲下领导为什么就是不想用tomcat8啊