• Maven项目中jar包冲突问题解决 导入jar包scope作用域的使用


    当我们使用Maven项目编写传统web时,需要使用Servlet,这时我们就需要在pom.xml文件中导入所需的jar包,

    此时我们导入了servlet-apijsp-api并选择了版本

    编写完代码后,在左侧maven工具栏的Lifecycle中执行maven生命周期的各个命令,下面Plugins可以看到每个命令所对应的插件

    我们需要运行web项目,执行mvn tomcat:run来运行maven的tomcat,但我们发现右侧maven工具栏没有这个命令,

    此时我们需要点击这个带m的按钮手动输入要执行的命令,运行

    可以运行成功,访问地址后发现报错了,提示MyServlet不能被识别为一个Servlet,可明明就是一个Servlet。

    maven有一键构建功能,当我们使用mvn tomcat:run 命令时,不再使用本地的tomcat,而是使用maven集成的tomcat插件对项目进行构建,

    而这个tomcat插件中也有tomcat运行所需的jar包,我们可以看看本地tomcat运行所需的jar包中都有什么。

    在tomcat的lib中我们发现也有jsp-api.jarservlet-api.jar两个jar包,当我们运行此项目的时候,项目中就出现了两套一摸一样的包,我们自己导入的包和

    tomcat中,这两套包名称一模一样是相冲突的,所以运行项目时只能保留一套。

    所以需要在maven的pom.xml文件中对导入的包设置作用域。

    在version下增加scope标签,指明作用域范围,

    compile :为默认的依赖有效范围。如果在定义依赖关系的时候,没有明确指定依赖有效范围的话,则默认采用该依赖有效范围。此种依赖,在编译、运行、测试时均有效。
    
    provided :在编译、测试时有效,但是在运行时无效。例如:servlet-api,运行项目时,容器已经提供,就不需要Maven重复地引入一遍了。
    
    runtime :在运行、测试时有效,但是在编译代码时无效。例如:JDBC驱动实现,项目代码编译只需要JDK提供的JDBC接口,只有在测试或运行项目时才需要实现上述接口的具体JDBC驱动。
    
    test :只在测试时有效,例如:JUnit。
    
    system :在编译、测试时有效,但是在运行时无效。和provided的区别是,使用system范围的依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用。systemPath元素可以引用环境变量。

    再次运行项目,访问成功

  • 相关阅读:
    如何使用分布式锁
    深入理解 ValueTask
    Tuple VS ValueTuple
    RxJS——调度器(Scheduler)
    RxJS——主题(Subject)
    RxJS——Operators
    RxJS——订阅(Subscription)
    RxJS——可观察的对象(Observable)
    Ext.Net 使用总结之GridPanel的删除事件
    使用 NuGet 管理项目库
  • 原文地址:https://www.cnblogs.com/taiyonghai/p/14662020.html
Copyright © 2020-2023  润新知