Maven概念

Maven 翻译为”专家”、”内行”,是 Apache 下的一个纯 Java 开发的开源项目。
基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。
Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。

领域

  • 简化构建过程
  • 提供统一的构建系统
  • 提供优质的项目信息
  • 鼓励更好的开发实践

仓库

Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。
运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。

POM.xml

POM 中可以指定以下配置:

  • 项目依赖
  • 插件
  • 执行目标
  • 项目构建 profile
  • 项目版本
  • 项目开发者列表
  • 相关邮件列表信息

modelVersion
指定了当前Maven模型的版本号,对于Maven2和Maven3来说,它只能是4.0.0

groupId
类似package,公司名倒过来

artifactId
groupId下一个功能的命名,或者说是项目名

version
版本号,SNAPSHOT意为快照,说明该项目还在开发中,是不稳定的版本。
结构为:主版本号.次版本号.增量版本号-<里程碑版本>

groupId、artifactId、version三个元素生成了一个Maven项目的坐标.

packaging
项目产生的构件类型,例如jar、war、ear、pom。

description
描述,通常用于版权说明

properties
定义一些变量,可以在dependency中引用

dependencyManagement
一般只出现在父pom里面,继承自该项目的所有子项目的默认依赖信息。这部分的依赖信息不会被立即解析,而是当子项目声明一个依赖(必须描述group ID和 artifact ID信息),
如果group ID和artifact ID以外的一些信息没有描述,则通过group ID和artifact ID 匹配到这里的依赖,并使用这里的依赖信息。

dependency
Type
默认jar

Scope
定义在哪个阶段使用,以及会不会打到包(jar包,war包等)里面去

compile 编译(默认)
表示被依赖项目需要参与当前项目的编译,还有后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去

test 测试
依赖项目仅仅参与测试相关的工作,包括测试代码的编译和执行,不会被打包,例如:junit

provided
打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude操作

runtime
表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过了编译而已。例如JDBC驱动,适用运行和测试阶段

system
从参与度来说,和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径

依赖传递

A–>B–>C。当前项目为A,A依赖于B,B依赖于C。当C是test或者provided时,C直接被丢弃,A不依赖C; 否则A依赖C

依赖仲裁

最短路径原则 A->B->C->common1.1.jar A->common1.0.jar那么A最终会依赖common1.0.jar

加载先后原则
A->B
A->C
B->common1.0.jar
C->common1.1.jar
A同时依赖B和C,那么B和C谁先加载,就依赖谁的common.jar

依赖排除
任何可传递的依赖都可以通过 “exclusion” 元素被排除在外。举例说明,A 依赖 B, B 依赖 C,因此 A 可以标记 C 为 “被排除的”

生命周期

maven生命周期

Maven定义了三套生命周期:clean、default、site,每个生命周期都包含了一些阶段(phase)。
三套生命周期相互独立,但各个生命周期中的phase却是有顺序的,且后面的phase依赖于前面的phase。执行某个phase时,其前面的phase会依顺序执行,但不会触发另外两套生命周期中的任何phase。

clean生命周期

  • pre-clean :执行清理前的工作;
  • clean :清理上一次构建生成的所有文件(target);
  • post-clean :执行清理后的工作

default(build)生命周期

Maven 的主要生命周期,被用于构建应用,有23 个阶段。default生命周期是最核心的,它包含了构建项目时真正需要执行的所有步骤。

  • process-resources :复制和处理资源文件到target目录,准备打包;
  • compile :编译项目的源代码;
  • test-compile :编译测试源代码;
  • test :运行测试代码;
  • package :打包成jar或者war或者其他格式的分发包;
  • install :将打好的包安装到本地仓库,供其他项目使用;
  • deploy :将打好的包安装到远程仓库,供其他项目使用;

site生命周期

Maven Site 插件一般用来创建新的报告文档、部署站点等

  • pre-site:执行一些需要在生成站点文档之前完成的工作
  • site:生成项目的站点文档
  • post-site: 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  • site-deploy:将生成的站点文档部署到特定的服务器上

单元测试

单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。
对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。
总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。

JUnit 是一个 Java 编程语言的单元测试框架。JUnit 在测试驱动的开发方面有很重要的发展,是起源于 JUnit 的一个统称为 xUnit 的单元测试框架之一

SpringCore