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

这个生成源代码的插件,运行的时候不需要指定它的 groupId 和 artifactId,只需要执行mybatis-generator:generate 即可,因为这个插件的信息属于默认的两个插件组 org.apache.maven.plugins和org.codehaus.mojo其中的一个,如果是其他的话,则需要显式地配置一下。
servers
配置的私服的登录信息,比如 username、password等服务器的认证信息,也可以设置权限信息。
mirrors
远端的中央仓库,有时候下载第三方的 jar 包比较慢,可以更改为国内的一些镜像仓库,比如阿里云的仓库:
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central
如果是公司内部使用的 jar 包,可以放在自己搭建的私服上面,这里配置成自己的私服地址即可。
profiles、activeProfiles
其作用主要用于区分环境用的,也可以定义一些仓库,用来搜索需要的发布版或者快照版来构建,这个配置中的 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结构的更多相关文章
- Maven入门-5.Maven的聚合和继承
1.Maven的聚合1.1 聚合的配置2.Maven的继承2.1 可被继承的POM元素2.2 POM中使用继承2.3 继承dependency 1.Maven的聚合 在Maven入门-4.Maven的 ...
- Maven入门,Maven项目的创建,nexus 2.x搭建私服以及Maven多模块项目创建
maven的了解做一个总结,以便日后查阅, 若有不足之处,还望指出,学无止境 当然也能起到入门效果. 一,搭建maven私服 1.工具 a. Nexus 2.5.1-01 b. Maven 3.3.9 ...
- Maven 入门——认识 Maven
Maven /ˈmāvən/ ,可以翻译成"专家",是一款来自 Apache 组织的开源项目,用于项目管理.主要服务于基于 Java 平台的项目构建.依赖管理和项目信息管理. 构建 ...
- Maven入门:Maven的基本概念
本文转自:http://www.tianmaying.com/tutorial/maven-basic 看这篇文章之前,你应该先Run起来一个简单的Maven项目,先有个感性认识,然后再来听听对这些基 ...
- Maven入门-4.Maven的依赖
1.Maven的依赖1.1 添加依赖1.2 依赖范围(sope)依赖范围与classpath的关系1.3 依赖的传递性1.2.1 依赖传递性的冲突问题1. 第一种情况2. 第二种情况1.2.2 通过e ...
- Maven入门-2.Maven一些核心概念介绍
1.Maven仓库2.Maven坐标3.Maven插件和目标4.Maven生命周期4.1 clean:清理项目4.2 default:构建项目(重要)4.3 site:建立项目站点 1.Maven仓库 ...
- maven 入门
Apache Maven 入门篇 ( 上 ) 作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这 ...
- Maven 入门指南
为什么要用 Maven? Maven 主要帮助用户完成以下 3 个方面的工作: 生命周期管理,便捷的构建过程: 依赖管理,方便引入所需依赖 Jar 包: 仓库管理,提供统一管理所有 Jar 包的工具: ...
- Maven入门详解
什么是Maven Maven,鼎鼎大名,在今天之前,我对于它一直是处于一种"只闻其名不见其人"的状态.之所以说"只闻其名",是因为Maven太有名了,它是Apa ...
随机推荐
- 待了解概念_GraphicsView
Linux 的 KDE 是建立在 Graphics view基础上的. 新版本KDE 有向QML前移的趋势. Graphics View 使用了BSP 树的结构. Graphics View 是一个基 ...
- Codeforces Round #536 (Div. 2) B. Lunar New Year and Food Ordering
#include <bits/stdc++.h> #define N 300010 #define PII pair<int, int> using namespace std ...
- libtool 创建库的工具
libtool 创建库的工具 1. 背景 在不同的系统中建立动态链接库的方法有很大的差别,这主要是因为每个系统对动态链接库的用法和实现并不相同,以及编译器对动态链接库支持的选项也不太一样. 对于开发人 ...
- CSS 基础 例子 图片拼合技术
利用background-position xpos ypos 就是以图片的左上角顶点为原点,往下和右都为正,反之为负,移动图片 如: background-position: 15px 20px;( ...
- Handle( )
Handle( ) //得到PB窗口型对象的句柄 功 能:得到PB窗口型对象的句柄.使用该函数可以得到应用对象.窗口或控件的句柄,但不能得到绘图对象的句柄. 语 法:Handle ( object ...
- Android-Java-synchronized同步代码块的使用场景
synchronized同步代码块的使用场景 (满足以下两种条件,就要考虑使用synchronize同步代码块了) 1.被synchronized同步代码块{同步的代码},是被多次异步调用,什么叫多次 ...
- MySQL--当mysqldump --single-transaction遇到alter table(1)
部分生产环境采用mysqldump --single-transaction的方式在夜间进行数据库备份,而同事恰好在备份期间执行了alter table操作,操作部分成功部分失败,为啥呢? ##=== ...
- 3.怎样将ASP.NET MVC应用程序发布到IIS
这一篇,教大家怎么将ASP.NET MVC应用程序发布到本地或者IIS中.打开上一篇创建的ASP.NET MVC 5.0应用程序.[PS:上一篇--->2.第一个ASP.NET MVC 5.0应 ...
- 在Asp.Net MVC中利用快递100接口实现订阅物流轨迹功能
前言 分享一篇关于在电商系统中同步物流轨迹到本地服务器的文章,当前方案使用了快递100做为数据来源接口,这个接口是收费的,不过提供的功能还是非常强大的,有专门的售后维护团队.也有免费的方案,类似于快递 ...
- 背水一战 Windows 10 (47) - 控件(ScrollViewer 特性): Chaining, Rail, Inertia, Snap, Zoom
[源码下载] 背水一战 Windows 10 (47) - 控件(ScrollViewer 特性): Chaining, Rail, Inertia, Snap, Zoom 作者:webabcd 介绍 ...