查找依赖信息的网站:http://mvnrepository.com/
一、座标
# Maven中的座标,使用三个向量在仓库中唯一定位一个Maven工程
# 公司或组织域名倒序+项目名
<groupId>com.myonetest.maven</groupId>
# 模块名称
<artifactId>JavaProject01</artifactId>
# 版本,SNAPSHOT 快照的意思,代表会快速迭代;RELEASE 代表稳定版本
<version>0.0.1-SNAPSHOT</version>
# 依赖范围,compile 代表全程参与;test 只参与测试;provided 不参与打包
<scope>compile</scope>
# Maven工程和仓库路径的对应关系
<groupid>org.springframework</groupid>
<artifactid>spring-core</actifactid>
<version>4.0.0.RELEASE</version>
# org/springframework/spring-code/4.0.0.RELEASE/spring-code-4.0.0.RELEASE.jar
二、仓库
# Maven仓库分为本地仓库和远程仓库
# 本地仓库一般包含以下内容
# 1、Maven自身需要的插件
# 2、第三方框架或工具所需要的jar包
# 3、我们自己开发的Maven工程
# 远程仓库一般分为
# 1、中央仓库
# 2、中央仓库镜像
# 3、局域网仓库(可以使用 Nexus 搭建)
三、生命周期/插件
# 插件
# 生命周期的各个阶段只定义了需要执行的任务,各个阶段的任务和插件的目标是相对应的,相似的目标是由
#特定的插件来完成的
# Maven的核心程序定义了抽象的生命周期,生命周期的各个阶段任务都由插件来完成。
# 我们可以把插件目标定义为 Maven 命令。
# 生命周期
# Maven核心程序为了更好的实现自动化构建,不论现在要执行生命周期中的哪一个极端,都会从这个生命周期的最初位置开始执行。(也就是每次都会从头重新开始,比如执行 compile 命令后,再执行 test 命令,因为 test 命令在 compile 命令之后,Maven核心程序会从头开始再执行一遍直到 test)
# mvn clean 生命周期
Clean Lifecycle # 在进行真正的构建前进行清理工作
pre-clean #执行一些需要在clean之前完成的工作
clean #移除所有上一次构建生成的文件
post-clean #执行一些需要在clean之后立刻完成的工作
# mvn site 生命周期
Site Lifecycle #生成项目报告、站点,发布站点
pre-site #执行一些需要在生成站点文档之前完成的工作
site #生成项目的站点文档
post-site #执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy #将生成的站点文档部署到特定的服务器上
# 这里经出用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这是Maven强大的功能,
文档及统计数据自动生成,很好看。
# 默认的生命周期
Default Lifecycle:构建的核心部分,编译、测试、打包、安装,部署等
Default生命周期是Mave生命周期最重要的一个,绝大部分工作都发生在这个里面
validate
generate-source
process-sources
generate-resources
process-resource #复制并处理资源文件,至目标目录,准备打包
compile #编译项目的源代码
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-reources #复制并处理资源文件,至目标测试目录。
test-compile #编译测试源代码
prcess-test-classes
test #使用合适的单元测试框架运行测试,这些测试代码不会被打包或部署
prepare-package
package #接受编译好的代码,打包成可发布的格式,比如jar
pre-integration-test
integration-test
post-integration-test
verify
install #将包安装至本地仓库,以让其它项目依赖
deploy #将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。
# 三个之间相互独立,可以单独调用,也可以运行mvn clean install site 一起调用。
PS:Maven核心程序只定义了抽象的生命周期,但具体的工作由插件完成,而插件并不包含在Maven核心程序中。 当Maven程序执行命令需要用到一些插件时,Maven核心程序会先到本地仓库找,如果找不到则自动连接外网到中央仓库下载。如果下载失败则构建失败。
四、继承
# 假设场景
# 现在由三个项目A\B\C,都有依赖包junit,版本分别是4.0/4.9/4.2
# 因为并不是必须包,所以依赖范围是 test
<scope>test</scope>
# 但是 test 的依赖范围不能传递,所以A\B\C三个项目中的版本都不一样
# 需求
# 统一管理各个模块之间的junit依赖版本
# 解决思路
# 将所有的junit依赖版本统一提取到父工程中,子工程声明依赖时不指定版本;以父工程中统一设定。
# 操作步骤
# 1、创建一个新的Maven工程作为父工程,创建项目时 packaging 要选择 pom 方式。
# POM.xml 如下
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven- 4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.parent.maven</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
</project>
# 2、在子工程中对声明对父工程的引用
<!-- 子工程中声明父工程 -->
<parent>
<groupId>com.parent.maven</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
# 3、将子工程的座标中与父工程座标中重复的内容删除,会有黄线提示:grouid is duplicate of parent groupid
# 4、在父工程中统一声明JUNIT的依赖(还有一个重点是方便管理)
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
# 5、在子工程中删除junit依赖的版本号,如果要使用不一致的,也可以不删除。
# PS: 配置继承后,执行安装命令时要先安装父工程。
五、聚合
# 可以实现一键安装各个模块
# 配置方式: 在一个总的聚合工程中配置各个参与聚合的模块
# PS: 可以新建一个Maven工程作为聚合工程,也可以使用刚才实现继承时创建的父工程(一般使用这个)
<!-- 配置聚合 -->
<modules>
<!-- 指定各个子工程的相对路径 -->
<module>../ProjectA</module>
<module>../ProjectB</module>
<module>../ProjectC</module>
</modules>
# 配置完成直接pom.xml右击run 允许install即可
# 日志中的 reactor build order 会显示先后顺序
# 日志中的 Reactor Summary 会显示各个模块的耗时和成功状态
六、自动部署
平常好像用不上,就先不记录了,核心是使用 cargo 一家专门从事servlet容器启动的组织,org.codehaus.cargo