Maven初见

Posted sea-and-fish

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Maven初见相关的知识,希望对你有一定的参考价值。

Maven 的概念

 ------- 一种标准的方式来构建项目,明确定义项目的组成部分,一种简便的方法来发布项目信息,以及一种在多个项目中共享JAR包的方法。

Maven 的主要目的是为了开发者提供

  1、 一个可复用、可维护、可易理解的工程综合模型与这个模型交互的插件和工具

  2、工程结构和内容在一个xml 文件中定义--pom.xml

 技术图片技术图片

 

 Maven中jar包的位置

  ---把查找jar的工作交给机器,因此每一个jar必须能被唯一标识

 技术图片

 

 Maven对依赖的管理

  技术图片

   scope的主要依赖关系有:

    1.compile: 默认编译依赖范围。被依赖项目在编译、测试、运行都参与。打包的时候需包含进去。

    2.test:被依赖项目仅仅参与测试相关的工作,如测试代码的编译、执行等。

    3.provided: 被依赖项目对运行期无效,打包的时候不用包进去。

    4.runtime:被依赖项目无需参与项目的编译。

 

 jar的依赖传递与冲突

    

 技术图片

 

    以上过程中,项目Mall依赖的fastJson会有三个版本。而我们的JVM只会接受一个版本的jar包。所以一定会有取舍

  maven默认的取舍规则是:

    1、路径最短原则:product和customer里的fastjson引用路径较短,路径为两步 ;pay项目里的fastjson引用路径较长,路径为三步。因此pay中的fastjson被淘汰。

    2、同路径长度下,谁先声明谁优先: product和customer中的fastjson路径相同,那么就看在pom中是先声明product还是先声明customer,谁先用谁的。

 

 maven依赖冲突和解决:

     在上面的依赖传递里,maven根据自己的规则取舍出了一个版本的jar,但是此 jar 版本选择可能会与我们项目预期不符,

      例:我们想用的版本是 fastJosn:1.2.30,但是该版本第一时间就被淘汰掉了,

       在我们项目中如果用到了该版本特性的话,项目运行就会出错---这就是我们常遇到的 jar包冲突问题。

    解决方法一:

      根据依赖树(mvn依赖树命令:mvn dependenty:tree)与给出的依赖库寻找差异,或者用idea自带的maven插件也可以看到差异

        然后再pom.xml中使用exclusion标签排除多余jar包。

    解决方法二:

      使用maven helper插件,该插件可以在从idea的Plugins中下载到。下载重启后可在pom.xml文件内容下,会多出一个dependency analyzer窗口,
        该窗口内会自动列出当前冲突的文件,右键即可查看依赖处源码或是将该库排除。

以上是关于Maven初见的主要内容,如果未能解决你的问题,请参考以下文章

Maven

Maven学习笔记

maven install与maven build的区别

maven系列之二maven项目的创建和maven项目的结构

Maven项目的创建及相关配置

Maven学习-----Maven中央存储库