概述

maven主要致力于让项目构建更加简单,提供统一的构建系统,提供优质的项目信息

pom文件样例

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><!-- 指定pom的版本(即pom文件的格式),目前版本号只有4.0.0 --><modelVersion>4.0.0</modelVersion><!-- The Basics 基础标签--><groupId>...</groupId><artifactId>...</artifactId><version>...</version><packaging>...</packaging><dependencies>...</dependencies><parent>...</parent><dependencyManagement>...</dependencyManagement><modules>...</modules><properties>...</properties><!-- Build Settings --><build>...</build><reporting>...</reporting><!-- More Project Information --><name>...</name><description>...</description><url>...</url><inceptionYear>...</inceptionYear><licenses>...</licenses><organization>...</organization><developers>...</developers><contributors>...</contributors><!-- Environment Settings --><issueManagement>...</issueManagement><ciManagement>...</ciManagement><mailingLists>...</mailingLists><scm>...</scm><prerequisites>...</prerequisites><repositories>...</repositories><pluginRepositories>...</pluginRepositories><distributionManagement>...</distributionManagement><profiles>...</profiles>
</project>

The Basics 基础属性

maven定位三要素

groupId:代表一个组织或者一个项目,如公司或者公司的某个项目,以倒序的方式写,如com.baidu或者com.baidu.brower
artifactId:代码具体的项目或者模块,如果groupId划分是组织,那么这个应该写具体的项目,如果groupId是一个大的项目,这边应该划分到具体的模块
version:代表具体的版本号
通过这个三个最基本的参数,我们就可以定位到具体需要使用的jar包

packing打包方式

默认值:jar
可选项:pom,jar,war,ejb,ear,rar,maven-plugin

dependencies 依赖管理

  • dependency样例
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">...<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><type>jar</type><scope>test</scope><optional>true</optional></dependency>...</dependencies>...
</project>
  • 三要素:

groupId,artifcatId,version定位三要素,来确定一个依赖

  • type 类型:

对于所选依赖的类型,即我们前面项目可以打成多种包,jar,pom之类。。。同样我们依赖的时候,也可以选择依赖的类型,默认是jar

  • scope 范围:

指定依赖生效的范围,maven其实有三套classpath,即编译,测试,运行(即打包后生成的target文件中的lib,是你实际运行时候所需要依赖的jar)

  • compile

默认选项是compile,指在代码编译,运行,测试三个阶段都生效。怎么理解这个,就是在你各个阶段的classpath里面都能找到这个依赖

  • runtime

这个选项的意思是只在运行和测试的时候生效,不需要经过编译。个人感觉比如动态加载某个类的时候才需要,比如常见的是数据库驱动。
正常情况下,你代码里加载驱动的时候都是class.forname(“xxx”),此时编译期间可以不用,但是你实际运行的时候是需要的,测试的时候也要要真正具体的驱动来生效。

  • test

test只在测试和编译的时候生效,在实际运行的时候不生效,因为实际target的lib包中不包含这些jar包

  • provided

跟compile一样,三个阶段都生效,但是实际的打包的时候target的lib包里面不包含这个jar包,由外部提供比如由jdk或者容器提供

  • system

跟provided相似,不过是引用本地jar包,与systemPath一起使用,实际打包的时候也不含这个jar包,如果想要打进去需要配置额外的插件

 <dependency><groupId>javax.sql</groupId><artifactId>jdbc-stdext</artifactId><version>2.0</version><scope>system</scope><systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
  • optional

默认为true, true or flase,代表这个依赖是否传递

依赖的传递性

在上述scope中,如果没有配置optional为false, compile和runtime是会依赖传递的,比如A依赖了B,B依赖了C,那么A也能使用C,这就是依赖的传递性

依赖的调解

假如一个项目中,存在如下依赖
A->B->C(1.2.0)
A->D->F->C(2.3.0)
依赖都会传递,同时依赖了两个版本的C jar包,此时会怎么处理?遵循以下两个原则:

  • 就近原则 即跟A依赖关系最近的优先使用,上述中,A->B->C,只有两层,所以他优先生效
  • 优先声明原则 如果两个路径长度一样怎么办呢?那就是谁先声明的谁生效,即pom文件谁在前面谁生效

依赖的冲突解决

由于依赖调解,有时候也会导致依赖冲突,最常见的就是日志组件的冲突,大家的实现都不相同,有的是log4j,有的是logback,此时我们需要将其他的日志组件排除掉,在dependency中添加如下标签,只需groupId和artifactId即可。

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">...<dependencies><dependency><groupId>org.apache.maven</groupId><artifactId>maven-embedder</artifactId><version>2.0</version><exclusions><exclusion><groupId>org.apache.maven</groupId><artifactId>maven-core</artifactId></exclusion></exclusions></dependency>...</dependencies>...
</project>

maven--pom文件之dependency介绍相关推荐

  1. MAVEN POM dependencies and Dependency Exclusions

    2019独角兽企业重金招聘Python工程师标准>>> Introduction This section discusses the functionality of option ...

  2. jenkins修改pom文件_jenkins小插曲-maven pom文件插件配置

    jenkins工作空间的文件还在workspace下面,现在将它自动部署到tomcat的webapps下面,需要在pom.xml文件中配置部署插件. 准备工作: 配置tomcat的访问权限,在mave ...

  3. Maven Pom文件中的scope含义

    一.scope作用 scope主要是为了管理依赖的部署,确定依赖的使用范围.使用scope标签,可以很方便.直观的进行依赖的总体管理. 二.scope的使用 compile(默认值) 缺省值,会随一起 ...

  4. Maven pom 文件解释

    1 - 什么是构建? 我们都知道,写完代码之后需要进行编译和运行,以笔者自身为例,使用 Eclipse 写完代码,需要进行编译,再生成 war 包,以便部署到 Tomcat. 在编写 Java 代码的 ...

  5. 【转载】Maven pom文件详解

    什么是pom?     pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件:开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的 ...

  6. Maven Pom文件标签详解

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  7. maven:pom文件详细信息

    一.maven项目的目录结构 ​ pom文件定于了一个maven项目的maven配置,一般pom文件的放在项目或者模块的根目录下. ​ maven的遵循约定大于配置,约定了如下的目录结构: 目录 目的 ...

  8. pom文件配置多个远程仓库地址_分布式配置中心Config

    一 配置中心认识 1 服务配置的现状 2 常用的配置管理解决方案缺点 a.硬编码[缺点:需要修改代码,繁琐.风险大] b.写在properties里面[缺点:在集群环境下,需要替换和重启] c.写在x ...

  9. kafka 的pom文件_基于SparkStreaming+Kafka+HBase实时点击流案例

    大数据技术与架构点击右侧关注,大数据开发领域最强公众号! 暴走大数据点击右侧关注,暴走大数据! 背景 Kafka实时记录从数据采集工具Flume或业务系统实时接口收集数据,并作为消息缓冲组件为上游实时 ...

最新文章

  1. JQuery实现点击TreeView文本展开/折叠子节点
  2. leetcode 【 Find Peak Element 】python 实现
  3. DDD 领域驱动设计-如何 DDD?
  4. 谈谈关于个人提升的一些思考
  5. UART_SEND详细设计方案
  6. android 整数与ip地址的转换
  7. 通过url,获取html内容,并解析,如何使用 JavaScript 解析 URL
  8. java dubbo 方案,Missing artifact com.alibaba:dubbo:jar:2.8.4 dubbo解决方案
  9. fork、getpid、getppid函数
  10. python音频聚类_python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
  11. 适配ofd签章SES_Signature
  12. Redis闲谈:你一定需要的知识图谱
  13. Python爬虫之二手房
  14. 中国2项上榜:《时代周刊》2019年度100大最佳发明榜单发布!
  15. 国内外神经网络研究现状,神经网络的发展现状
  16. 转:无损压缩和有损压缩
  17. 机器人莱克说明书_莱克扫地机器人—莱克扫地机器人的工作原理及分类
  18. Unicode编码和Base64编码
  19. 记一次greenplum集群数据库连接慢的问题定位
  20. vue路由——基础篇(二)

热门文章

  1. 鼠标事件offsetX会传递给子元素
  2. 公共资源交易中心开评标视频项目自动备份到蓝光光盘
  3. 微信小程序之输入框文本的获取与展示
  4. mysql从删库到坐牢_SQL实战新手入门:删除数据-DELETE语句(2)
  5. 微众银行2020校园招聘数据分析岗(风险管理方向)一面(2019.9.24)
  6. 【测试经验向】提测质量差 + 测试工期压缩,我要怎么办?
  7. 摘要算法(哈希算法)
  8. 虚拟世界和现实世界的未来
  9. android mvp 利弊,android mvp模式有什么弊端 - 什么是android mvp模式,android mvp模式有什么弊端...
  10. 计算计算机的流水线执行时间