解决Eureka报错: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()

阅读本博客之前, 请务必检查springcloud各组件的版本是否按照官网严格要求对应一致

SpringBoot提示错误如下:

注意看标注部分, 很明显是因为maven依赖中有两个servlet-api包, 而我们引入了其中一个没有getVirtualServerName()方法的包, 导致了报错

我们也可以用ctrl + N搜索类, 会发现有两个ServletContext类,其中一个没有该方法

但是我怎么知道这两个jar是哪来的呢? 右键子工程(子工程中可以看到父工程的依赖, 反之不行)的pom.xml文件, 选择图|显示依赖项

将生成的依赖图法放大, 使用ctrl + F, 就可以看到所有的依赖项了,(点击线条会高亮显示)

可以发现一切javax.开头的包都来自于Eureka, 所以直接在eureka的依赖中移除servlet即可

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
      <version>3.0.4</version>
      <exclusions>
        <exclusion>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
        </exclusion>
      </exclusions>
</dependency>

然后就可以正常运行了(不容易啊, 放寒假前的bug了呜呜呜):

解决依赖版本冲突问题还有一种方法, 因为maven处理冲突的原则是子依赖覆盖父依赖, 下面覆盖上面

所以有时候直接在已有依赖的下方添加新的版本的依赖(会覆盖上面的)即可


版权声明:本文为xiaoyouyouaaa原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。