1、settings.xml 元素解读

localRepository
该元素表示本地 Maven 仓库的地址,不设置的话,默认为 ~/.m2/repository
pluginGroups
将插件的信息注册到 Maven 中,是的执行 Maven plugin 命令的时候可以不指定 groupId 和 artifactId,比如:

这个生成源代码的插件,运行的时候不需要指定它的 groupId 和 artifactId,只需要执行mybatis-generator:generate 即可,因为这个插件的信息属于默认的两个插件组 org.apache.maven.pluginsorg.codehaus.mojo其中的一个,如果是其他的话,则需要显式地配置一下。
servers
配置的私服的登录信息,比如 usernamepassword等服务器的认证信息,也可以设置权限信息。
mirrors
远端的中央仓库,有时候下载第三方的 jar 包比较慢,可以更改为国内的一些镜像仓库,比如阿里云的仓库:

alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central

如果是公司内部使用的 jar 包,可以放在自己搭建的私服上面,这里配置成自己的私服地址即可。
profilesactiveProfiles
其作用主要用于区分环境用的,也可以定义一些仓库,用来搜索需要的发布版或者快照版来构建,这个配置中的 profile,如果在激活列表里边存在,则这些 profile 将会覆盖 pom.xml 中的相同 id 的 profile。

2、pom.xml 元素解读

modelVersion
如果使用的是 Maven 3.0 及以上的版本,这里的值默认都是 4.0.0,而这个值来自哪里呢,在 Maven 安装目录里 lib 目录里边的 /lib/maven-model-builder-3.5.4.jar,解压之后,进入到目录 org/apache/maven/model 里边,会看到一个 pom.xml 文件:

而且,继续往下看,你就会发现,为什么用 IDEA 生成的 Maven 项目,它的目录结构是约定好的,约定的配置就是这个 super pom,这样只要是使用 Maven 开发的项目,其目录结果都是一样的,这种思想就是常常听说的Convention Over Configuration(约定优于配置)。
groupId
定义当前 Maven 项目隶属的实际项目,由于经常会有多模块的 Maven 项目,所以 Maven 项目与实际项目不一定是一对一的关系,因此,groupId 不应该对应项目隶属的组织或公司,应该到具体的项目;实际的表示方式也应该与 Java 包名的表示方式类似,通常与域名反向一一对应。
artifactId
该元素定义实际项目中的一个 Maven 项目(模块),推荐的做法是使用实际项目名称作为 artifactId 的前缀,这样做的好处是方便寻找实际构件。
version
该元素定义 Maven 项目当前所处的版本。
packaging
打包方式,默认为 jar。
properties
用于定义一些配置常量,比如依赖的版本号。
dependencyManagement
该元素只能出现在父 pom.xml 中,其作用是为了统一版本号,而且这里的依赖只是一个声明,子 pom.xml 里用到其中某一个的时候,再去显式地引用。
dependency
引用依赖,其中的配置有如下几个:

  • type,默认为 jar
  • scope 表示其作用范围,有如下几个范围:
    • compile,编译时依赖,也是默认的依赖范围,编译、测试和运行都需要,比如** spring-core**
    • test,测试时依赖,只在测试阶段需要,比如** spring-test**
    • provided,编译时依赖,只在编译时需要,比如servlet
    • runtime,运行时依赖,只在运行时需要,比如JDBC驱动类
    • system,本地的一些 jar,比如短信的 jar 包,常用 ** systemPath**一起使用
  • exclusions,用来** 排除**由于传递依赖引入(参考第三小节)的但是是不需要的依赖
  • optional,可选依赖,默认为 false,用于放置依赖传递,当一个项目 A 依赖另一个项目 B 时,项目 A 可能很少一部分功能用到了项目 B,此时就可以在 A 中配置对 B 的可选依赖y

    3、传递性依赖

    传递性依赖可以减少一些引用的依赖,可以进行隐式地依赖,但是如果需要控制版本,最好的方式是,先排除该依赖,再显式地引用该依赖,依赖关系如下图:

    4、依赖仲裁

    如果根据传递性依赖,同时依赖了两次某一个 jar 包,例如,项目 A 有这样的依赖关系:A -> B -> C -> X(1.0)、A -> D -> X(2.0),X 是 A 的传递性依赖,那么哪个 X 会被 Maven 解析使用呢,Maven 依赖仲裁(Maven Mediation)的第一原则是:路径最近者优先,该例中 X(1.0) 的路径长度为 3,而 X(2.0) 的路径长度为 2,因此 X(2.0) 会被解析使用。
    再比如这样的依赖关系:A -> B -> Y(1.0),A -> C -> Y(2.0),Y(1.0) 和 Y(2.0) 的依赖路径长度是一样的,都为 2,根据 Maven 依赖仲裁(Maven Mediation)的第二原则:第一声明者优先,在 POM 中依赖声明的顺序决定了谁会被解析使用,顺序最靠前的那个依赖优先被解析,所以 Y(2.0) 就会被解析使用。

    5、优化依赖

    mvn dependency:analyze
    使用但未声明的依赖(Used undeclared dependencies),建议显示声明
    声明但未使用的依赖(Unused declared dependencies),有可能是运行时使用的

Maven 入门——认识Maven结构的更多相关文章

  1. Maven入门-5.Maven的聚合和继承

    1.Maven的聚合1.1 聚合的配置2.Maven的继承2.1 可被继承的POM元素2.2 POM中使用继承2.3 继承dependency 1.Maven的聚合 在Maven入门-4.Maven的 ...

  2. Maven入门,Maven项目的创建,nexus 2.x搭建私服以及Maven多模块项目创建

    maven的了解做一个总结,以便日后查阅, 若有不足之处,还望指出,学无止境 当然也能起到入门效果. 一,搭建maven私服 1.工具 a. Nexus 2.5.1-01 b. Maven 3.3.9 ...

  3. Maven 入门——认识 Maven

    Maven /ˈmāvən/ ,可以翻译成"专家",是一款来自 Apache 组织的开源项目,用于项目管理.主要服务于基于 Java 平台的项目构建.依赖管理和项目信息管理. 构建 ...

  4. Maven入门:Maven的基本概念

    本文转自:http://www.tianmaying.com/tutorial/maven-basic 看这篇文章之前,你应该先Run起来一个简单的Maven项目,先有个感性认识,然后再来听听对这些基 ...

  5. Maven入门-4.Maven的依赖

    1.Maven的依赖1.1 添加依赖1.2 依赖范围(sope)依赖范围与classpath的关系1.3 依赖的传递性1.2.1 依赖传递性的冲突问题1. 第一种情况2. 第二种情况1.2.2 通过e ...

  6. Maven入门-2.Maven一些核心概念介绍

    1.Maven仓库2.Maven坐标3.Maven插件和目标4.Maven生命周期4.1 clean:清理项目4.2 default:构建项目(重要)4.3 site:建立项目站点 1.Maven仓库 ...

  7. maven 入门

    Apache Maven 入门篇 ( 上 ) 作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这 ...

  8. Maven 入门指南

    为什么要用 Maven? Maven 主要帮助用户完成以下 3 个方面的工作: 生命周期管理,便捷的构建过程: 依赖管理,方便引入所需依赖 Jar 包: 仓库管理,提供统一管理所有 Jar 包的工具: ...

  9. Maven入门详解

    什么是Maven Maven,鼎鼎大名,在今天之前,我对于它一直是处于一种"只闻其名不见其人"的状态.之所以说"只闻其名",是因为Maven太有名了,它是Apa ...

随机推荐

  1. jQuery如何获取元素及选择器的参考

    获取元素 Jquery当中几乎所有的功能.选择.事件处理等都用到了这个函数.通常用来获取元素,获取到的元素都会被存储为jQuery对象. 例如: 先设定一个id为aaa的div <body> ...

  2. POJ3273--Monthly Expense(Binary Search)

    Description Farmer John is an astounding accounting wizard and has realized he might run out of mone ...

  3. Objective-C:01简介

    1.Objective-C简介 Objective-C是一种面向对象的计算机语言 OC不是一门全新的语言 C语言的基础上增加了一层最小的面向对象语法 OC完全兼容C语言 可以在OC代码中混入C语言代码 ...

  4. POJ 2570 线段树

    Potted Flower Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Jav ...

  5. FastReport报表设计(仔细看)

    FastReport报表设计 2011-06-16 16:56:19|  分类: 系统开发|举报|字号 订阅     下载LOFTER我的照片书  |     目录 5.1 前言 5.2 基本概念及操 ...

  6. UvaOJ 10167

    暴力搜索 #include<cstdio> struct node { int x; int y; }s[]; int main() { //freopen("input.txt ...

  7. C# 中使用Linq和Lambda表达式对List<T>进行排序

    C#中List<T>排序的两种方法 List<Student> stu = (List<Student>)Session["StudentList&quo ...

  8. Lerning Entity Framework 6 ------ Introduction to TPH

    Sometimes, you have created two models. They have the same parent class like this: public class Pers ...

  9. 《Python黑帽子:黑客与渗透测试编程之道》 Windows系统提权

    环境准备: pywin32的安装在第八章的键盘记录中有,这里还需要安装wmi: 在本人的32位win7上本来是没有easy_install这个命令的,这需要安装setuptools-0.6c11.wi ...

  10. cad.net的undo返回操作

    这是提供给许多从lisp转移到c#的开发人员的一个函数,这个函数利用后绑代码实现undo返回操作. 本代码由edata提供: edata博客 /// <summary> /// 命令动作编 ...