Maven


1、介绍

对于开发者来说,Maven 的主要作用主要有 3 个:

  • 项目构建:提供标准的、跨平台的自动化项目构建方式。
  • 依赖管理:方便快捷的管理项目依赖的资源(jar 包),避免资源间的版本冲突问题。
  • 统一开发结构:提供标准的、统一的项目结构。

2、Maven 的依赖范围

  • compile:编译依赖范围(默认),使用此依赖范围对于编译、测试、运行三种都有效,即在编译、测试和运行的时候都要使用该依赖 Jar 包。
  • test:测试依赖范围,从字面意思就可以知道此依赖范围只能用于测试,而在编译和运行项目时无法使用此类依赖,典型的是 JUnit,它只用于编译测试代码和运行测试代码的时候才需要。
  • provided:此依赖范围,对于编译和测试有效,而对运行时无效。比如 servlet-api.jar 在 Tomcat 中已经提供了,我们只需要的是编译期提供而已。
  • runtime:运行时依赖范围,对于测试和运行有效,但是在编译主代码时无效,典型的就是 JDBC 驱动实现。
  • system:系统依赖范围,使用 system 范围的依赖时必须通过 systemPath 元素显示地指定依赖文件的路径,不依赖 Maven 仓库解析,所以可能会造成建构的不可移植。

3、Maven 依赖调解

Maven 在遇到这种问题的时候,会遵循 路径最短优先声明顺序优先 两大原则。

4、Maven生命周期

Maven 定义了 3 个生命周期META-INF/plexus/components.xml

  • default 生命周期

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    <phases>
    <!-- 验证项目是否正确,并且所有必要的信息可用于完成构建过程 -->
    <phase>validate</phase>
    <!-- 建立初始化状态,例如设置属性 -->
    <phase>initialize</phase>
    <!-- 生成要包含在编译阶段的源代码 -->
    <phase>generate-sources</phase>
    <!-- 处理源代码 -->
    <phase>process-sources</phase>
    <!-- 生成要包含在包中的资源 -->
    <phase>generate-resources</phase>
    <!-- 将资源复制并处理到目标目录中,为打包阶段做好准备。 -->
    <phase>process-resources</phase>
    <!-- 编译项目的源代码 -->
    <phase>compile</phase>
    <!-- 对编译生成的文件进行后处理,例如对 Java 类进行字节码增强/优化 -->
    <phase>process-classes</phase>
    <!-- 生成要包含在编译阶段的任何测试源代码 -->
    <phase>generate-test-sources</phase>
    <!-- 处理测试源代码 -->
    <phase>process-test-sources</phase>
    <!-- 生成要包含在编译阶段的测试源代码 -->
    <phase>generate-test-resources</phase>
    <!-- 处理从测试代码文件编译生成的文件 -->
    <phase>process-test-resources</phase>
    <!-- 编译测试源代码 -->
    <phase>test-compile</phase>
    <!-- 处理从测试代码文件编译生成的文件 -->
    <phase>process-test-classes</phase>
    <!-- 使用合适的单元测试框架(Junit 就是其中之一)运行测试 -->
    <phase>test</phase>
    <!-- 在实际打包之前,执行任何的必要的操作为打包做准备 -->
    <phase>prepare-package</phase>
    <!-- 获取已编译的代码并将其打包成可分发的格式,例如 JAR、WAR 或 EAR 文件 -->
    <phase>package</phase>
    <!-- 在执行集成测试之前执行所需的操作。 例如,设置所需的环境 -->
    <phase>pre-integration-test</phase>
    <!-- 处理并在必要时部署软件包到集成测试可以运行的环境 -->
    <phase>integration-test</phase>
    <!-- 执行集成测试后执行所需的操作。 例如,清理环境 -->
    <phase>post-integration-test</phase>
    <!-- 运行任何检查以验证打的包是否有效并符合质量标准。 -->
    <phase>verify</phase>
    <!-- 将包安装到本地仓库中,可以作为本地其他项目的依赖 -->
    <phase>install</phase>
    <!-- 将最终的项目包复制到远程仓库中与其他开发者和项目共享 -->
    <phase>deploy</phase>
    </phases>
  • clean生命周期

  • site生命周期

todo:

(1)provided依赖的包是否会打入最后的jar包?理论上不会,但是使用spring-boot-maven-plugin为了保证jar包能独立运行,最终仍会打包进去,有待验证。

(2)Gradle学习?

作者

lei.ch1941

发布于

2023-09-25

更新于

2024-04-10

许可协议

评论