zoukankan      html  css  js  c++  java
  • 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元素可以引用环境变量。

    再次运行项目,访问成功

  • 相关阅读:
    Kubernetes二进制文件下载链接
    Python 中取代 Printf 大法的工具
    Python 七步捉虫法
    改善 Python 程序的 91 个建议
    最全的 API 接口集合
    一个可能是世界上最全的 API 接口集合库开源项目
    优质中文NLP资源集合,做项目一定用得到!
    Flair:一款简单但技术先进的NLP库
    取代 Python 多进程!伯克利开源分布式框架 Ray
    使用 PyHamcrest 执行健壮的单元测试
  • 原文地址:https://www.cnblogs.com/taiyonghai/p/14662020.html
Copyright © 2011-2022 走看看