• maven总结2


    依赖

    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_envmavensettings.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?在CODE上查看代码片派生到我的代码片

    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?在CODE上查看代码片派生到我的代码片

    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?在CODE上查看代码片派生到我的代码片

    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(项目中使用到的,但没有直接声明的,传递性依赖过来的),需要显示声明这些依赖

             

  • 相关阅读:
    Data Block Structure (Try to Understand...)
    Some pieces of "Scripting"
    奥数模块之小学一年级版
    mysql 新增索引 sql
    mysql 导出数据 每个表的前n条数据 mysqldump limit
    Servlet的urlpattern详解(转)
    过滤器与拦截器的区别(转)
    用csv导出文件时,每个cell加上双引号后,可以原样输入cell中的内容,不管是否cell中是否包含逗号或者换行,但是如果包含双引号,则换行失效,解决方法如下
    java.lang.OutOfMemoryError: Java heap space 和 java.lang.OutOfMemoryError: PermGen space 解决方法
    解决 eclipse svn插件 状态图标不显示
  • 原文地址:https://www.cnblogs.com/justuntil/p/4752944.html
Copyright © 2020-2023  润新知