【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)
只要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
【maven】依赖、继承、聚合的更多相关文章
- Java-Maven(七):Eclipse中Maven依赖、聚合、继承特性
之前通过学习了解,maven集成到eclipse中的如何创建项目,以及maven命令插件在eclipse中安装后的用法.那么接下来我们将会学习一些maven在项目中的一些特性,及如何使用. Maven ...
- maven 依赖、聚合和继承 (转)
Maven 插件和仓库 Maven 本质上是一个插件框架,它的核心并不执行任何具体的构建任务,仅仅定义了抽象的生命周期,所有这些任务都交给插件来完成的.每个插件都能完成至少一个任务,每个任务即是一个功 ...
- Maven依赖解析
本文将记录Maven工程中依赖解析机制,内容包括: Maven依赖基本结构 从仓库解析依赖的机制 依赖传递性解析实例 1. Maven依赖基本结构 上篇文章记录了Maven依赖的聚合与继承,POM中依 ...
- Maven核心概念之依赖,聚合与继承
一.依赖 我们项目中依赖的jar包可以通过依赖的方式(dependencies元素下添加dependency子元素)引入. <dependency> <groupId>juni ...
- maven 依赖(依赖范围,聚合,继承等)
目录: 1.什么是依赖? 2.依赖的管理:依赖的范围与传递,依赖的排除,依赖的原则(maven对依赖冲突的处理原则) 3.依赖的版本管理 4.继承与聚合 1.什么是依赖? 简单的讲,当jar包A需要j ...
- maven项目的聚合与继承
maven项目的聚合与继承: 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模 ...
- Maven的继承与聚合——多模块开发
一:Maven多模块项目,适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理.尤其是一些开源框架,也是采用多模块的方式,提供插件集成,用户可以根据需要配置指定的模块. 二:继承 ...
- maven pom继承与聚合
一.POM聚合模块: 在分布式架构,分模块化开发中,每个某块可能都是一个单独的maven项目,能够独立的进行项目构架,当模块比较多时,可以使用maven聚合聚合项目来简化maven构建,一次构建多个项 ...
- Maven的继承和聚合
Maven的继承和聚合子项目的pom文件里通过<parent>节点来继承父项目 <parent> <groupId>com.tykj</groupId> ...
- 10maven依赖继承、统一版本/编码
A > B > C A依赖于B,B依赖于C,如果A想间接依赖C,那么B和C之间的依赖范围必须是compile,不然A依赖不了C 但是有点麻烦,因为每次A想依赖于C都要确认B和C之间的 ...
随机推荐
- Linux内核分析第三周学习总结
Linux内核源码简介 arch/ 该目录中包含和硬件体系结构相关的代码,每种平台占一个相应的目录. 和32位PC相关的代码存放在x86目录下. 每种平台至少包含3个子目录:kernel(存放支持体系 ...
- C#改变图片大小
今天一女同事要做一个改变图片大小的功能,然后我就手写了几行代码,以后可能用得上 byte[] buffer = new byte[1]; //Byte转为Image对象 MemoryStream ms ...
- 『编程题全队』Beta 阶段冲刺博客三
1.提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID) (1) 昨天已完成的工作 孙志威: 1.添加登录框的功能 2.修改登录框的UI 孙慧君: 1.提醒显示UI设计: 2 ...
- HTML5 Base64_encoding_and_decoding
https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding In JavaSc ...
- Java和Android的Lru缓存,及其实现原理
一.概述 Android提供了LRUCache类,可以方便的使用它来实现LRU算法的缓存.Java提供了LinkedHashMap,可以用该类很方便的实现LRU算法,Java的LRULinkedHas ...
- python 安装influxdb-python
一.Linux下安装 1.yum install -y git 2.安装pip,参考:https://app.yinxiang.com/shard/s41/sh/0338ba85-5443-453f- ...
- python对redis的常用操作 下 (无序集合,有序集合)
无序集合: 首先介绍增加,删除和获得所有元素的方法.我将会用第二部分来讨论集合的特殊操作: In [136]: x.sadd("challenge", 1,2,3,4,5,6,7, ...
- apache2.4.29安装脚本
#!/bin/bash . /etc/init.d/functions yum install -y expat-devel gcc gcc-c++ zlib-devel openssl-devel ...
- delphi7调用数据库连接属性
背景:连接数据库用ADOQuery控件,但是程序一旦编译完成,如果想更改数据库连接设置还得重新修改ADOQuery的属性重新编译 如果可以在程序中可以随时设置ADOQuery的属性则会方便很多. 实现 ...
- 掌上电脑设备可以使用Ubuntu MATE 18.10 Linux映像了
就在几天前,Ubuntu 18.10发布了.操作系统被称为“Cosmic Cuttlefish”,有多种版本可供选择,除了常见的GNOME -- Xfce (Xbuntu), KDE (Kubuntu ...