maven之是什么?

了解事物的产生必先了解产生事物的根源   题记

一直用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>是版本描述。

        这个依赖库定位是如何查找的呢?其实在依赖库的定位是分步进行的。

  1. 在 Maven 的本地仓库搜索 
  2. 在 Maven 中央存储库搜索
  3. 在 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 目录文件夹:

  1. Unix/Mac OS X – ~/.m2
  2. 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”文件。

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>
XML

要注意的是,每个项目只有一个POM文件。

  • 所有的 POM 文件要项目元素必须有三个必填字段: groupIdartifactIdversion
  • 在库中的项目符号是:groupId:artifactId:version
  • pom.xml 的根元素是 project,它有三个主要的子节点。

Maven的核心特征是依赖管理。管理依赖关系变得困难的任务一旦我们处理多模块项目(包含数百个模块/子项目)。 Maven提供了一个高程度的控制来管理这样的场景。

当一个库说A就依赖于其他库说B的情况下,另一个项目Ç想用A,则该项目需要使用库中B。

在Maven帮助下以避免这样的要求来发现所有需要的库。 Maven通过读取依赖项项目文件(pom.xml中),找出它们的依赖等。

我们只需要在每个项目POM定义直接依赖关系。 Maven自动处理其余部分。在maven之怎么做?中我们将学习maven如何具体管理依赖关系的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值