在项目开发中,笔者近期遇到了这样的问题:项目在本地编辑器中(Intellij idea)运行不了,但是部署到线上可以正常运行,别人的机器上idea中也可以运行。这个问题一直困扰笔者,总感觉是jar包冲突导致,但是有说不出是什么原因。经过笔者深入了解排查,终于找到了原因:idea自带jar包和项目maven依赖的jar包冲突导致。
首先笔者在自己的idea中运行自己的web项目(使用jetty启动项目,项目报错,localhost:8080访问报错502)。在终端中,输入 ps -ef | grep java 查看运行的相关参数,如下所示
可以看到,该命令,可以看到项目启动时,加载的所有jar包和版本。
我们把这些jar包单独拿出来分析,
从图中我们发现,启动这个web项目的时候,加载了两个版本的slf4j-api(slf4j-api-1.7.10 和slf4j-api-1.7.2)。其中1.7.2是我们项目中maven依赖的版本,1.7.0在目录/Applications/IntelliJ IDEA.app/Contents/lib中(属于Intellij idea自带jar包,用于idea相关功能)。这边我们就发现了:原来是idea的自带jar和我们项目中的jar导致冲突。这就解释了 为什么线上能够运行项目。
所以,我们到/Applications/IntelliJ IDEA.app/Contents/lib目录中,把相应的jar升级,升级和自己项目相同的版本,即可把冲突解决。
上面是使用jetty启动项目,如果使用tomcat启动项目,ps -ef | grep java 看不到所有的jar包,是因为tomcat启动,Intellij会把相关jar包放到web 的lib目录,所以看不到这样的详细信息。