同事DWH做了一次Maven分享,算是给我这个Java半吊子从头到尾做了一次科普。刚好人家已经写好了CF文档,在得到授权后便转载过来。
1.简介
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理;
2.概念
比较重要的两个概念:仓库 & 坐标
仓库是maven中一个很重要的概念,maven仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库;
- 本地仓库:首次运行maven命令(mvn -version),会在用户目录下创建一个.m2的目录(C:\Users\当前用户名.m2),这个目录是maven的“本地仓库”;
- 远程仓库,在远程仓库中又分成了3种:
- 中央仓库:Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库; 这个仓库由 Maven 社区管理;不需要配置;需要通过网络才能访问;
- 私服:私服也属于远程仓库的一种,只是这个远程仓库的地址是本地服务器而已;配置在局域网环境中,为局域网中所有开发人员提供jar包的统一管理。
- 其它公共库
坐标是Maven中用以精准标识Java组件的规则。Maven的坐标元素包括groupId、artifactId、version、packaging、classfier。只要我们提供正确的坐标元素,Maven就能找到对应的构件。
2.1 本地仓库
构建Maven项目的时候,首先会从本地仓库查找资源,如果没有,那么Maven会从远程仓库下载到你本地仓库。这样在你下次使用的时候就不需要从远程下载了。如果你所需要的jar包版本在本地仓库没有,并且远程仓库也不存在于,Maven在构建的时候会报错。这种情况可能发生在有些jar包的新版本没有在Maven仓库中及时更新。
Maven缺省的本地仓库地址为${user.home}/.m2/repository 。也就是说,一个用户会对应的拥有一个本地仓库。当然你可以通过修改${user.home}/.m2/settings.xml 配置这个地址:
1
2
3
4
<settings>
<localRepository> D:\repository\maven</localRepository>
</settings>
如果你想让所有的用户使用统一的配置那么你可以修改Maven主目录下的setting.xml:${M2_HOME}/conf/setting.xml
2.2 远程仓库 - 除本地仓库以外的仓库都叫做远程仓库
远程仓库配置在:
1
2
3
4
5
6
7
8
<profiles>
<profile>
<id></id>
<repositories>
<repository>远程仓库配置</repository>
</repositories>
</profile>
</profiles>
Maven提供的profile是一组可选的配置,可以用来设置或者覆盖配置默认值。 profile可以为不同的环境定制构建;
咱们的setting文件配置中,使用了一个id为artifactory的profile,这个profile包含了相关的仓库配置,同时配置中又使用了activeProfiles元素将artifactory这个profile激活,这样当执行Maven构建的时候,激活的profile会将仓库配置应用到项目中去。
2.3 中央仓库
中央仓库也属于远程仓库的一种,特征就是
Maven的安装目录中,在lib目录下,maven-model-builder-3.1.0.jar中,有一个默认的pom.xml文件,其中就配置了Maven默认连接的中心仓库。
Maven的中央仓库地址默认是:https://repo.maven.apache.org/maven2/,可以通过修改settings.xml文件来修改默认的中央仓库地址;
要注意的是如果修改的是中央仓库地址,那么repository下面的id标签值一定得是central,此外,还需要激活这个profile才能生效,这里的标签值就是profile标签下面的id标签值。
2.4 私服
私服也属于远程仓库的一种,只是这个远程仓库的地址是本地服务器而已。配置在局域网环境中,为局域网中所有开发人员提供jar包的统一管理。
本地仓库(本机)—>私服(局域网)—>中央仓库(外部网络)
3.Maven 使用约定优于配置的原则
Maven项目的标准目录结构:
- src
- main
- java 源文件
- resources 资源文件
- filters 资源过滤文件
- config 配置文件
- scripts 脚本文件
- webapp web应用文件
- test
- java 测试源文件
- resources 测试资源文件
- filters 测试资源过滤文件
- it 集成测试
- assembly assembly descriptors
- site Site
- main
- target
- generated-sources
- classes
- generated-test-sources
- test-classes
- xxx.jar
- pom.xml
- LICENSE.txt
- NOTICE.txt
- README.txt
4.Maven 构建生命周期
Maven 构建生命周期定义了一个项目构建跟发布的过程。
| 阶段 | 处理 | 描述 |
|---|---|---|
| 验证 validate | 验证项目 | 验证项目是否正确且所有必须信息是可用的。 |
| 编译 compile | 执行编译 | 源代码编译在此阶段完成。 |
| 测试 Test | 测试 | 使用适当的单元测试框架(例如JUnit)运行测试。 |
| 包装 package | 打包 | 创建JAR/WAR包如在 pom.xml 中定义提及的包。 |
| 检查 verify | 检查 | 对集成测试的结果进行检查,以保证质量达标。 |
| 安装 install | 安装 | 安装打包的项目到本地仓库,以供其他项目使用。 |
| 部署 deploy | 部署 | 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程。 |
5.Maven POM
POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。 执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。 所有 POM 文件都需要 project 元素和三个必需字段:groupId,artifactId,version。
| 节点 | 描述 |
|---|---|
| project | 工程的根标签。 |
| modelVersion | 模型版本需要设置为 4.0.0。 |
| groupId | 这是工程组的标识。它在一个组织或者项目中通常是唯一的。 |
| artifactId | 这是工程的标识。它通常是工程的名称。 |
| version | 这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。 |
5.1 父POM
父(Super)POM是 Maven 默认的 POM。所有的 POM 都继承自一个父 POM(无论是否显式定义了这个父 POM)。父 POM 包含了一些可以被继承的默认设置。因此,当 Maven 发现需要下载 POM 中的 依赖时,它会到 Super POM 中配置的默认仓库去下载。
Maven 使用 effective pom(Super pom 加上工程自己的配置)来执行相关的目标,帮助开发者在 pom.xml 中做尽可能少的配置,当然这些配置可以被重写。
父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom。
<relativePath> </relativePath>
5.2 POM标签
dependencyManagement - dependencies
dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本
6.Maven 依赖管理
Maven 一个核心的特性就是依赖管理。当我们处理多模块的项目,模块间的依赖关系就变得非常复杂,管理也变得很困难。针对此种情形,Maven 提供了一种高度控制的方法。
可传递性依赖发现: 一种相当常见的情况,比如说 A 依赖于 B。如果,另外一个项目 C 想要使用 A 并且 C 项目也需要使用 B。我们直接引用A的依赖,B也可以被应用。 Maven 可以避免去搜索所有所需库的需求。Maven 通过读取项目文件(pom.xml),找出它们项目之间的依赖关系。 我们需要做的只是在每个项目的 pom 中定义好直接的依赖关系。其他的事情 Maven 会帮我们搞定。
7. 利用Profile构建不同环境的部署包
构建配置文件是一系列的配置项的值,可以用来设置或者覆盖 Maven 构建默认值。
使用构建配置文件,你可以为不同的环境,比如说生产环境(Production)和开发(Development)环境,定制构建方式。
配置文件在 pom.xml 文件中使用 activeProfiles 或者 profiles 元素指定,并且可以通过各种方式触发。配置文件在构建时修改 POM,并且用来给参数设定不同的目标环境(比如说,开发(Development)、测试(Testing)和生产环境(Production)中数据库服务器的地址)。
构建配置文件的类型
| 类型 | 在哪定义 |
|---|---|
| 项目级(Per Project) | 定义在项目的POM文件pom.xml中 |
| 用户级 (Per User) | 定义在Maven的设置xml文件中 (%USER_HOME%/.m2/settings.xml) |
| 全局(Global) | 定义在 Maven 全局的设置 xml 文件中 (%M2_HOME%/conf/settings.xml) |
更新日志
- 2020年8月8日:初稿。