zoukankan      html  css  js  c++  java
  • 【maven】依赖、继承、聚合

    依赖:
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.0</version>
        <scope>test</scope>
      </dependency>
    1、依赖的范围(依赖的有效性)
      compile(默认值)
      test 比如:Junit
      provided 比如:servlet-api.jar,编译和测试时要用到servlet-api.jar,但是运行时不需要它,因为tomcat集成了servlet-api.jar

      

      maven在编译、测试、运行项目时,各自使用一套classpath

    2、依赖排除
      A.jar->B.jar(A.jar依赖B.jar)
      当我们通过maven引入A.jar时,会自动引入B.jar
      A.jar(x.java,y.java,z.java)  B.jar(p.java,c.java,i.java)
      A.jar和B.jar之间依赖的本质:z.java->c.java,
      x.java和y.java跟B.jar不存在依赖关系
      如果项目有中只需要x.java,不需要 z.java,则我们没必要引入B.jar,
      可以使用依赖排除,这样maven就不会自动引入B.jar了
    在pom.xml中排除jar包的依赖关系:

    View Code

    再次强调,在pom.xml中增加完依赖后,需要maven - update project
    依赖:
      commons-fileupload.jar commons-io.jar:虽然我们实际开发时,认为二者jar必须关联,但是maven可能不这么认为。

    3、maven整合多个项目
      多个maven项目(模块)之间如何依赖:p项目依赖->q项目
        1、把q项目 install 到本地仓库
        2、在p项目pom.xml文件中配置依赖:

          <dependencies>
            <dependency>
              <groupId>org.lanqiao.maven</groupId>
              <artifactId>HelloWorld2</artifactId>
              <version>0.0.1-SNAPSHOT</version>
            </dependency>
          </dependencies>

    假设有两个项目 HelloWorld2 和 HelloWorldTime,HelloWorldTime依赖于HelloWorld2,
    我们可以把HelloWorld2安装到仓库(也就是install放到仓库中,可以是本地仓库,也可以是中央仓库),
    然后HelloWorldTime通过在pom.xml文件中配置对HelloWorld2的依赖关系,
    HelloWorldTime就能够调用HelloWorld2中的类和方法了。
    在HelloWorldTime的pom.xml文件中,配置对HelloWorld2的依赖关系如下:
      <dependencies>
        <dependency>
          <groupId>org.lanqiao.maven</groupId>
          <artifactId>HelloWorld2</artifactId>
          <version>0.0.1-SNAPSHOT</version>
        </dependency>
      </dependencies>

    4、依赖的传递性
      A.jar->B.jar->C.jar(A.jar依赖B.jar,B.jar依赖C.jar)
      要使A.jar->C.jar(A.jar依赖C.jar)需要一个前提条件:当且仅当B.jar依赖C.jar的范围是compile
      HelloWorldTime->HelloWorld2->junit(HelloWorldTime依赖HelloWorld2,HelloWorld2依赖junit)

    5、依赖原则:为了防止冲突
      a.路径最短优先原则
        HelloWorldTime->HelloWorld->junit4.0,
        假设HelloWorldTime传递依赖junit4.0,同时自身依赖Junit3.8,则HelloWorldTime优先依赖junit3.8
      b.路径长度相同:
        i. 在同一个pom.xml文件中有2个相同的依赖(覆盖):后面声明的依赖会覆盖前面声明的依赖(严禁在同一个pom.xml中声明2个版本不同的依赖).
          例如HelloWorldTime的pom.xml文件中配置了两个junit依赖项,先声明junit3.8版本,后声明junit3.7版本,那么junit3.7会覆盖junit3.8。
        ii.如果是不同的pom.xml中有2个相同的依赖(优先):则先声明的依赖,会覆盖后声明的依赖,
          比如:HelloWorldTime依赖 HelloWorld 和 Hello 两个项目,
          HelloWorld又依赖于 commons-io2.4.jar,commons-io2.4.jar 依赖范围是compile,
          Hello依赖于commons-io2.3.jar,commons-io2.3.jar 的依赖范围是compile,
          则在 HelloWorldTime 项目中配置依赖项 HelloWorld 和 Hello 时,HelloWorld 和 Hello 谁先声明,则优先依赖谁的
          commons-io.jar包。假设 HelloWorld 先声明,Hello 后声明,则 HelloWorldTime 依赖 HelloWorld 所依赖的commons-io2.4.jar 版本。
    JDK只能识别source folder 中的源码。

    6、统一项目的jdk:
      i、build path:删除旧版本,增加新版本
      ii、右键项目-属性-project Factors-java version 改版本(之前存在要改的版本,比如把jdk 1.7改成jdk 1.8,则电脑上必须安装了jdk 1.8)
      iii、通过maven统一jdk版本,在pom.xml文件中进行配置。
    可以在pom.xml中统一jdk版本、统一编码、统一jar包的版本


    7、继承
    依赖传递:A->B->C(A依赖B,B依赖C)
      如果 B 是在compile范围依赖于C,则A->C(A依赖C)
    继承:A->B(A继承B)
      则A可以使用B的所有依赖(而不用管B与C之间依赖范围是否compile)

    只要A继承B,则A可以使用B的所有依赖,简而言之,A可以使用C,也不用关心B是否在compile范围依赖C,用继承来代替依赖传递,方便很多

    假设HelloWorld2继承B,B依赖junit,则继承实现步骤:
    i、建立父工程B,父工程的打包方式为pom(父工程中不编写源代码,只是在pom.xml文件中编写依赖,供子工程继承)
    ii、在父工程B的pom.xml中编写依赖:
      父工程的依赖需要写在pom.xml文件的dependencyManagement中,子工程中的依赖只写在<dependencies></dependencies>和<dependency></dependency>中,不写在<dependencyManagement>中
      <dependencyManagement>
        <dependencies>
          <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.0</version>
            <scope>compile</scope>
          </dependency>
        <dependencies>
      </dependencyManagement>
    iii、子工程 HelloWorld2 继承一个父工程: 1、加入父工程gav 2、子工程的pom.xml到父工程的pom.xml之间的相对路径
      <parent>
        <!--1、加入父工程gav -->
        <groupId>org.lanqiao.maven</groupId>
        <artifactId>B</artifactId>
        <version>0.0.1-SNAPSHOT</version>

        <!--2、子工程的pom.xml到父工程的pom.xml之间的相对路径-->
        <relativePath>../B/pom.xml</relativePath>
      </parent>
    由于父工程和子工程之间存在继承关系,子工程可以继承父工程gav中的gv,所以可以在子工程的pom.xml文件中注释掉子工程gav中的gv,只保留子工程gav中的a。
    iiii、在子工程中,需要声明:使用父工程的哪些依赖,只需要gav中的ga,不用gav中的v(version)
      假如父工程依赖了无数个jar包,而子类只需要用到这无数个jar包中的3个jar包,则可以通过下面的配置实现:
      <dependencies>
        <dependency>
          <!-- 声明:需要使用到父类的junit(只需要ga)-->
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
        </dependency>
      </dependencies>

     子工程依赖了父工程中的哪些jar包,就配置哪些jar包,没必要把父工程依赖的所有jar包都拿过来

    8、maven聚合
      i、maven项目能够识别的:自身包含的、本地仓库中的
      ii、Maven2依赖maven1,则在执行时:必须先将Maven1加入到本地仓库(install),之后才能执行Maven2。
        以上前置工程maven1的install操作,可以交由“聚合”一次性搞定。比如假设Maven2依赖很多个项目,则需要把它依赖的项目都install放到本地仓库,由于需要多次install,
        这种方式很麻烦,所以我们可以使用聚合来解决该问题。
      iii、聚合的使用:
        在一个总工程中配置聚合:(聚合的配置,只能配置在(打包方式为pom)的Maven工程中)
        配置聚合,避免前置工程的install操作
        <Modules>
          <!--项目的根路径,可以不用设置顺序-->
          <module>../Maven1</module>
          <module>../Maven2</module>
        </Modules>
        配置完聚合之后,以后只要操作总工程,则会自动操作该聚合中配置过的工程。
        注意:clean命令,是删除target目录,并不是清理install存放入的本地仓库。
        当项目之间存在依赖时,如果不install到本地仓库时,只要配置好聚合,项目就直接运行也不会报告。

      iiii、聚合、继承:
        聚合:
          Maven将一个大工程拆分成若干个子工程(子模块),聚合可以将拆分的多个子工程合起来。
        继承:
          父工程->子工程,可以通过父工程,统一管理依赖的版本,子工程通过声明使用父工程的哪些依赖,只需要指定gav中的ga,不用指定gav中的v(version)

    9、maven自动部署web工程:
      通过maven直接部署运行web项目
        a、在pom.xml文件中配置cargo插件,来帮助我们自动启动tomcate
        b、在eclipse中使用maven命令:deploy
      实际开发中,开发人员将自己的项目开发完毕以后,打成war包或者jar包交给实施人员去部署。

    10、maven仓库网站:http://www.mvnrepository.com

  • 相关阅读:
    Java Varargs 可变参数使用
    GitLab 如何删除 Forked from
    Git Clone 的时候遇到 Filename too long 错误
    Spring Boot 如何部署到 Linux 中的服务
    Gradle 如何打包 Spring Boot 如何不添加版本代码
    HDU 5878---预处理+二分查找
    HDU 5881--Tea 思维规律
    HDU 5879---cure
    (转)C/S 与 B/S 区别
    卡特兰数
  • 原文地址:https://www.cnblogs.com/mtszw/p/9272942.html
Copyright © 2011-2022 走看看