T-记一次Maven分享

Posted by DWH on August 8, 2020

同事DWH做了一次Maven分享,算是给我这个Java半吊子从头到尾做了一次科普。刚好人家已经写好了CF文档,在得到授权后便转载过来。

1.简介

Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理;

2.概念

比较重要的两个概念:仓库 & 坐标

仓库是maven中一个很重要的概念,maven仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库;

  1. 本地仓库:首次运行maven命令(mvn -version),会在用户目录下创建一个.m2的目录(C:\Users\当前用户名.m2),这个目录是maven的“本地仓库”;
  2. 远程仓库,在远程仓库中又分成了3种:
    1. 中央仓库:Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库; 这个仓库由 Maven 社区管理;不需要配置;需要通过网络才能访问;
    2. 私服:私服也属于远程仓库的一种,只是这个远程仓库的地址是本地服务器而已;配置在局域网环境中,为局域网中所有开发人员提供jar包的统一管理。
    3. 其它公共库

坐标是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 中央仓库

中央仓库也属于远程仓库的一种,特征就是 central id名为 central。告诉Maven从外网的哪个地方下载jar包。

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
  • 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日:初稿。