Maven入门
概述
- Maven 是 Apache 软件基金会组织维护的一款自动化构建工具(java编写),专注服务于 Java 平台的
项目构建
和依赖管理
。 - Maven 本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
- POM(Project Object Model):项目对象模型
Maven 作用
- 项目构建:提供标准的,跨平台的自动化项目构建方式。
- 依赖管理:方便快捷的管理项目依赖的资源(jar),避免资源间版本的冲突问题。
- 统一开发结构:提供标准的,统一的项目结构。
maven基础概念
-
仓库
用于存储资源,包含各种jar包(Maven的插件,自己开发项目的模块,第三方框架或工具的 jar 包)。
-
坐标
用于描述仓库中具体资源的位置。
查找jar的仓库坐标:https://mvnrepository.com,资源搜索条件可以是:groupId 或 artifactId。
这个坐标是给maven工具用的,maven会根据这个坐标查找并下载资源。坐标组成: groupId:定义当前maven项目隶属组织名称(通常域名倒写) artifactId:定义当前maven项目名称 version:定义当前项目版本号
仓库配置
- 配置本地仓库(即:资源下载到哪)
- setting文件默认配置
<localRepository>${user.name}/.m2/respository</localRepository>
- 修改setting文件的本地仓库地址
<localRepository>D:\mavenCompany\repository</localRepository>
- setting文件默认配置
- 配置阿里镜像仓库(即:资源从哪来)
- 默认配置是从中央仓库下载
- setting文件中修改为阿里镜像下载
<mirrors> <!-- 配置具体仓库的下载镜像 --> <mirror> <!-- 镜像的维一标识,自定义 --> <id>mirror-aliyun</id> <!-- 表示对哪一个仓库进行镜像 --> <mirrorOf>central</mirrorOf> <!-- 镜像仓库的名称 --> <name>mirror</name> <!-- 镜像仓库组的URL --> <url>https://maven.aliyun.com/nexus/content/groups/public</url> </mirror> </mirrors>
- 默认配置是从中央仓库下载
使用IDEA创建一个maven工程
Maven生命周期及常用命令
构建(build),是面向过程的(从开始到结尾的多个步骤),涉及到多个环节的协同工作。构建过程的几个主要环节 :清理、编译、测试、报告、打包、安装、部署 。
对项目的构建是建立在生命周期模型上的,它明确定义项目生命周期各个阶段,并且对于每一个阶段提供相对应的命令。
构建项目时按照生命周期顺序构建
,每一个阶段都有特定的插件来完成。不论现在要执行生命周期中的哪个阶段,都是从这个生命周期的最初阶段开始的
。
mvn clean 清理(会删除原来编译和测试的目录,即 target 目录,但是已经 install 到仓库里的包不会删除)
mvn compile 编译主程序(会在当前目录下生成一个 target,里边存放编译主程序之后生成的字节码文件)
理解:
1. 编译src/main/java/目录下的java文件编译为class文件,同时把class文件拷贝到target/classes目录下面
2. 把src/main/resourses目录下的所有文件都拷贝到target/classes目录下
mvn test-compile 编译测试程序(会在当前目录下生成一个 target,里边存放编译测试程序之后生成的字节码文件)
理解:
1. 编译src/main/test/目录下的java文件编译为class文件,同时把class文件拷贝到target/test-classes目录下面
mvn test 测试(会生成一个目录surefire-reports,保存测试结果)
mvn package 打包主程序(会编译、编译测试、测试、并且按照 pom.xml 配置把主程序打包生成 jar 包或者 war 包)
理解:
1. 把程序中src/main/目录下面编译后的class文件,和resources中的配置文件放入一个压缩文件。
mvn install 安装主程序(会把本工程打包,并且按照本工程的坐标保存到本地仓库中)
mvn deploy 部署主程序(会把本工程打包,按照本工程的坐标保存到本地库中,并且还会保存到私服仓库中。还会自动把项目部署到 web 容器中)。
- jar包本地仓库安装的路径
依赖管理(例:A依赖B,B依赖C)
-
依赖传递
- 直接依赖:A直接依赖B
- 间接依赖:A间接依赖C
- 依赖传递冲突问题:
- 路径优先:依赖中出现相同资源,层级越深,优先级越低
- 声明优先:依赖的资源处于同一级别,优先使用配置的顺序靠前的
-
排除依赖
A间接依赖C,但是A可以选择不使用C
-
可选依赖
指可选依赖对外隐藏自已依赖的资源,比如B对A屏蔽C的资源
聚合(用于快速构建项目)
作用:用于快速构建maven项目,一次性构建多个项目/模块。
操作:先定义一个空模块(打包方式为pom)用于管理其他项目,然后关联其他模块名称。
注意:参与聚合操作的模块最终指向顺序与模块间的依赖关系有关,与配置顺序无关。
继承(用于快速配置)
作用:通过继承可以实现子工程沿用父工程的配置。实现版本统一管理。
操作:在父工程中定义依赖管理(父工程打包方式为pom),在子工程中声明父工程的坐标及pom文件位置。(只需要在子工程中添加使用的依赖即可,不需要添加版本号了)
属性
- 自定义属性
-
定义格式
-
调用方式
-
私服
setting文件配置:
<mirrors>
<!-- 配置具体仓库的下载镜像 -->
<mirror>
<!-- 镜像的维一标识,自定义 -->
<id>nexus-mycompany</id>
<!-- 表示对哪一个仓库进行镜像 -->
<mirrorOf>central</mirrorOf>
<!-- 私服仓库组的URL -->
<url>https://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
<!-- 配置本地仓库上传到哪一个仓库 -->
<servers>
<server>
<!-- id:保持和宿主仓库名称一致 -->
<id>abc-releases</id>
<!-- 私服的账号密码 -->
<username>***</username>
<password>***</password>
</server>
<server>
<id>abc-snapshots</id>
<username>***</username>
<password>***</password>
</server>
</servers>