![3b01384d7e6e16cacd3841225b0d0b45.png](https://img-blog.csdnimg.cn/img_convert/3b01384d7e6e16cacd3841225b0d0b45.png)
maven是一种自动化构建的工具。何为自动化构建即编译,运行单元测试,生成文档,打包和部署等一系列的工作。简单来说maven有以下的作用
- 自动化执行编译,测试,打包,部署的工作
- 依赖管理工具,控制Java项目所依赖的各种构件(包括第三方以及项目内部)
- 项目信息管理工具,通过自动生成的站点,可以获得项目文档,测试报告等项目信息
mavenSSM模板
<?xml version="1.0" encoding="UTF-8"?>
maven目录
conf目录下包含了重要文件setting.xml,整台机器上的所有用户都会直接收到该配置的影响。推荐将该setting.xml复制到家目录/.m2/setting.xml,只当前用户产生影响,避免对其他用户的影响。
使用入门maven项目目录结构
pom
使用入门xml配置
pom.xml示例
<project
setting.xml配置
<settings
使用入门 常用maven命令
maven 命令的格式为 mvn [life-stage]:[goal-name],可以接受的参数如下,
- -D 指定参数,如 -Dmaven.test.skip=true 跳过单元测试;
- -P 指定 Profile 配置,可以用于区分环境;
mvn archetype:create创建Maven 项目
mvn compile 编译主程序源代码,不会编译test目录的源代码。第一次运行时,会下载相关的依赖包,可能会比较费时
mvn test-compile 编译测试代码,compile之后会生成target文件夹,主程序编译在classes下面,测试程序放在test-classes下
mvn test 运行应用程序中的单元测试
mvn site 生成项目相关信息的网站
mvn clean清除目标目录中的生成结果
mvn package 依据项目生成jar 文件,打包之前会进行编译,测试
mvn install 在本地Repository中安装 jar。
mvn eclipse:eclipse 生成Eclipse 项目文件及包引用定义
mvn deploy 在整合或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。
跳过测试类 : -Dmaven.test.skip=true
下载jar包源码: -DdownloadSource=true
下载javadocs: -DdownloadJavadocs=true
maven依赖
依赖范围
- 编译有效:编译的时候需要引入
- 测试有效:执行测试的时候需要引入
- 运行有效: 运行的时候需要引入(运行有效才是最后真正有效的)
![262a08ba3c3a10855b70892c16c56b4f.png](https://img-blog.csdnimg.cn/img_convert/262a08ba3c3a10855b70892c16c56b4f.png)
传递性依赖:即A依赖B,B依赖C==A依赖C
![23ae4eb9e2c4a066427f7c296a983aa8.png](https://img-blog.csdnimg.cn/img_convert/23ae4eb9e2c4a066427f7c296a983aa8.png)
依赖调解:依赖同一个构件的不同版本如何抉择
A->B->C(1.0) A->D->C(2.0)
第一原则:优先选路径最短的
第二原则:路径相同下,选B/D在pom文件中的优先声明者。
仓库
构件:任何一个依赖,插件或者项目构建的输出
仓库:maven在某个位置统一存储所有maven共享的构件,这个统一的位置叫做仓库
![224283647837c93b98e761f6e5754c7b.png](https://img-blog.csdnimg.cn/img_convert/224283647837c93b98e761f6e5754c7b.png)
远程仓库
中央仓库
默认提供的远程仓库,在一个超级pom文件中定义(所有pom都会继承这个超级pom)
私服
他是架设在局域网内的仓库服务,私服代理广域网上的远程仓库。建立私服的好处
- 节省自己的外网带宽。
- 加速maven构建(内网缓存)
- 部署第三方构件(私有构件共享)
- 提高稳定性,增强控制(内网缓存)
- 降低中央仓库的负荷(对外网请求次数少)
私服的搭建很重要,然而个人开发目前还没有什么感觉,日后再补充仓库的上传与下载
发布版和快照版的区别
1.maven会为快照版本打上一个时间戳(虽然命名的时候都叫2.0-SNAPSHOT)
2.对于快照版本,maven会自动按照更新策略(默认每天)找到同名下的时间戳最新构件。
当2.0-SNAPSHOT更改为2.0,表示该版本已经稳定,且只对应了唯一的构件,相比之下2.1-SNAPSHOT对应了大量带有不同时间戳的构件,其具有不稳定性。
快照版本只应该在组织内部的项目或模块间依赖使用,不应该依赖任何外部快照版本
仓库解析依赖过程
1.当依赖的范围是system时,maven会从本地文件系统解析构件
2.当依赖坐标计算仓库路径后,尝试直接从本地仓库寻找构件
3.本地仓库不存在相应构件,如果依赖的是显式的发布版本构件(2.0),则遍历所有的远程仓库,发现后下载并解析使用
4.如果依赖的版本是RELEASE或LATEST则基于更新策略读取远程仓库的元数据(metadata.xml放置版本信息)与本地的元数据合并后计算出RELEASE或LATEST真实的值,然后基于真实值重复步骤2-3
5.如果依赖的版本是SNAPSHOT则基于更新策略读取远程仓库的元数据与本地的元数据合并后计算出当前最新快照版本值,然后基于真实值重复步骤2-3
maven3已经不支持LATEST了,如果没配置<version>就默认是RELEASE
仓库搜索服务
Sonatype Nexus 比较好基于nexus的仓库管理
Jarvana 额外提供了java文档浏览
使用入门 maven生命周期
maven提供的命令,就是指执行maven对应的生命阶段
maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,在maven的设计中,实际的任务都交由插件来完成(抽象就是指类似抽象方法),所以maven的命令mvn [life-stage]:[goal-name],goalname就是指插件的目标
maven拥有三套相互独立的生命周期
clean 生命周期 || default 生命周期 || site生成站点生命周期
具体生命周期以常用命令为主
生命周期内的阶段(phrase)是有先后依赖的,执行命令会从第一个阶段顺序执行至命令阶段
插件目标:插件本身可以完成多个功能,每个功能就是一个插件目标
高级入门 聚合与继承
聚合:将项目的各个模块聚合在一起构建
意义:模块化开发
具体配置见上面的xml元素,注意配置package-->pom 以及modules元素即可
聚合构建的顺序
- 按照定义的module先后顺序
- 如果发现module有依赖于或继承的其他模块,优先构建其他模块
继承:抽出重复的配置使用类继承
意义:减少重复工作(实际上只能减少一点点,但是父子类的关系更好的管理)
具体配置见上面的xml元素,
dependencyManagement元素:不是每个子类都需要继承父类的所有元素,这样多个子类之间还会存在依赖的冗余或冲突,使用dependencyManagement不会给子类引入任何依赖,子类仍然需要配置dependency,只是如果发现子类与父类配置的一致,就会继承父类对应的配置。
scope-->import:只在dependencyManagement下生效,由于会包含大量的依赖。如果你想把这些依赖分类以更清晰的管理,就需要分文件配置,通过Import把文件下的配置引入当前pom
聚合和继承通常在一个pom下,约定优于配置,遵循maven原始默认的约定
高级入门 maven profile
profile定义一系列的配置信息,然后指定其激活条件,这样我们就可以定义多个profile,然后每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置信息的效果。
例如数据库配置文件,可以配置不同的账号密码
1.需要让配置文件识别maven属性语法
<!--超级pom,所有pom都会继承的这样一个文件-->
<resources>
<resource>
<directory>${project.basedir}/src/main/resources<deirectory>
<filter>true</filter>
</resource>
</resources>
2.配置profile
<!--项目pom.xml-->
<profiles>
<profile>
<id>dev</id>
<properties>
<db.username>dev</db.username>
<db.password>abc</db.password>
</properties>
</profile>
</profiles>
3.数据库配置文件
username=${db.name}
password=${db.password}
4.命令行激活
mvn clean install -P dev ,dev-x
激活的方式有
- 命令行激活
- 基于操作环境激活
- 基于文件存在激活
- 默认激活