Maven学习笔记2(坐标和依赖)
1、坐标
Maven坐标为各个构件建立了秩序,任何一个构件都必须明确自己的坐标,一个maven坐标是由一些元素确定的
<groupId>com.alivn.account</groupId>
<artifactId>account-email</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
groupId:定义为maven项目隶属的实际项目,可以相当于为一个项目的顶级。 比如 支付系统
artifactId:maven项目的一个子项目 比如 支付系统下的dao模块
version:当前项目的版本号
packaging:定义该maven项目的打包方式 默认jar
classifier:帮助构建输出一些附属属性,比如account-email.1.0.jar, 借助插件生成account-email.1.0-doc.jar(apiw文档)
2、依赖
每个project根元素下,可以包含节点<dependencies>节点。里面包含了若干依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
<type>jar</type>
<optional>true</optional>
<exclusions>
<exclusion>
<groupId>${dependencygroupId}</groupId>
<artifactId>${dependencyartifactId}</artifactId>
</exclusion>
</exclusions>
</dependency>
groupId、artifactId、version是一个引入一个依赖必不可少的元素。
scope:依赖的作用范围 test表示 只在test的代码里面的生效
type:依赖的类型 对应packaging
optional:依赖是否可选。
exclusions:排除依赖,当第二依赖里面依赖了一个不稳定的快照版本的jar时候,存在潜在危险,所以我们应该排除第二依赖里面的那个不稳定版本的依赖,在pom中引用为直接依赖。
3、依赖范围
maven在编译 测试 和运行时会使用三个不同的classpath,会根据以依赖范围处理不同的内容,比如主编译时,不会加入scope为test范围的代码,因为它的依赖范围是test
有以下几种依赖范围
compile:编译依赖范围 默认值 对编译 测试 运行 三种 classpath都有效
test:测试依赖范围 只对测试classpath有效
provided:以提供以来范围,仅对编译和测试有效,运行无效,比如servlet-*jar,运行时 框架有tomcat提供jar
runtime:对测试和运行有效 但编译无效 如JDBC驱动,只在运行的时候决定使用哪个数据库的驱动
system:系统依赖范围,和provided范围一致,但必须通过systemPath显示指定依赖文件
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
<scope>system</scope>
<systemPath>${home}/lib/mysql.rt</systemPath>
</dependency>
4、传递性依赖
A->B ,B->C=》A->C
如果A依赖于B B依赖于C 那么A依赖于C B为A 的第一直接依赖 C为B 的第二直接依赖。
根据scope的依赖范围不同 可以将C于A 的依赖范围 也会有变化 ,具体变化为以下表格 蓝色字体为第一直接依赖 红色字体为第二直接依赖
| 依赖范围 | compile | test | provided | runtime |
| compile | compile | —— | —— | runtime |
| test | test | —— | —— | test |
| provided | provided | —— | provided | provided |
| runtime | runtime | —— | —— | runtime |
5、依赖调解
maven传递依赖为我们带来了很多的方便,但是如果 A->B->C(2.0) A->D->C(1.0) 这个时候会解析 哪个版本的C
maven有两条规则:(当第一条规则 不生效时 使用第二条规则)
1、路径最近者优先 实例中 都是两步 距离是相同的 如果不同则去最近者
2、第一声明者优先 程序中 看B 和C 哪个jar里面的类先被使用,然后解析先被使用的jar的那条线路上的c
6、查看依赖的命令
mvn dependency:list(显示所有已解析的依赖)
mvn dependency:tree(显示依赖树)
mvn dependency:analyze(分析当前项目的依赖)
Maven学习笔记2(坐标和依赖)的更多相关文章
- Maven学习笔记—仓库
Maven仓库 1 什么是Maven仓库 在Maven中,任何一个依赖.插件或者项目构建的输出,都可以成为构件,而Maven通常在某个位置统一的存储所有Maven项目共享的构件,这个统一的位置就是Ma ...
- MAVEN学习笔记之Maven插件的应用(4)
MAVEN学习笔记之Maven插件的应用(4) <build> <pluginManagement> <plugins> <plugin> <gr ...
- MAVEN学习笔记之Maven生命周期和插件简介(3)
MAVEN学习笔记之Maven生命周期和插件简介(3) clean compile site三套生命周期相互独立. clean pre-clean 执行清理前的工作 clean 清理上一次构建生成的所 ...
- MAVEN学习笔记之基础(1)
MAVEN学习笔记之基础(1) 0.0 maven文件结构 pom.xml src main java package resource test java package resource targ ...
- Maven 学习笔记(二)
前面一文——Maven 学习笔记(一)中已经提到了 pom 的大部分配置,Maven 本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给创建来完成,每一个任务都会对应一个插件 ...
- Maven学习笔记-03-Eclipse下maven项目在Tomcat7和Jetty6中部署调试
现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...
- seaJs学习笔记之javascript的依赖问题
之前分别为大家介绍了有关javascript中的冲突和性能问题,今天为大家介绍一下有关javascript中的依赖问题.我们将继续就之前javascript中性能问题继续介绍. 先来回顾一下性能问题的 ...
- Maven学习笔记-04-Eclipse下maven项目在Tomcat7和Jetty6中部署调试
现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...
- MAVEN学习笔记之私服Nexus(2)
MAVEN学习笔记之私服Nexus(2) 私有服务器搭建 Nexus www.snatype.org下载 snatype-work 是默认nexus存储nexus a:将bin添加到环境中 Admin ...
- go微服务框架kratos学习笔记八 (kratos的依赖注入)
目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...
随机推荐
- [Go] 开始试探一门新语言的五点思考 - Golang
1.如果在其他语言环境中写的代码很烂,那么换一门语言很可能情况更糟,因为是涉及到基本功.工程能力和心思逻辑. 2.一定要了解语言解决的问题(比如:多核并发机制性能高.省机器.简洁易学.资料少),优势是 ...
- spring、mybatis事务配置和控制
springmybatis.xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi= ...
- 面试必备:ArrayList源码解析(JDK8)
面试必备:ArrayList源码解析(JDK8) https://blog.csdn.net/zxt0601/article/details/77281231 概述很久没有写博客了,准确的说17年以来 ...
- 吴裕雄 python深度学习与实践(18)
# coding: utf-8 import time import numpy as np import tensorflow as tf import _pickle as pickle impo ...
- ARTS打卡计划第一周-Share-系统字典模块的设计
在软件开发的过程,经常有一些类型的字段信息:性别.学历.职级.车辆类别.公司类型.结算类型等.这些字段有2个特征:1是字段可选的类型是有限,2是字段可能会变化,我们把这种字段描述为字段字段. 本篇文 ...
- TODO:BGP 建立过程
//TODO: Quagga 实时监控配置文件
- 基于django的博客系统
这是前段代码 达到的效果并不是太好,但我还是要发出来,有更好的建议可以和我讨论 后台还算可以 添加了分类和文章两个功能,还在优化,敬请期待....
- linux下压力测试工具ab的使用
一.安装 [root@node2 logs]# yum install httpd-tools 已加载插件:fastestmirror Loading mirror speeds from cache ...
- php 安装最新的redis连接扩展
用于与redis连接的Php扩展[RC表示公测,我们用的是不带RC的稳定版本]下载包地址:http://pecl.php.net/package/redis 最新稳定版本:4.3.0 下载包:# wg ...
- Python人工智能第二篇
Python人工智能之路 - 第二篇 : 现成的技术 预备资料: 1.FFmpeg: 链接:https://pan.baidu.com/s/1jonSAa_TG2XuaJEy3iTmHg 密码:w ...