【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包的依赖关系:

再次强调,在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)

假设HelloWorld2继承B,B依赖junit,则继承实现步骤:
i、建立父工程B,父工程的打包方式为pom(父工程中不编写源代码,只是在pom.xml文件中编写依赖,供子工程继承)
ii、在父工程B的pom.xml中编写依赖:
  父工程的依赖需要写在pom.xml文件的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>

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

原文地址:https://www.cnblogs.com/mtszw/p/9272942.html

时间: 2024-11-15 23:22:44

【maven】依赖、继承、聚合的相关文章

Java-Maven(七):Eclipse中Maven依赖、聚合、继承特性

之前通过学习了解,maven集成到eclipse中的如何创建项目,以及maven命令插件在eclipse中安装后的用法.那么接下来我们将会学习一些maven在项目中的一些特性,及如何使用. Maven依赖特性 Maven聚合特性 Maven继承特性

maven 依赖、聚合和继承 (转)

Maven 插件和仓库 Maven 本质上是一个插件框架,它的核心并不执行任何具体的构建任务,仅仅定义了抽象的生命周期,所有这些任务都交给插件来完成的.每个插件都能完成至少一个任务,每个任务即是一个功能,将这些功能应用在构建过程的不同生命周期中.这样既能保证拿来即用,又能保证 maven 本身的繁杂和冗余. 将生命周期的阶段与插件目标相互绑定,就可以在特定的阶段完成具体的构建任务.例如清单 2 中的代码就是要在 validate 这个阶段执行 maven-antrun-plugin 的 run

maven依赖继承

A >  B  >  C A依赖于B,B依赖于C,如果A想间接依赖C,那么B和C之间的依赖范围必须是compile,不然A依赖不了C 但是有点麻烦,因为每次A想依赖于C都要确认B和C之间的依赖范围是否是compile,否则A依赖不了C,每次确认都会费时间 而且有些依赖的默认范围不是compile,如果修改默认的依赖范围可能导致冲突,比如servlet-api.jar的默认依赖范围是provided,如果修改servlet的默认依赖范围为compile,那么间接依赖serlvet的项目在运行时会

Maven依赖解析

Maven依赖解析本文将记录Maven工程中依赖解析机制,内容包括: 1. Maven依赖基本结构 上篇文章记录了Maven依赖的聚合与继承,POM中依赖的声明通过dependency进行定义,并且通过groupId.artifactId及version三项定位 http://p.baidu.com/itopic/main/qlog?qid=97a56162633465376437373100&type=questionlog http://p.baidu.com/itopic/main/qlo

Maven核心概念之依赖,聚合与继承

宏观图 一.依赖 我们项目中依赖的jar包可以通过依赖的方式(dependencies元素下添加dependency子元素)引入. <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> 1.依赖范围 通过控制依赖的范围,可以指定该依赖在什么阶段有效. &

maven 继承 聚合

Maven聚合与继承 一.聚合 为了能够使用一条命令就能构建 account-email和 account-persist两个模块,我们需要建立一个额外的名为 account-aggregator的模块,然后通过该模块构建整个项目的所有模块. account-aggregator本身也是个 Maven项目,它的 POM如下 Xml代码   <project> <modelVersion>4.0.0</modelVersion> <groupId>com.ju

maven项目继承与聚合

说到聚合与继承我们都很熟悉,maven同样也具备这样的设计原则,下面我们来看一下Maven的pom如何进行聚合与继承的配置实现. 一.为什么要聚合? 随着技术的飞速发展和各类用户对软件的要求越来越高,软件本身也变得越来越复杂,然后软件设计人员开始采用各种方式进行开发,于是就有了我们的分层架构.分模块开发,来提高代码的清晰和重用.针对于这一特性,maven也给予了相应的配置. 情景分析一: 我们在开发过程中,创建了2个以上的模块,每个模块都是一个独立的maven project,在开始的时候我们可

项目构建之maven篇:7.聚合与继承

聚合: 为方便项目构建,通常将聚合模块放在项目目录的最顶层,其他模块则作为聚合模块的子目录存在, 这样我们得到源码的时候,最快发现的是聚合模块的pom 运行命令 查看结果 源代码下载 继承 创建parent项目,用于被继承 parent/pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

Maven入门教程二----Maven依赖

依赖包查询 通过坐标存储,GAV-groupId,artifacld,version有些网上的仓库自带了,nexus,http://mvnrepository.com传递性依赖依赖范围:依赖的传递性:依赖是会被传递的.A--C,B--A,那么B--C(基于compile范围进行传递).pom.xml中scope如果没有声明,那么默认是compile如果scope的声明为test,那么这个依赖不会传递到另外一个compile包中test:打成war时不会把测试包打进去,也不会传递.编译和打包都不会

maven依赖配置和依赖范围

一:依赖配置  我们在实际开发汇中最常见的maven依赖如下,读者可以看到最基本的groupId,artifactId,version等元素组成. 1 <dependency> 2 <groupId>...</groupId> 3 <artifactId>...</artifactId> 4 <version>..</version> 5 <type>...</type> 6 <scope&g