了解事物的产生必先了解产生事物的根源 题记
一直用maven进行项目管理,但对其还是一知半解。所以这次想对maven进行一个大体上的梳理。
我们都知道maven是一种依赖管理工具,但什么是依赖管理工具呢?
什么是依赖管理工具?
比如说你写了某个应用模块,这个应用模块需要和数据库交互,交互的前提是数据库驱动。换句话说,这个应用模块的运行需要依赖数据库驱动这一前提。管理这种依赖关系就是我们所说的依赖管理。我们知道一个复杂的应用可能存在着几十个乃至上百个依赖关系,如何对大量的依赖关系进行管理就促使的依赖工具的产生。其实当前存在着许多依赖工具,例如maven、Gradle(maven的改进版)等。
maven是如何实现依赖管理的?
如果是我们自己的话如何设计一个依赖管理工具?
1,如何描述依赖关系;
2,如何存储依赖关系中设计的库;
3,如何解析我们所定义的依赖关系的描述(1中的描述);
下面我们根据上面三个小问题来分析maven的依赖管理实现。
对于第一个问题(如何描述依赖关系),我们先看maven中的一个例子:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
<dependency>标签,词如其名,用来描述依赖的标签。对依赖定位则是通过<groupId>、<artifactId>、<version>三个标签共同描述。其中<groupId>是一般是组织的域名倒写,遵循Java package的命名习惯,<artifactId>是库本身的名称,<version>是版本描述。
这个依赖库定位是如何查找的呢?其实在依赖库的定位是分步进行的。
- 在 Maven 的本地仓库搜索
- 在 Maven 中央存储库搜索
- 在 Maven 远程仓库搜索 (如果在 pom.xml 中定义)
在这里我们首先讲一下 远程仓库之私服这一概念,私服,即私有服务器,是公司内部Maven项目需要通过其下载依赖包和插件的一个内部maven仓库。Nexus是常用的私用Maven服务器,一般是公司内部使用。
Maven私服的 个特性:
1.节省自己的外网带宽:减少重复请求造成的外网带宽消耗
2.加速Maven构件:如果项目配置了很多外部远程仓库的时候,构建速度就会大大降低
3.部署第三方构件:有些构件无法从外部仓库获得的时候,我们可以把这些构件部署到内部仓库(私服)中,供内部maven项目使用
4.提高稳定性,增强控制:Internet不稳定的时候,maven构建也会变的不稳定,一些私服软件还提供了其他的功能
5.降低中央仓库的负荷:maven中央仓库被请求的数量是巨大的,配置私服也可以大大降低中央仓库的压力
本地仓库
Maven的本地资源库是用来存储所有项目的依赖关系(插件jar和其他文件,这些文件被Maven下载)到本地文件夹。很简单,当你建立一个Maven项目,所有相关文件将被存储在你的Maven本地仓库。
默认情况下,Maven的本地资源库默认为 .m2 目录文件夹:
- Unix/Mac OS X – ~/.m2
- Windows – C:\Documents and Settings\{your-username}\.m2
更新Maven的本地库
通常情况下,可改变默认的 .m2 目录下的默认本地存储库文件夹到其他更有意义的名称,例如, maven-repo
找到 {M2_HOME}\conf\setting.xml, 更新 localRepository 到其它名称。
{M2_HOME}\conf\setting.xml
<settings><!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ~/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
--><localRepository>D:\software\yiibai.com\apache-maven\repository</localRepository>
如果Maven没有从本地资源库获得 Maven 的本地资源库依赖资源,它会从默认的 Maven 中央存储库 – http://repo1.maven.org/maven2/ 查找下载。
在Maven中,当你声明的库不存在于本地存储库中,也没有不存在于Maven中心储存库,那么Maven会在 pom.xml 文件定义的远程存储库搜索,如果还没有找到,提示错误信息,否则退出。
例如:添加Java.net远程仓库的详细信息在“pom.xml”文件。
<project ...> <repositories> <repository> <id>java.net</id> <url>https://maven.java.net/content/repositories/public/</url> </repository> </repositories> </project>
随着maven的进化,maven由项目依赖工具逐渐转变成项目管理工具。
maven是如何实现项目管理的?
Maven定义为项目管理工具,包含了项目从源码到发布的整个生命周期。Maven引入了插件机制,Maven的本身的编辑打包等功能都是用插件来实现的,也允许用户自己定义插件。同时涉及构建生命周期的不同的阶段,依赖也需要确定是编译依赖?测试依赖?运行时依赖?于是依赖多了scope的定义。
maven的基本工作文件是POM文件,这是一个xml文件。POM 包含的项目是使用 Maven 来构建的,它用来包含各种配置信息。POM 也包含了目标和插件。在执行任务或目标时,Maven 会使用当前目录中的 POM。它读取POM得到所需要的配置信息,然后执行目标。部分的配置可以在 POM 使用如下:
- project dependencies
- plugins
- goals
- build profiles
- project version
- developers
- mailing list
创建一个POM之前,应该要先决定项目组(groupId),它的名字(artifactId)和版本,因为这些属性在项目仓库是唯一标识的。
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
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yiibai.project-group</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<project>
要注意的是,每个项目只有一个POM文件。
- 所有的 POM 文件要项目元素必须有三个必填字段:
groupId
,artifactId
,version
- 在库中的项目符号是:
groupId:artifactId:version
- pom.xml 的根元素是
project
,它有三个主要的子节点。
Maven的核心特征是依赖管理。管理依赖关系变得困难的任务一旦我们处理多模块项目(包含数百个模块/子项目)。 Maven提供了一个高程度的控制来管理这样的场景。
当一个库说A就依赖于其他库说B的情况下,另一个项目Ç想用A,则该项目需要使用库中B。
在Maven帮助下以避免这样的要求来发现所有需要的库。 Maven通过读取依赖项项目文件(pom.xml中),找出它们的依赖等。
我们只需要在每个项目POM定义直接依赖关系。 Maven自动处理其余部分。在maven之怎么做?中我们将学习maven如何具体管理依赖关系的。