zoukankan      html  css  js  c++  java
  • Maven 相关知识点解释

    在PC端上面关于Maven的安装等情况我这里就不再复述了,不懂的请自行百度谷歌。

    今天聊一下Maven 里面的结构,及相关依赖解释。


     groupId,artfactId,version,type,classifier,scope,systemPath,exclusions,optional 是 maven的9种依赖属性,

    其中groupId,artfactId,version是三个基本的依赖坐标,不可缺少。
    groupId------包名(一般为域名的反写)。
    artfactId------项目名。
    version-------版本。

    type----------依赖的类型,jar或者war(默认为jar,表示依赖的是一个jar包),另外当type表示为<type>pom.lastUpdated</type> 这种属性时,表示只将jar的描述信息加载了进来,实际的jar包并未导入。

    classifier----通常是用于从同一POM构建的拥有不同内容的构件,可选属性,可以是任意的字符串。对附加了classifier属性的包,如果不加上classifier,maven是找不到这个包的,比如下面这个依赖:


    <dependency>  
         <groupId>net.sf.json-lib</groupId>   
         <artifactId>json-lib</artifactId>   
         <version>2.2.2</version>  
    </dependency> 

    发现中央仓库中并没有json-lib-2.2.2.jar这个包 ,自然也就找不到了,有的只是不同版本的json-lib-2.2.2.jar,这个时候classifier就可以指明所想要版本。

    <dependency>  
         <groupId>net.sf.json-lib</groupId>   
         <artifactId>json-lib</artifactId>   
         <version>2.2.2</version>
         <classifier>jdk15</classifier>
    </dependency>  

    这样就可以找到json-lib-2.2.2-jdk15.jar这个包

    classifier不仅可以指明版本号,可以指明同一项目的不同组成部分,比如:源文件,javadoc,类文件等。在上面的图中你会发现还有一些json-lib-2.2.2-jdk15-javadoc.jar包和json-lib-2.2.2-jdk15-source.jar包,如果你需要的是javadoc,在XML文档中就可以这样写:

    <dependency>  
         <groupId>net.sf.json-lib</groupId>   
         <artifactId>json-lib</artifactId>   
         <version>2.2.2</version>
         <classifier>jdk15-javadoc</classifier>
    </dependency>  


    scope一共有compile,runtime,test,system,provided 5种属性值,compile为其默认值,其中:




    compile表示在所有范围此jar都生效,

    test表示只在测试范围此jar生效,例如Junit(默认compile,不会报错,扩展了test),

    runtime表示在测试和运行时此jar生效,例如JDBC驱动(默认compile,不会报错,扩展了runtime),我们在编译时是没有用到这个包的,只在测试和运行时会使用到,

    provided表示在编译和测试时此jar生效,例如servlet-api,jsp-api,这个的provided必须填写,不能使用compile,原因是:


    system表示我们手动添加的包,不属于maven仓库,属于别的类库的jar包,只在编译和测试期生效,运行时无效,一般不用,使用时,需要配合下面的systemPath使用。

    systemPath--为并非依赖maven的包指明路径。

    在项目中创建一个lib作为手动导入的jar包存储位置,


    exclusions---排除传递依赖,解决jar冲突问题,

    依赖传递的意思是项目A依赖项目B,项目B依赖项目C,在使用项目A时,就会加载项目B,这样传递依赖就会把项目C,D,E等等加载进来。其中B是A的直接依赖,C是A的间接依赖

    例如:A项目依赖B(版本为1.1),C项目也依赖B(版本为1.2),假如现在有一个项目同时依赖项目A和项目B,那么他就会导入两个版本的B,由于B的两个版本不同,这里就会导致冲突,这个时候就需要exclusions来解决冲突,不过maven也有一个机制会避免两个都加载进去,

    下面先介绍maven的依赖调节原则:

    1,第一原则:路径近者优先原则

                           A→B→C→X(1.1)

                           D→E→X(1.2)

                           使用X(1.2),因为其路径更近

    2,第二原则:第一声明者优先原则

                           A→B→X(1.1)

                           C→D→X(1.2)

                          使用X(1.1),因为其先声明

    maven会先根据第一原则判断,若路径相等,再根据第二原则判断

    但是我们还是使用exclusions来配置更加合理,我们使用spring bean 和 struts2 spring plugin来举个例子说明这个问题并使用exclusions来解决这个问题(spring bean 和 struts2 spring plugin都依赖spring-core但是版本不一样)

    先把两个jar包在本地仓库中找到


    optional-----标记依赖是否可传递,默认值false,比如上面的项目A和项目B,optional可以用来减少项目之间jar包的冲突。
  • 相关阅读:
    笔记-归并排序
    Repeated Substring Pattern
    Assign Cookies
    Number of Boomerangs
    Paint Fence
    Path Sum III
    Valid Word Square
    Sum of Two Integers
    Find All Numbers Disappeared in an Array
    First Unique Character in a String
  • 原文地址:https://www.cnblogs.com/cb1186512739/p/11173239.html
Copyright © 2011-2022 走看看