maven导入jar包时冲突的解决四种方式问题The server encountered an internal error () that prevented it from fulfilling

在这里插入图片描述
问题:
The server encountered an internal error () that prevented it from fulfilling this request.

运行tomcat:run 运行项目成功了,访问url失败

在这里插入图片描述
报错:不能将一个Myservlet识别为一个servlet

maven有一键构建的功能(不再使用本地安装的tomcat,而是使用maven自身集成的tomcat插件进行构建项目)

问题分析: 设置作用域
本地的tomcat的lib目录中有jsp:api,servlet:api的jar包,这两个包已经在依赖中导入了这两个jar包,则产生了jar包冲突

但是如果不在依赖中导入jar包,则会出现代码报错;如果导入了jar包,则出现了jar包冲突,编译没有错,但是输入url出现了运行时异常

在这里插入图片描述

依赖管理的jar包设置作用范围,只在编译时起作用,在运行时采用tomcat插件中jar包

文档链接:

jar包冲突解决.note

知识点

maven工程要导入jar包的坐标,就必须考虑解决jar包冲突 在这里插入图片描述
当导入坐标后,可以通过下图所示查看当前项目/jar包下中的传递依赖,传递依赖的关系图:
spring-context和spring-bean都导入了spring-core的jar包,但是spring-context和spring-bean的版本不一样,导致spring-core的版本不一致。
在这里插入图片描述

maven工程要导入jar包的坐标,就必须考虑解决jar包冲突

  • 解决jar包冲突的方式一:

    第一声明优先原则,哪个jar包的坐标在靠上的位置,这个jar包就是先声明的。
    先声明的jar包坐标下的依赖包,可以优先进入项目中。

在这里插入图片描述
明显,上图先进入项目中的jar包是靠上声明的。

maven导入jar包中的一些概念:
直接依赖:项目中直接导入的jar包,就是该项目的直接依赖包
传递依赖:项目中没有直接导入的jar包,可以通过项目直接依赖jar包传递到项目中去

  • 解决jar包冲突的方式二:

    路径近者优先原则。直接依赖路径比传递依赖路径近,那么最终项目进入的jar包会是路径近的直接依赖包。

在这里插入图片描述
进入项目的jar包会是下面声明的直接依赖

  • 解决jar包冲突的方式三【推荐使用】:

    直接排除法

    当我们要排除某个jar包下依赖包,在配置exclusions标签的时候,内部可以不写版本号,排除不需要的jar包
    因为此时依赖包使用的版本和默认版本jar包一样

在这里插入图片描述

  • 解决jar包冲突的方式四:

    使用properties控制jar包版本,在version标签使用${spring.version} {括号里写的是你properties中标签自己取的名字},然后在写入坐标依赖(一定要写,前面两步仅仅是版本锁定,没有导入依赖)

posted @ 2020-10-15 19:23  your_棒棒糖  阅读(208)  评论(0编辑  收藏  举报