1. Maven 简介
1)项目构建
完成工程发布流程需要的一系列步骤,包括:编译、测试、打包、部署...
2)传统项目管理状态分析
- jar 包不统一,jar 包不兼容
- 工程升级维护过程操作繁琐
- ...
3)项目构建工具
- 传统构建工具 Ant:需编写 build.xml 文件来配置任务流程
- 新兴构建工具 Gradle:以 Android 为典型,基本现在所有 Android 项目都采用 Gradle 作项目构建工具;配置写在 build.gradle 文件中
- 主流构建工具 Maven:基于约定优于配置原则(约定的一些规范无需再配置)的项目构建工具。遵循约定虽然损失了一定的灵活性,用户不能随意安排目录结构,但是却能减少配置。更重要的是,遵循约定能够帮助用户遵守构建标准。
4)约定优于配置
如果没有约定,10 个项目可能使用 10 种不同的项目目录结构,这意味着交流学习成本的增加,当新成员加入项目的时候,他就不得不花时间去学习这种构建配置。而有了 Maven 的约定,大家都知道什么目录放什么内容。
也许这时候你会问,如果我不想遵守约定该怎么办?这时,请首先问自己三遍,你真的需要这么做吗?如果仅仅是因为喜好,就不要耍个性,个性往往意味着牺牲通用性,意味着增加无谓的复杂度。
1.1 Maven 定义
- Maven 的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
- POM(Project Object Model):项目对象模型
1.2 Maven 作用
- 项目构建:提供标准的、跨平台的自动化项目构建方式
- 依赖管理:方便快捷地管理项目依赖的资源(jar 包),避免资源间的版本冲突问题
- 统一开发结构:提供标准的、统一的项目结构
例:一个由 Maven 构建的 Java 工程目录结构默认如下:
pom.xml:项目描述文件
src/main/resources:存放 Java 源码的目录
src/main/resources:存放资源文件的目录
src/test/java:存放测试源码的目录
src/test/resources:存放测试资源的目录
target:存放所有编译、打包生成的文件
注意:所有的目录结构都是约定好的标准结构,我们千万不要随意修改目录结构。
2. Maven 下载与安装
下载地址:maven.apache.org/download.cg…
Maven 属于绿色版软件(解压即安装)
Maven 环境变量配置:
- 依赖 Java,需要配置 JAVA_HOME
- 设置 Maven 自身的运行环境,需要配置 MAVEN_HOME
- 1)新建 MAVEN_HOME
- 2)在 Path 变量中添加
%MAVEN_HOME%\bin
- 1)新建 MAVEN_HOME
- 测试环境配置结果
3. Maven 基础概念与配置
3.1 仓库
- 仓库作用:存储资源,包含各种 jar 包
- 仓库分类
- 本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源
- 远程仓库:非本机电脑上的仓库,为本地仓库提供资源
- 中央仓库:Maven 开发团队维护,存储所有资源的仓库
- 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源
- 私服的作用
- 保存具有版权的资源,包含购买或自主研发的 jar 包
- 中央仓库中的 jar 都是开源的,不能存储具有版权的资源
- 一定范围内共享资源,仅对内部开放,不对外共享
- 保存具有版权的资源,包含购买或自主研发的 jar 包
3.2 坐标
1)什么是坐标?
Maven 中的坐标用于描述仓库中资源的位置
maven.org 中央仓库:repo1.maven.org/maven2/
2)Maven 坐标主要组成
groupId:定义当前 Maven 项目隶属组织名称(通常是域名反写,例如:org.mybatis)
artifactId:定义当前 Maven 项目名称(通常是模块名称,例如:CRM、SMS)
version:定义当前项目版本号
packaging:定义该项目的打包方式
3)Maven 坐标的作用
使用唯一标识,唯一性定义资源位置,通过该标识可以将资源的识别与下载工作交由机器完成
3.3 本地仓库配置
Maven 启动后,会自动保存下载的资源到本地仓库,如下将自定义本地仓库位置:
3.4 远程仓库配置
Maven 默认连接的 Central Repository 位置(pom-4.0.0.xml 文件中)
3.5 镜像仓库配置
在 setting.xml 文件中配阿里云镜像仓库,当我们需要访问中央仓库时,直接访问国内的镜像仓库,提升了访问速度。
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
-->
<!-- 配置具体的仓库的下载镜像 -->
<mirror>
<!--此镜像的唯一标识符,用来区分不同的 mirror 元素-->
<id>nexus-aliyun</id>
<!--对哪种仓库进行镜像,简单说就是代替哪个仓库-->
<mirrorOf>central</mirrorOf>
<!--镜像名称-->
<name>Nexus aliyun</name>
<!--镜像URL-->
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
4. Maven 项目构建命令
Maven 构建命令使用 mvn 开头,后面添加功能参数,可以一次执行多个命令,使用空格分隔
| 命令 | 含义 |
|---|---|
mvn compile | 编译 |
mvn clean | 清理 |
mvn test | 测试 |
mvn package | 打包 |
mvn install | 安装到本地仓库 |
5. 插件创建工程
- 创建工程
mvn archetype:generate
-DgroupId={project-packaging}
-DartifactId={project-name}
-DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false
- 创建 Java 工程
mvn archetype:generate
-DgroupId=com.one
-DartifactId=JavaProject
-DarchetypeArtifactId=maven-archetype-quickstart
-Dversion=0.0.1-snapshot
-DinteractiveMode=false
- 创建 Web 工程
mvn archetype:generate
-DgroupId=com.one
-DartifactId=WebProject
-DarchetypeArtifactId=maven-archetype-webapp
-Dversion=0.0.1-snapshot
-DinteractiveMode=false
6. IDEA 生成 Maven 项目
IDEA 对 3.6.2 及以上版本存在兼容性问题,为避免冲突,IDEA 中安装使用 3.6.1 版本。
6.1 配置 Maven
6.2 原型创建 Java 项目
6.3 原型创建 Web 项目
6.4 插件
配置 Tomcat7 运行插件(Plugin):
<!-- 构建 -->
<build>
<!-- 设置插件 -->
<plugins>
<!--具体插件-->
<plugin>
<!-- 地址: https://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin -->
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<!-- 自定义配置端口、项目访问路径... -->
<configuration>
<port>80</port>
<path>/web_App</path>
</configuration>
</plugin>
</plugins>
</build>
7. 依赖管理
7.1 依赖配置
- 依赖指当前项目运行所需的 jar 包,一个项目可以设置多个依赖
- 格式:
<!--设置当前项目所依赖的所有jar包-->
<dependencies>
<!--设置具体依赖-->
<dependency>
<!--依赖所属群组id-->
<groupId>junit</groupId>
<!--依赖所属项目id-->
<artifactId>junit</artifactId>
<!--依赖版本号-->
<version>4.12</version>
</dependency>
</dependencies>
7.2 依赖传递
- 依赖具有传递性
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:当前项目的依赖资源如果依赖其他资源,则称当前项目间接依赖其他资源
7.3 依赖传递冲突问题
- 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
- 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
- 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的
7.4 可选依赖
可选依赖指对外隐藏当前所依赖的资源——透明不可视
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--可选依赖:true-->
<!-- 被引用资源-配置 -->
<optional>true</optional>
<version>4.12</version>
</dependency>
7.5 排除依赖
排除依赖指主动断开依赖的资源,被排除的资源无需指定版本——不需要
<dependency>
<groupId>com.one</groupId>
<artifactId>project02</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
<!-- 引用资源-配置 -->
<!-- 排除依赖:主动断开依赖的资源 -->
<exclusions>
<!-- 被排除的资源无需指定版本!因为排除所有版本! -->
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
7.6 依赖范围
- 依赖的 jar 默认情况可以在任何地方使用,可以通过 scope 标签设定其作用范围
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
<!-- 作用范围:runtime;仅参与打包-->
<scope>runtime</scope>
</dependency>
- 作用范围
- 主程序范围有效(main 文件夹范围内)
- 测试程序范围有效(test 文件夹范围内)
- 是否参与打包(package 指令范围内)
7.7 依赖范围传递性
带有依赖范围的资源在进行传递时,作用范围将受到影响
8. Maven 生命周期与插件
8.1 项目构建生命周期
Maven 构建生命周期就是 Maven 将一个整体任务划分为一个个的阶段,类似于流程图,按顺序依次执行。也可以指定该任务执行到中间的某个阶段结束。
Maven 对项目构建的生命周期划分为 3 套:
- clean:清理工作
- default:核心工作,例如:编译,测试,打包,部署等
- site:产生报告,发布站点等
注意:当执行到某一阶段,此前所有的工作都会完成。
8.2 插件
- 插件与生命周期内的各阶段绑定,在执行到对应生命周期时执行对应的插件功能
- 默认 maven 在各个生命周期上绑定有预设的功能
- 通过插件可以自定义其他功能
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.0</version>
<executions>
<!--执行-->
<execution>
<!-- 配置对应的执行位置! -->
<goals>
<!--对源码进行打包!-->
<goal>jar</goal>
<!--同时对测试源码打包!-->
<goal>test-jar</goal>
</goals>
<!--执行到 generate-test-resources 阶段或此后阶段都会运行此插件!-->
<phase>generate-test-resources</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
例如 source-plugin:
更多插件及其用法详见:maven.apache.org/plugins/ind…
Maven 进阶文章即将上线,敬请期待...
下文:Maven 进阶之旅
原创不易🧠 转载请标明出处🌊
若本文对你有所帮助,点赞支持嗷🔥