Maven
1、Maven简介【百度百科】
Maven是Apache一款开源项目管理工具。
重点:
项目对象模型(Project Object Model, POM)
通过一小段描述信息管理项目的构建,报告和文档的项目管理工具。
Maven项目相当于一个对象,对象与对象之间存在关系【依赖、继承、聚合】。通过关系实现项目更加方便导jar包、拆分项目的效果。
2、下载
Maven官方
Maven下载binary压缩包到本地之后,直接在一个目录下解压就可以使用。【可以配置M2_HOME环境变量、Path环境变量】
3、Maven目录结构
bin目录:
conf目录:
4、仓库
基于简单文件系统存储,集中化管理Java API资源(构件)的服务。
仓库中每一个构件拥有唯一坐标标识,据此可以定位仓库中的唯一存储路径。
- groupId
- artifactId
- version
Maven通常会在某一个位置(仓库)统一存储所有Maven项目共享的构件。当项目构建完毕后生成的构件也可以安装或部署到仓库中,供其他项目使用。
Maven项目分为两类:远程仓库、本地仓库。
4.1、远程仓库
远程仓库分为:中央仓库、本地私服仓库。
远程仓库指通过各种协议访问的仓库。这些仓库可能是第三方搭建的真实的远程仓库,用来提供他们的构件下载(例如repo.maven.apache.org和uk.maven.org是Maven的中央仓库)。
默认的远程仓库使用的Apache提供的中央仓库:Apache中央仓库
其它“远程”仓库可能是公司内部拥有的建立在文件或HTTP服务器上的内部仓库,用来在开发团队间共享私有构件和管理发布的。
4.2、本地仓库
本地仓库就是本机的一份拷贝,缓存远程下载。其中可以包含自己本地尚未发布的临时构件。
5、Maven项目
5.1、工程类型
- POM工程
逻辑工程。通常用于父级工程/聚合工程中,作为jar包的版本控制。 - JAR工程
将项目打包成jar包形式,是一种常见的本地工程【只要本地有Java运行时环境,即可运行】。 - WAR工程
将项目打包成war包形式,发布在服务器上的工程【需要有web容器才能运行】。
5.2、Eclipse中创建Maven项目
(1)Eclipse配置本地Maven
(2)创建Maven项目
(3)目录结构
6、Maven配置
配置setting.xml
文件:
- JDK
- 仓库:本地仓库、镜像仓库
6.1、JDK配置
有多个JDK时,就需要指定编译和运行的JDK。
6.2、仓库
6.2.1 本地仓库
默认:`${user.home}/.m2/repository
6.2.2 镜像仓库
6.2.3 仓库优先级
7、项目关系
7.1、依赖
A项目需要B项目提供支持。
(1)实现方式:
在A项目的pom.xml文件中导入B项目jar包【自己项目打包成的jar包、中央仓库jar包】。
<dependecies>
<dependency>
B项目坐标(GAV)
</dependency>
</dependencies>
(2)传递依赖:项目A依赖项目B,项目B依赖项目C。只需要在项目A中加入项目B即可,Maven会隐式地把依赖库所依赖的库加入项目中。【解析从远程仓库中获取的依赖库的项目文件来实现的】
(3)原则:
① 第一原则:最短路径优先原则
项目依赖关系树中路径最短的版本会被使用。
② 第二原则:最先声明原则
当依赖路径长度一致时,第一原则不能解决问题。
在依赖路径长度相等的前提下,pom.xml文件中依赖声明的顺序决定谁会被解析使用。
(4)排除依赖:
使用exclusions
标签排除传递性依赖。
<dependencies>
<dependency>
GAV
<exclusions>
<exclusion>
GA【不用写version】
</exclusion>
</exclusions>
</dependency>
</dependencies>
(5)依赖范围:决定依赖的坐标在什么情况下有效,什么情况下无效。
- compiler(默认):编译、运行时
- provided:编译、测试。如:servlet-api
- runtime:只在运行时。如:JDBC驱动实现
- system:范围与
provided
类似,但必须显式指定本地系统路径的jar。Maven不会去仓库中寻找 - test:编译测试代码、运行测试。如:Junit
- import:只适用于pom文件中的
<dependencyManagement>
。表明指定的pom**必须使用<dependencyManagement>
**部分的依赖
父工程【打成jar包】:
子工程:
7.2、继承
A工程继承B工程:A工程默认依赖B工程的所有资源,且可以应用B工程中定义的所有资源信息。【B工程只能是POM工程】
放在<dependencyManagement>
中的内容主要目的是进行版本管理。里面的内容在子项目中依赖时坐标只需要填写<groupId>
和<artifactId>
即可。(注意:如果子项目不希望使用父项目的版本,可以明确配置version)。
7.3、聚合
当工程有两个以上模块时,每个模块作为一个独立的功能集合起来。
总工程必须是POM工程。【前提是继承,聚合中包含了继承的特性】
多个项目被一个大的父项目包含【父项目:POM类型;pom.xml中出现<modules>
标签显示包含的子模块】
8、插件
8.1、编译器
settings.xml
文件中配置全局编译器插件:<profiles>
节点下进行配置pom.xml
文件:<build>
节点下的<plugins>
中进行配置
8.2、资源拷贝
Maven在打包时,会在src/main/resources目录下的配置文件拷贝到项目中对应路径进行打包处理,而非该目录下不会打包到项目中。
将非src/main/resources目录下的配置文件打包:
8.3、tomcat
不适用外部Tomcat:可运行插件
启动命令:tomcat7:run
9、常见命令
install
本地安装【编译javac、打包jar、安装到本地仓库】
完成项目编译、单元测试、打包功能,没有把打包好的可执行 jar包/war包 部署到本地maven仓库,但没有部署到远程maven私服仓库
clean
清除已编译信息【删除target目录】
compiler
只编译
package
打包【编译、打包】
完成项目编译、单元测试、打包功能,没有把打包好的可执行 jar包/war包 部署到本地maven仓库和远程maven私服仓库