maven仓库的使用
一、Maven简介:
Maven是一个项目管理构建的工具,它涵盖项目的构建、依赖、测试、打包、部署、发布等等一系列的功能。并且Maven也成为了一个项目结构的标准。
因此现有的绝大部分IDE都将支持Maven项目。
二、安装:
1. 到Apache官网下载最新版本
2. 解压缩,并配置Maven的环境变量
3. 在Maven的核心配置文件settings.xml中配置本地仓库
<localRepository>D:/m2</localRepository>
三、仓库:
Maven仓库用于存放项目的jar文件以及Maven的插件,在开发的过程中所需要用的jar包,都可以从仓库中查找并依赖到当前项目中。
仓库分本地仓库和远程仓库
本地仓库顾名思义就是存在本机中的,maven在查找依赖的jar的时候先会从本地仓库查找,如果本地仓库没有则会访问远程仓库查找并下载到本地仓库中(Apache有一个庞大的远程仓库开发给所有开发人员使用。当然也有很多第三方的远程仓库)。当下一次再依赖相同的jar的时候,就可以从本地仓库找到,无需再访问远程仓库下载,节省网络带宽。
四、坐标(GAV):
Maven在仓库中要找到具体的jar文件是通过坐标来查找的。
G代表的是组织,表示当前依赖的jar是隶属于哪个组织
A代表项目名,也就是jar的名称
V代表版本号,因为一个项目的jar是有多个版本,具体要依赖哪个版本
根据GAV坐标就能确定找到具体jar并依赖到当前项目中
在pom.xml文件中可以看到如下的配置:
<groupId>edu.hibenratedemo</groupId>
<artifactId>ch07</artifactId>
<version>1.0-SNAPSHOT</version>
五、pom.xml文件
pom的全称叫Project Object Module(项目对象模型)。每一个maven项目都有一个pom.xml文件,它是maven项目的核心配置。这个配置文件主要用于项目的坐标、依赖管理、项目属性、插件以及远程仓库的配置。
1.pom文件的依赖配置:
dependencies是依赖jar文件配置的根节点,根节点中可以配置多个dependencie依赖
每个dependencie依赖中指定的都是依赖的坐标,也就是我们所说的GAV。
例如:
<dependencies>
<!-- 添加hibernate依赖 -->
<dependency>
<!-- 组织名称 -->
<groupId>org.hibernate</groupId>
<!-- 项目名称-->
<artifactId>hibernate-core</artifactId>
<!-- 版本号-->
<version>5.2.11.Final</version>
</dependency>
<!-- 添加c3p0连接池依赖 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>5.2.11.Final</version>
</dependency>
</dependencies>
2.关于<dependency>节点中的<scope>作用:
compile:
默认就是compile,什么都不配置也就是意味着compile。compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。
test
scope为test表示依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。比较典型的如junit。
runntime
runntime表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过编译而已,说实话在终端的项目(非开源,企业内部系统)中,和compile区别不是很大。比较常见的如JSR×××的实现,对应的API jar是compile的,具体实现是runtime的,compile只需要知道接口就足够了。oracle jdbc驱动架包就是一个很好的例子,一般scope为runntime。另外runntime的依赖通常和optional搭配使用,optional为true。我可以用A实现,也可以用B实现。
provided
provided意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是在打包阶段做了exclude的动作。
4.传递依赖
A->B->C->D
A如果依赖了B,而B又依赖了C和D,那么A就简介依赖了C和D,这就是传递依赖性。
依赖原则:
有时候通过maven的传递依赖也会导致重复依赖的现象。一旦发生这种情况,maven会根据
以下的原则顺序进行依赖
1. maven会优先依据最短路径原则来选择
2. 根据pom的配置的依赖顺序来选择
还可以通过排除的方式排除相同的依赖,在<exclusions>标签中配置即可
例如:
<dependency>
<groupId>org.evergreen</groupId>
<artifactId>evergreen-mvc</artifactId>
<version>1.2.1.RELEASE</version>
<!-- 排除依赖 -->
<exclusions>
<exclusion>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
</dependency>
5.pom文件的属性配置:
properties节点用于配置maven项目的一些属性,比如项目的编码以及依赖jar的版本号统一设置。例如:
<properties>
<!-- 设置整个maven项目的编码格式 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 配置控制台输出的编码格式,解决maven在控制台输出乱码 -->
<argLine>-Dfile.encoding=UTF-8</argLine>
<!-- 统一设置依赖jar的版本号,标签名可以自定义
通常都以"项目名.version""的方式命名-->
<hibernate.version>5.2.11.Final</hibernate.version>
<junit.version>4.12</junit.version>
<mysql.version>5.1.38</mysql.version>
</properties>
3.pom文件的插件配置:
maven本身的所有功能都是以插件的方式提供的。比如maven的依赖、编译、测试、打包、部署这些功能,都是有不同的插件模块完成,这些插件就构成了maven强大的功能。
我们也可以在pom文件中对这些插件进行相关的细节配置,例如配置编译插件的版本号,部署插件的部署设置等等。
例如:配置编译插件
<build>
<plugins>
<!-- 编译插件,指定JDK的编译版本为1.8 -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<target>1.8</target>
<source>1.8</source>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
六、Maven生命周期与插件:
Maven之所以强大,是因为它有一个十分完善的生命周期模型(lifecycle)。它拥有三套相互独立的生命周期,而每套生命周期都由一组阶段(Phase)组成。我们可以执行某个生命周期的某个阶段,也可以组合执行不同生命周期的不同阶段。(注意:执行了某个阶段,那么这个阶段之前的所有阶段都会执行),每个阶段的处理都由相应的插件来完成。
1. Clean 周期
说明:在进行真正的构建之前进行一些清理工作。
阶段:
pre-clean 执行一些需要在clean之前完成的工作
clean 移除所有上一次构建生成的文件
post-clean 执行一些需要在clean之后立刻完成的工作
2. Default 周期
说明:构建的核心部分,编译,测试,打包,部署等等。
阶段:
validate 验证项目是否正确且所有必要的信息都可用。
initialize 初始化构建工作,如:设置参数,创建目录等。
generate-sources 为包含在编译范围内的代码生成源代码。
process-sources 处理源代码。
generate-resources 生成资源文件。
process-resources 复制并处理资源文件,至目标目录,准备打包。
compile 编译项目的源代码。
process-classes 为编译生成的class文件做后期工作, 例如做Java类的字节码增强。
generate-test-sources 为编译内容生成测试源代码。
process-test-sources 处理测试源代码。
generate-test-resources 生成测试所需的资源文件。
process-test-resources 复制并处理资源文件,至目标测试目录。
test-compile 编译测试源代码。
process-test-classes 为编译生成测试的class文件做后期处理工作。
test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package 执行打包前的预处理工作。
package 接受编译好的代码,打包成可发布的格式,如 JAR 、war。
pre-integration-test 预集成测试。
integration-test 按需求将发布包部署到运行测试环境。
post-integration-test 执行整合测试。
verify 执行后期校验。
install 将包安装至本地仓库,以让其它项目依赖。
deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。
3. Site 周期
说明:生成项目报告,站点,发布站点。
阶段:
pre-site 执行一些需要在生成站点文档之前完成的工作。
site 生成项目的站点文档。
post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备。
site-deploy 将生成的站点文档部署到特定的服务器上。
七、继承与聚合
Maven也是类似面向对象的一种基础概念,它主要体现在父项目和子项目之间的继承和聚合关系。
1.继承主要解决子类重复的依赖、以及相关重复配置信息,可以把所有共同的配置都放在父项目中。
2.聚合主要是通过在父项目中的包含所有的子模块,这样方便我们对所有子项目的统一构建