Maven 学习笔记(一) —— 简介

一. 简介

1. 什么是 maven

Maven 是一个项目管理工具, 包含了以下内容:

  • 一个项目对象模型, project object model
  • 一组标准集合,
  • 一个项目生命周期, project lifecycle
  • 一个依赖管理系统, dependency management system
  • 以及定义在生命周期各阶段(phase)的插件(plugin)和目标(goal)

当你使用 maven 的时候, 你要用一个明确定义的项目对象模型, 然后 maven 可以应用横切的逻辑, 这些逻辑来自一组共享的或者自定义的插件

2. 约定优于配置

“约定优于配置” 是一个简单的概念, 系统, 类库, 框架都应该设定一些合理的默认值, 而不要求用户提供一些非必须的配置.

maven 默认情况下规定了项目的几个关键目录, 只要用户将相应的文件放在这下路径下, maven 就能正常工作. 而且 maven 最有价值的"约定"是它默认的项目生命周期, 以及一组构建和装配软件的通用插件.

只要遵循 maven 的这些约定, 用户几乎不需要添加配置, maven 就可以将剩下的事情完成.

约定优于配置的"副作用"是牺牲了一定的自由度, 但这是值得的, 遵循一定的约定, 会让软件开发和技术交流变得更加容易.

如果确实需要对项目进行更多的自定义设置, maven 也允许用户修改相关的配置.

3. 插件的重用

maven 的核心其实不做什么事情, 主要完成 pom 的解析和仓库的管理, 实现依赖/插件的下载工作.

而具体的构建工作, 则是由插件来实现. 如果某个插件的新版本引入了新的功能特性, 那么用户可以通过更换这个插件的版本, 来获取到新的特性, 而完全不需要对自己项目代码做任何修改

4. 使用 maven

4.1.基本概念

在使用 maven 之前, 需要先了解几个概念

  • 仓库 repository

    存储 maven 在项目构建过程中需要使用的一些构件, 包括依赖, 插件等, 有远程仓库和本地仓库

    maven 在构建过程中会先从本地获取需要的构件, 如果本地没有找到, 则会从远程仓库获取

  • 坐标 coordinate

    从仓库中定位一个构件需要提供的信息, 包括 GroupId-组织, ArtifactId-项目, Packaging-打包类型, Version-版本号

    在声明自己项目的时候, 使用如下格式声明坐标

    <groupId>com.loyofo</groupId>
    <artifactId>mutilmvn</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    

    而在引用依赖的时候, 则是使用如下格式, 注意其中的 packaging 换成了 type

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <!-- type 默认为 jar, 可省略 -->
        <type>jar</type>
        <version>3.8.1</version>
    </dependency>
    

    其中的 packaging, 或者说 type, 默认为jar, 这也是依赖真正要用的部分, 因此 maven 坐标通常也会称为 GAV 坐标.

    xml 格式比较冗长, 有的地方也会有缩略写法, 如 gradle, 缩略格式将 GAPV 按顺序排列, 用冒号 : 分隔, 如下:

    groupId: artifactId: packing: version

  • 插件 plugin

    maven 依靠插件来完成项目构建工作, 这些插件可以通过坐标从仓库中获取. 如下所示

    <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
    </plugin>
    
  • 目标 goal

    目标, 即一个插件需要完成的某个工作任务. maven 对项目的构建工作, 就是通过执行一个个插件目标来完成的,

    目标是插件提供的, 某个插件的某个目标, 可以用如下格式来确定

    plugin: goal

  • 生命周期阶段 phase

    生命周期中的某个阶段, 通常会跟某个插件目标绑定在一起, 执行这个阶段的时候, 就是执行这个插件的目标

  • 生命周期 lifeCycle

    项目构建的全过程, 称为 maven 项目的生命周期, 由一个个的生命周期阶段组成,

    当生命周期阶段依次执行时, 就会完成一个个的插件目标, 完成 编译-测试-打包-发布 的一系列工作

  • 项目对象模型 pom

    项目描述的模型, 记录了项目的坐标, 许可信息, 开发者信息, 依赖, 插件, profile 等内容,

    修改 pom.xml 的内容, 可以指导 maven 如何去完成构建工作.

4.1. 运行 maven

1)通过插件目标执行

maven 的具体工作其实是一个个的插件目标, 如果想让 maven 执行某个工作, 可以直接通过命令执行插件目标

mvn 插件: 目标

2) 通过生命周期(阶段)执行

maven 的生命周期是一个插件目标的序列, 当我们指定让 maven 执行到生命周期中的某一个阶段时, maven 将会按照生命周期的顺序, 依次完成前导的各个阶段, 即完成了一系列的插件目标, 然后在完成指定阶段所绑定的插件目标后结束.

mvn 生命周期阶段

3) 带参数执行

有时候需要修改构建工作, 比如修改参数, 或指定 profile, 可以在命令中加入参数来实现

其中 -D 表示修改参数, -P 表示激活指定的配置文件

mvn 命令 -D参数 -P配置profile

4) Ide 工具
a. eclipse + m2e

eclipse 集成了 m2e 插件, 通过右键的 maven build... , 设置命令后执行

这里写图片描述

b. idea + maven support

idea 自带了一个 maven support 的插件, 默认显示在界面右侧边栏, 可以快速执行某个生命周期阶段, 切换profile, 或是运行某个插件, 也可以自己输入命令执行

这里写图片描述

4.3. 使用 Maven Help 插件

maven help 插件有四个目标:

  • help: active-profiles

    列出当前构建中的有效 profile, 并指出该 profile 是在什么地方定义的

  • help: effective-pom

    显示当前构建的实际 pom, 包含活动的 profile

  • help: effective-settings

    显示项目的实际 settings, 包括全局 settings, 和用户 settings

  • help: describe

    描述插件的属性, 相当于插件的帮助文档, 不需要在项目目录下运行, 但需要-Dplugin指定要查询的插件

    使用插件的前缀查询

    mvn help:describe -Dplugin=help

    使用插件的坐标查询, 其中 version 是可选的

    mvn help:describe -Dplugin=Gid: Aid: Ver

    如果需要更详细的介绍, 可以添加 -Dfull 参数

    mvn help:describe -Dplugin=help -Dfull

    也可以查看插件某个目标的介绍, 使用 -Dmojo 参数传入

    mvn help:describe -Dplugin=compiler -Dmojo=compile -Dfull

5. 项目对象模型

5.1. pom 的内容

这里写图片描述

pom 包含四类描述和配置

  • 项目总体信息

    包含一个项目的名称, url, 发起组织, 项目开发者和贡献者, 许可证等

  • 构建设置

    可以在这一部分自定义 maven 的构建行为, 可以更改源码和测试代码的位置, 添加插件, 绑定插件到生命周期, 自定义站点生成参数等

  • 构建环境

    构建环境包含了一些能在不同使用环境中激活的 profile, 比如在开发环境和生产环境使用不同的数据库配置信息等

  • pom 关系

    一个项目很少孤立存在, 它会以来与其他项目, 可能从父项目继承 pom 设置, 要定义自身的坐标, 还可能包含子模块

5.2. 超级 pom

maven 定义了一个超级 pom, 所有项目都会从超级 pom 中继承设置, 超级 pom 中的设置, 就是maven的"约定"部分, 遵循约定有利于项目的分享和交流, 如非必要不应修改相关配置.

  • 超级 pom 中定义了默认的中央仓库, 但关闭了 SNAPSHOT , 用户可以从中央仓库获取依赖, 但不能获取到 SNAPSHOT 的开发中版本.
  • 如果想使用 maven 私服, 或者其他的第三方仓库, 可以在 settings.xml 或是项目的 pom.xml 中自定义仓库设置.
  • 中央仓库也包含插件, 同样关闭了 SNAPSHOT 版本. 为了兼容旧项目, 超级 pom 声明了旧版的插件版本, 且默认不更新. 如果确定需要使用新版本的插件, 请在自己的项目 pom.xml 中声明
  • build 元素设置了 maven 标准目录

5.3. 有效 pom

所有 maven 项目的 pom 都继承自超级 pom, 同时还会从settings.xml , 父项目 pom, profile 中获取设置, 最终得到一个混合了各个 pom 设置的有效 pom, 如果想查看项目最终有效的 pom, 可以运行 help 插件的目标获取

mvn help: effective-pom

5.4. 自定义 pom

可以在 pom 中进行各种构建设置, 典型的 pom 结构如下

pom支持的完整内容

<project>
    <!-- 当前pom的版本, 一般为4.0.0 -->
    <modelVersion/>

    <!-- 声明当前项目所属的父项目 -->
    <parent>
        <groupId/>
        <artifactId/>
        <version/>
        <relativePath/>
    </parent>

    <!-- 声明当前项目的坐标 -->
    <groupId/>
    <artifactId/>
    <version/>
    <packaging/>

    <!-- 声明当前项目的描述 -->
    <name/>
    <description/>
    <url/>

    <!-- 声明发布的相关信息, 发布到什么地方 -->
    <distributionManagement/>
    
    <!-- 声明当前模块包含哪些子模块 -->
    <modules>
    	<module/>
    </modules>

    <!-- 自定义变量 -->
    <properties>
        <key>value</key>
    </properties>

    <!-- 声明依赖, 但并未真正加载, 要用的话需要在 dependencies 中添加 -->
    <dependencyManagement>
        <dependencies>
            <dependency/>
        </dependencies>
    </dependencyManagement>

    <!-- 添加依赖, 如果在 dependencies 中有声明, 则可以只写 Gid 和 Aid -->
    <dependencies>
        <dependency/>
    </dependencies>

    <!-- 添加仓库 -->
    <repositories>
        <repository/>
    </repositories>

    <!-- 添加插件仓库 -->
    <pluginRepositories>
        <pluginRepository/>
    </pluginRepositories>

    <!-- 构建设置 -->
    <build>
        <!-- 添加资源目录 -->
        <resources>
            <resource/>
        </resources>

        <!-- 添加测试资源目录 -->
        <testResources>
            <testResource/>
        </testResources>
		
        <!-- 构建后文件的位置和文件名 -->
        <directory/>
        <finalName/>
        
        <!-- 资源过滤器, 可以替换资源目录中文件中的变量 -->
        <filters/>
        
        <!-- 声明插件, 但未真正加载, 需要在 plugins 中添加 -->
        <pluginManagement>
            <plugins>
                <plugin/>
            </plugins>
        </pluginManagement>

        <!-- 添加插件, 如果在 pluginManagement 中有声明, 可以只写 Gid 和 Aid -->
        <plugins>
            <plugin/>
        </plugins>
    </build>

    <!-- 添加 profiles -->
    <profiles>
        <profile/>
    </profiles>
</project>

5.5. 项目版本号

maven 建议采用以下格式定义版本号

<主版本号>. <次版本号>. <增量版本号>-<限定版本号>

1.3.5, 1.0.2-alpha

当按照这个格式声明项目版本时, 则可以在以后引用依赖时使用"依赖版本界限"对依赖版本进行限制.

如果不符合这个规则, 则会使用字符串比较.

SNAPSHOT - 快照

对于 SNAPSHOT 的开发版本, maven 会在发u这个组件时将该符号展开成时间戳, 即发布了该项目的一个快照版本.

LATEST, RELEASE

LATEST: 表示某个特定构件的最新发布版本(如果启用了 snapshot 库则是最新快照版本)

RELEASE: 表示仓库中最后一个非快照的版本

不建议在项目中使用这种不确定的版本, 可能在版本变换时会出现意想不到的问题.

5.6. 属性引用

pom 里面可以使用 ${...} 来引用一个属性, 在构建时会将有效的值替换到引用处, 可以在有效 pom 中看到

1) 声明属性变量

通常会使用 properties 元素来声明一些变量, 就可以在 pom 中其他地方进行引用

<KEY> VALUE </KEY>

<properties>
    <spring.version>4.3.3.RELEASE</spring.version>
</properties>
2) 预设属性变量

除了用户自己定义的属性变量, maven 也有几个预设的属性

  • env

    ${env.xxx} 属性暴露了操作系统或者 shell 的环境变量, 比如 ${env.PATH} 会被替换成系统的 PATH 变量

  • project

    ${project.xxx} 变量暴露了当前 pom, 可以使用 . 路径来引用 pom 中定义的属性值

    ${project.groupId} 引用了当前项目的 GroupId

  • settings

    ${settings.xxx} 暴露了 maven settings 的信息, 可以引用在 setting.xml 中定义的属性值

3) 引用属性变量

使用 ${...} 对已声明的属性进行引用, 将会在构建时替换成真实值

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
</dependency>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值