依赖

maven版本:apache-maven-3.1.1    IDE: springsource   默认支持maven集成             若使用的是eclipse,则需要先安装m2eclipse来支持maven的集成

注意:

修改IDE集成的maven版本,使用自己新安装的maven  (Window->Preferences->Maven->Installations)       若修改了默认本地仓库路径,还需要在 Window->Preferences->Maven->User Settings 中配置路径指向修改后的本地仓库下的settings.xml文件,       本地路径为 D:\dev_env\maven\settings.xml

依赖包的查询 1、所有的依赖都是通过坐标来进行存储的(GAV-->groupId、artifactId、version),也是通过坐标来查找的 2、有一些网上的仓库提供了坐标的查询(http://mvnrepository.com),输入需要查找的jar包(如:spring,struts)

依赖传递

若项目A依赖了C jar包,B项目依赖了A项目,则B项目依赖了C jar包,这就是依赖的传递(这种依赖是基于compile范围进行传递的)

下面以一个实例来说明依赖传递的冲突和maven解决冲突的机制:

若存在A、B、C、D四个项目,他们之间互相依赖,A依赖B和C,B依赖D

同等长度的依赖路径-->根据依赖定义顺序处理冲突

若B和C中都依赖了POI的jar包,B依赖poi-3.9 ,C依赖 poi-3.10,那么根据传递性A也会依赖poi,此时根据B和C在A的pom文件(A依赖B、C,会在dependencies中定义)中依赖的顺序决定poi的版本,若B在前面则A依赖poi-3.9;否则依赖poi-3.10

不同等长度的依赖路径-->根据依赖路径长度取路径短的依赖

若C和D中都依赖了POI的jar包,C依赖poi-3.9 ,D依赖 poi-3.10,那么根据传递性A也会依赖poi,由于A到C的路径较短,所以A会依赖poi-3.9

可在依赖中排除某些依赖关系(控制依赖、也可以解决依赖冲突)

若B和C中都依赖了log4j的jar包,B依赖log4j-1.2.16 ,C依赖 log4j-1.2.17,那么根据传递性A也会依赖log4j,可在A项目的pom文件中排除B项目的log4j依赖,此时A就会依赖C的log4j-1.2.17

A项目pom文件依赖定义如下:

[html] view plaincopyprint?

  1. <dependency>

  2. <groupId>B</groupId>

  3. <artifactId>B</artifactId>

  4. <version>SNAPSHOT-0.0.1</version>

  5. <type>jar</type>

  6. <scope>compile</scope>

  7. <exclusions>

  8. <exclusion>

  9. <groupId>log4j</groupId>

  10. <artifactId>log4j</artifactId>

  11. <version>1.2.16</version>

  12. </exclusion>

  13. </exclusions>

  14. </dependency>

  15. <dependency>

  16. <groupId>C</groupId>

  17. <artifactId>C</artifactId>

  18. <version>SNAPSHOT-0.0.1</version>

  19. <type>jar</type>

  20. <scope>compile</scope>

  21. </dependency>

<dependency> <groupId>B</groupId> <artifactId>B</artifactId> <version>SNAPSHOT-0.0.1</version> <type>jar</type> <scope>compile</scope> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </exclusion> </exclusions> </dependency> <dependency> <groupId>C</groupId> <artifactId>C</artifactId> <version>SNAPSHOT-0.0.1</version> <type>jar</type> <scope>compile</scope> </dependency>

依赖范围

1、test范围指的是测试范围有效,在编译和打包时都不会使用这个依赖 2、compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去 3、provided依赖:在编译和测试的过程有效,最后生成war包时不会加入,诸如:servlet-api,因为servlet-api,tomcat等web服务器已经存在了,如果再打包会冲突 4、runtime在运行的时候依赖,在编译的时候不依赖 默认的依赖范围是compile

依赖范围对传递性依赖的影响

假设现在有一个项目A依赖项目B,项目B依赖log4j,则称A对B的依赖为第一直接依赖,B对log4j的依赖为第二直接依赖。

下图中左边一列表示第一直接依赖的范围,上面的一行表示第二直接依赖的范围。

假设:A对B的依赖范围为compile(<scope>compile</scope>),B对log4j的依赖范围为compile,

那么根据下图可查到传递性依赖的范围为compile,表示A对log4j的依赖也是compile

根据上面图例可总结:

当第二直接依赖的范围为compile时,传递性依赖的范围与第一直接依赖的范围一致;

当第二直接依赖的范围为test时,依赖不会传递;

当第二直接依赖的范围为provided时,只有当第一直接依赖的范围也为provided时,依赖才会传递且传递依赖的范围也是provided;

当第二直接依赖的范围为runtime时,传递性依赖的范围与第一直接依赖范围一致(但第一直接依赖范围为compile时比较特殊,此时传递性依赖范围为runtime)。

聚合和继承

聚合:分模块开发的各个子项目要分别编译、测试、打包会很麻烦,可以建立一个单独的项目parent,这个项目中只有一个pom文件,将分开的子项目作为模块(在pom文件中使用module配置)配置到parent项目中,运行parent中的pom文件,就能自动同时一并构建各个模块。

继承:分模块开发的各个子项目的pom文件中会有很大一部分的配置元素是重复的(如:作为一个大项目的各个模块,groupId应该是相同的;依赖的重复配置),可以建立一个单独的项目parent,这个项目的pom文件会抽取那些公有的重复配置供各个子模块继承(子项目的pom文件中使用parent配置需要继承的pom项目信息)。

继承的配置主要是:

1、在子项目的pom文件中使用parent元素对父pom进行定义

2、在父pom文件中会定义一些公共的元素供子pom继承,父pom中定义依赖是要在dependencies节点上添加一个父级节点dependencyManagement

聚合和继承的父pom文件中的packaging属性的值必须是pom

下面引用上一篇文章中提到的视频中的实例:

user-parent作为聚合项目、被继承的父项目,这个项目中只有一个pom文件;其余的都是子项目

user-parent的pom文件

[html] view plaincopyprint?

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  3. <modelVersion>4.0.0</modelVersion>

  4. <groupId>org.konghao.user</groupId>

  5. <artifactId>user-parent</artifactId>

  6. <version>0.0.1-SNAPSHOT</version>

  7. <packaging>pom</packaging>

  8. <modules>

  9. <module>../user-core</module>

  10. <module>../user-dao</module>

  11. <module>../user-log</module>

  12. <module>../user-service</module>

  13. </modules>

  14. <url>http://maven.apache.org</url>

  15. <!-- <repositories>

  16. <repository>

  17. <id>central</id>

  18. <name>Central Repository</name>

  19. <url>https://nexus.sourcesense.com/nexus/content/repositories/public/</url>

  20. <layout>default</layout>

  21. <snapshots>

  22. <enabled>false</enabled>

  23. </snapshots>

  24. </repository>

  25. </repositories> -->

  26. <properties>

  27. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  28. <junit.version>4.10</junit.version>

  29. </properties>

  30. <dependencyManagement>

  31. <dependencies>

  32. <dependency>

  33. <groupId>junit</groupId>

  34. <artifactId>junit</artifactId>

  35. <version>${junit.version}</version>

  36. <scope>test</scope>

  37. </dependency>

  38. <dependency>

  39. <groupId>org.konghao.user</groupId>

  40. <artifactId>user-core</artifactId>

  41. <version>0.0.1-SNAPSHOT</version>

  42. </dependency>

  43. <dependency>

  44. <groupId>org.konghao.user</groupId>

  45. <artifactId>user-dao</artifactId>

  46. <version>0.0.1-SNAPSHOT</version>

  47. <type>jar</type>

  48. <scope>compile</scope>

  49. </dependency>

  50. <dependency>

  51. <groupId>org.konghao.user</groupId>

  52. <artifactId>user-log</artifactId>

  53. <version>0.0.1-SNAPSHOT</version>

  54. <type>jar</type>

  55. <scope>compile</scope>

  56. <exclusions>

  57. <exclusion>

  58. <groupId>log4j</groupId>

  59. <artifactId>log4j</artifactId>

  60. </exclusion>

  61. </exclusions>

  62. </dependency>

  63. <dependency>

  64. <groupId>org.hibernate</groupId>

  65. <artifactId>hibernate-core</artifactId>

  66. <version>3.6.10.Final</version>

  67. </dependency>

  68. <dependency>

  69. <groupId>log4j</groupId>

  70. <artifactId>log4j</artifactId>

  71. <version>1.2.16</version>

  72. </dependency>

  73. <dependency>

  74. <groupId>mysql</groupId>

  75. <artifactId>mysql-connector-java</artifactId>

  76. <version>5.1.18</version>

  77. </dependency>

  78. <dependency>

  79. <groupId>org.slf4j</groupId>

  80. <artifactId>slf4j-log4j12</artifactId>

  81. <version>1.6.4</version>

  82. </dependency>

  83. <dependency>

  84. <groupId>javassist</groupId>

  85. <artifactId>javassist</artifactId>

  86. <version>3.12.1.GA</version>

  87. </dependency>

  88. <dependency>

  89. <groupId>commons-logging</groupId>

  90. <artifactId>commons-logging</artifactId>

  91. <version>1.1.1</version>

  92. </dependency>

  93. </dependencies>

  94. </dependencyManagement>

  95. </project>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.konghao.user</groupId> <artifactId>user-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>../user-core</module> <module>../user-dao</module> <module>../user-log</module> <module>../user-service</module> </modules> <url>http://maven.apache.org</url>; <!-- <repositories> <repository> <id>central</id> <name>Central Repository</name> <url>https://nexus.sourcesense.com/nexus/content/repositories/public/</url>; <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit.version>4.10</junit.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.konghao.user</groupId> <artifactId>user-core</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.konghao.user</groupId> <artifactId>user-dao</artifactId> <version>0.0.1-SNAPSHOT</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.konghao.user</groupId> <artifactId>user-log</artifactId> <version>0.0.1-SNAPSHOT</version> <type>jar</type> <scope>compile</scope> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.6.10.Final</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.18</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.4</version> </dependency> <dependency> <groupId>javassist</groupId> <artifactId>javassist</artifactId> <version>3.12.1.GA</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> </dependency> </dependencies> </dependencyManagement></project>

user-core的pom文件

[html] view plaincopyprint?

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  3. <modelVersion>4.0.0</modelVersion>

  4. <parent>

  5. <groupId>org.konghao.user</groupId>

  6. <artifactId>user-parent</artifactId>

  7. <version>0.0.1-SNAPSHOT</version>

  8. <relativePath>../user-parent/pom.xml</relativePath>

  9. </parent>

  10. <artifactId>user-core</artifactId>

  11. <name>user-core</name>

  12. <dependencies>

  13. <dependency>

  14. <groupId>junit</groupId>

  15. <artifactId>junit</artifactId>

  16. </dependency>

  17. <dependency>

  18. <groupId>org.hibernate</groupId>

  19. <artifactId>hibernate-core</artifactId>

  20. </dependency>

  21. <dependency>

  22. <groupId>log4j</groupId>

  23. <artifactId>log4j</artifactId>

  24. </dependency>

  25. <dependency>

  26. <groupId>mysql</groupId>

  27. <artifactId>mysql-connector-java</artifactId>

  28. </dependency>

  29. <dependency>

  30. <groupId>org.slf4j</groupId>

  31. <artifactId>slf4j-log4j12</artifactId>

  32. </dependency>

  33. <dependency>

  34. <groupId>javassist</groupId>

  35. <artifactId>javassist</artifactId>

  36. </dependency>

  37. </dependencies>

  38. </project>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.konghao.user</groupId> <artifactId>user-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../user-parent/pom.xml</relativePath> </parent> <artifactId>user-core</artifactId> <name>user-core</name> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency> <dependency> <groupId>javassist</groupId> <artifactId>javassist</artifactId> </dependency> </dependencies></project>

其余子项目的pom文件类似与user-core

依赖分析

可在项目的根路径下运行maven命令,分析当前项目的依赖情况

mvn dependency:list  显示已解析依赖

mvn dependency:tree   依赖树

mvn dependency:analyze  依赖分析      需要关注Used undeclared dependencies found(项目中使用到的,但没有直接声明的,传递性依赖过来的),需要显示声明这些依赖

maven总结2的更多相关文章

  1. 【分享】标准springMVC+mybatis项目maven搭建最精简教程

    文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...

  2. 理解Maven中的SNAPSHOT版本和正式版本

    Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准,Maven的替代者Gradle也基本沿用了Maven的依赖管理机制.在Maven依赖管理中,唯一标识一个依赖项是由该依赖项的三个 ...

  3. 【微框架】Maven +SpringBoot 集成 阿里大鱼 短信接口详解与Demo

    Maven+springboot+阿里大于短信验证服务 纠结点:Maven库没有sdk,需要解决 Maven打包找不到相关类,需要解决 ps:最近好久没有写点东西了,项目太紧,今天来一篇 一.本文简介 ...

  4. 安装eclipse的maven插件

    我们团队用maven来管理项目需要的库文件,其实以前都没听过maven,第一次接触这个,师兄要我直接去装下这个,开始以为还挺简单的,没想到中间遇到了一些小麻烦,现在把我成功安装maven的过程分享下, ...

  5. MAVEN学习-第一个Maven项目的构建

    MAVEN安装成功之后就可以进行项目的构建和管理了: 为什么要用maven进行项目的构建和管理? 对于初学者来说一个最直接的也是最容易里的优点在于JAR包的管理,相对于以前开发一个项目的时候我们需要用 ...

  6. Maven 代理设置

    在maven的安装目录下 %MAVEN_HOME%/conf/setting.xml 中进行设置 <proxies>    <!-- proxy     | Specificatio ...

  7. spring maven pom.xml设置

    spring pom.xml设置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...

  8. maven依赖查询地址

    http://search.maven.org/#search%7Cga%7C1%7C

  9. maven 中snapshot版本和release版本的区别

    maven中的仓库分为两种,snapshot快照仓库和release发布仓库.snapshot快照仓库用于保存开发过程中的不稳定版本,release正式仓库则是用来保存稳定的发行版本.定义一个组件/模 ...

  10. Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出现的问题

    现互联网公司后端架构常用到Spring+SpringMVC+MyBatis,通过Maven来构建.通过学习,我已经掌握了基本的搭建过程,写下基础文章为而后的深入学习奠定基础. 首先说一下这篇文章的主要 ...

随机推荐

  1. java微信开发(wechat4j)——支持微信JS-SDK的jsapi_ticket中控服务器

    jsapi_ticket是使用js-sdk必须要的一个凭证,需要配置在js中. jsapi_ticket获取 要获取jsapi_ticket可以使用如下的方法 String jsapi_ticket ...

  2. C# 枚举、字符串、值的相互转换

    using  System; class  Program{    public   enum  Color   {      Red  =   0xff0000 ,      Orange  =   ...

  3. css导航栏

    几个导航栏也算对学过知识的回顾,总有新的收获,下面是学习过程中敲的代码: <!DOCTYPE HTML> <html> <head> <title>&l ...

  4. CSS3选择器(二)--表单

    :enabled 选择可用状态的表单元素 :disabled 选择不可用状态的表单元素 :checked 复选框.单选框选中状态的选项 ::selection 用来匹配突出显示的文本(用鼠标选择文本时 ...

  5. Winform使用外部浏览器解决webbrowser问题

    对于还是一个菜鸟的我,在最近自己接手了个项目,搞的自己也是醉了,身边也有没大神的现场指导,只能靠度娘和谷歌的大力帮助,要不然这么个小项目可定现在还交不了,不过在这过程种也确确实实学到了不少东西,我先说 ...

  6. Docker: 解决Docker无法在电信网络中访问外网

    在电信网络中,Docker在build和run时会无法访问外网,原因是docker的默认dns地址是8.8.8.8,由于众所周知的原因,我们需要改写这个地址,方法如下: 修改/etc/sysconfi ...

  7. Android底部TabHost API

    今天在项目中遇到了底部TabHost,顺便就写了一个底部TabHost的api继承即可使用非常简单,以下为源代码: 首先是自定义的TabHostActivity,如果要使用该TabHost继承该类即可 ...

  8. 我的android学习经历12

    自动匹配输入的内容(文章最后有一个问题有兴趣的可以解答一下,谢谢大神了) 这个主要是两个控件MultiAutoCompleteTextView和AutoCompleteTextView 这两个控件和T ...

  9. 五种创建UIImage的类方法

    五种创建UIImage的类方法 UIImage有五个类方法,用来创建UIImage的.下面介绍一下每个类方法的作用和创建实例. 1.使用类方法imageNamed:创建 + (UIImage *)im ...

  10. Swift中的类和结构体的相同点与不同点

     相同点: 1.都是有内部变量和函数 2.都可以有内部下标方式去取属性 3.都可以有初始化函数 4.都可以用协议   不同点: 1.类有继承 2.类可以多重引用 3.类有析构