maven的学习之核心概念(二)

来源:互联网 发布:手机淘宝详情优惠券 编辑:程序博客网 时间:2024/05/21 11:03

坐标的概念

在平面几何中坐标(x,y)可以标识平面中唯一的一点,在maven中坐标就是为了定位一个唯一确定的jar包。

maven世界有大量构建,我们需要找一个用来唯一标识一个构建的统一规范

拥有了统一规范就可以吧查找任务交给机器

maven坐标的主要组成:

groupID:定义当前maven组织的名字

artifactID:定义实际项目名称

version:定义当前项目的当前版本

依赖管理:

就是对项目中jar包的管理,可以在pom文件中定义jar包的gav坐标,管理依赖,依赖的生命中主要包含如下元素:

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope></dependency></dependencies>

依赖范围:


其中依赖scope用来控制依赖和编译,测试,运行的classpath的关系,主要是三种依赖如下:

1>compile:默认编译依赖范围,对于编译,测试,运行三种classpath都有效

2>test:测试依赖范围,只对于测试classpath有效

3>provided:已经提供了依赖范围。对于编译,测试,运行的classpath都有效,但对于运行无效。因为有容器进行提供,例如:servlet-api

4>runtime:运行时提供,例如:jdbc驱动

依赖传递:

直接依赖和间接依赖:

如果B中使用A,C中使用B,则称B是C的直接依赖,而称A是C的间接依赖。

依赖范围对传递依赖的影响:

左边第一列表示第一直接依赖范围

上面第一行表示第二直接依赖范围

中间交叉单元格表示传递性依赖范围

总结:

1:当第二依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致

2:当第二直接依赖范围是test的时候,依赖不会得以传递

3:当第二直接依赖是范围是provided的时候,只会传递第一直接依赖范围是provided的依赖,且传递性的依赖的范围为provided

4:当第二直接依赖范围是runtime的时候,传递性依赖范围与第一直接依赖的范围一致,但是compile例外,此时传递的依赖范围为runtime

依赖冲突:

如果直接与间接依赖中包含有同一个坐标不同版本的资源依赖,以直接依赖的版本为主。

可选依赖:

<optional>true/false是否可选,也可以理解为是否向下传递。

在依赖中添加optional选项决定次依赖是否向下传递,如果是true则不传递,如果是false则传递,默认位false.

排除依赖:

排除包中所有包含的依赖关系,不需要添加版本号。

如果在本次依赖中有一些多余的jar包也被传递依赖过来,如果想把这些jar包排除的话,可以配置exclutions进行排除。

生命周期:

maven的生命周期就是为了对所有的构建过程进行抽象和统一 ,包括项目清理、初始化、编译、打包、测试、部署等几乎所有的构建步骤

生命周期可以理解为构建工程的步骤。

在maven中有三套相互独立的生命周期,请注意,这三套,而且项目独立,这三套的生命周期分别是:

clean Lifecycle:在进行真正的构建之前进行一些清理工作

Default Lifecycle:构建的核心步骤,编译,测试,打包等等

site lifecycle:生成项目报告,站点,发布站点。

clean:清理项目

每套生命周期都由一组阶段(phase)组成,我们平时在命令行输入的命令总会对应一个特定的阶段,比如:运行maven clean ,这个clean是clean生命周期的一个阶段,有clean生命周期,也有clean阶段,clean生命周期一共包含三个阶段

pre-clean 执行一些需要在clean之前完成的动作。

clean 移出所有上一次构建生成的文件

post-clean 执行一些需要在clean之后立刻完成的工作

mvn clean中的clean就是上边的clean,在一个生命周期中,运行某个阶段的时候,他之前所有的阶段都会被运行,也就是说,mvn clean等同于mvn pre-clean clean,如果我们运行mvn post-clean,那么pre-clean,clean都会被运行,这是maven很重要的一个规则,可以大大简化命令的输入

default:构建项目

Default生命周期是maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中,这里,只解释一些比较重要和常用的阶段:

validate

generate-sources

process-sources

generate-resources

process-resources复制并处理资源文件,至目标目录,准备打包。

compile 编译项目的源代码。

process-classes

generate-test-sources

process-test-sources

generate-test-resources

process-test-resources复制并处理资源文件,至目标测试目录。

test-compile 编译测试源代码。

process-test-classes

test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。

prepare-package

package 接受编译好的代码,打包成可发布的格式,如 JAR 。

pre-integration-test

integration-test

post-integration-test

verify

install 将包安装至本地仓库,以让其它项目依赖。

deploy将最终的包复制到远程的仓库,以让其它开发人员与项目共享

运行任何一个阶段的时候,它前边的所有阶段都会被运行,这也就是为什么我们运行mvn install的时候,代码会被编译,测试,打包。此外,maven的插件机制是完全依赖maven的生命周期的,因此理解生命周期至关重要。

site:生成项目站点

site生命周期:

pre-site:执行一些需要在生成站点文档之前完成的工作

site:生成项目的站点文档

post-site:执行一些需要在生成站点文档之后完成的工作,并且为部署做准备。

这里经常用到的是site阶段和site-deploy阶段,用以生成和发布maven站点,这可是maven相当强大的功能,manager比较喜欢,文档及统计数据自动生成,很好看。

maven插件:

maven的核心仅仅是定义了抽象的生命周期,具体的任务都是交由插件完成的,每个插件都能实现一个功能,每个功能就是一个插件目标,maven的生命周期与插件目标相互锁定,以完成某个具体的构建任务。

例如compile就是插件maven-compiler-plugin的一个插件目标。

maven编译插件:

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.7</source><target>1.7</target><encoding>UTF-8</encoding></configuration></plugin>
修改配置文件后,在工程上右键选择maven-update project configration