开发好几年了,从来没看过/学过Maven,然而却每天都在用,今天抽半天时间补补课。
Maven概念
什么是Maven?
- Maven 翻译过来就是专家
- 官网 http://maven.apache.org/
- Maven使用POM (Project Object Model)项目对象模型,就是通过一段描述信息管理项目的构建,描述信息为一个xml类型的文件,该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。
- Maven的用途通常有:构建项目,文档生成,报告,依赖管理,SCMS,发布项目,分发项目,邮件管理
- 主要思想:约定大于配置
- 其实就是一个词:标准。规范了Java项目开发的一个标准,标准很重要,每个公司都有自己的标准,那就乱套了
约定项目目录结构
-- 项目目录
--src 项目中的所有资源
--main 存放开发代码和资源
--java 项目的java源代码
--resources 项目的资源文件,源代码之外的其他文件
--test 存放测试代码和资源
--java 项目的测试类和测试代码
--resources 项目的测试资源
--target 打包输出目录
--classes 编译输出目录
--test-classes 测试代码编译输出目录
--generated-sources 自动生成的资源输出目录
--generated-test-sources 测试资源输出目录
--pom.xml 文档对象模型的描述文件
详细解释如下:
- ${basedir} 存放pom.xml和所有的子目录
- ${basedir}/src/main/java 项目的java源代码
- ${basedir}/src/main/resources 项目的资源,比如说property文件,springmvc.xml
- ${basedir}/src/test/java 项目的测试类,比如说Junit代码
- ${basedir}/src/test/resources 测试用用的资源
- ${basedir}/src/main/webapp/WEB-INF web应用文件目录,web项目的信息,比如存放web.xml、本地图片、jsp视图页面
- ${basedir}/target 打包输出目录
- ${basedir}/target/classes 编译输出目录
- ${basedir}/target/test-classes 测试编译输出目录
- Test.java Maven只会自动运行符合该命名规则的测试类
- ~/.m2/repository Maven默认的本地仓库目录位置
开始使用Maven的优势
- 项目设置遵循统一的规则。
- 任意工程中共享。
- 依赖管理包括自动更新。
- 一个庞大且不断增长的库。
- 可扩展,能够轻松编写 Java 或脚本语言的插件。
- 只需很少或不需要额外配置即可即时访问新功能。
- 基于模型的构建 − Maven能够将任意数量的项目构建到预定义的输出类型中,如 JAR,WAR 或基于项目元数据的分发,而不需要在大多数情况下执行任何脚本。
- 项目信息的一致性站点 − 使用与构建过程相同的元数据,Maven 能够生成一个网站或PDF,包括您要添加的任何文档,并添加到关于项目开发状态的标准报告中。
- 发布管理和发布发布 − Maven 将不需要额外的配置,就可以与源代码管理系统(如 Subversion 或 Git)集成,并可以基于某个标签管理项目的发布。它也可以将其发布到分发位置供其他项目使用。Maven能够发布单独的输出,如 JAR,包含其他依赖和文档的归档,或者作为源代码发布。
- 向后兼容性 − 您可以很轻松的从旧版本 Maven 的多个模块移植到 Maven 3 中。
- 子项目使用父项目依赖时,正常情况子项目应该继承父项目依赖,无需使用版本号,
- 并行构建 − 编译的速度能普遍提高20 - 50 %。
- 更好的错误报告 − Maven 改进了错误报告,它为您提供了 Maven wiki 页面的链接,您可以点击链接查看错误的完整描述。
安装
很多集成开发环境默认集成了一个maven,比如IDEA,但是了解下安装过程还是有必要的。
- 安装JDK
- 配置JAVA_HOME
- 下载Maven解压可用 过程见:http://www.runoob.com/maven/maven-setup.html
POM详解
项目对象模型,Project Object Model ,就是一个xml文件,描述了项目的信息,如果构建、依赖什么的
所以看pom.xml主要就是看一下几个配置:
- jar包依赖
- 执行目标
- 构建profile
- 版本
- 项目开发者列表
- 相关邮件列表
所有的pom文件都必须有的元素:
- project 工程的根标签
- modelVersion 模型版本号
- goupId 工程组的唯一标识,通常为公司或组织域名
- artifactId 工程的唯一标识,通常是工程名称
- version 工程的版本号
- 所有的POM都默认继承自一个父POM(不管你是否显示定义),父POM有一些默认的配置帮助开发者简化开发配置,使用命令
mvn help:effective-pom
可以查看Super POM 默认配置
4.0.0
com.companyname.project-group
project
1.0
POM的详细配置
4.0.0
asia.banseon
banseon-maven2
jar
1.0-SNAPSHOT
banseon-maven
http://www.baidu.com/banseon
A maven project to study maven.
jira
http://jira.baidu.com/banseon
Demo
[email protected]
[email protected]
[email protected]
http:/hi.baidu.com/banseon/demo/dev/
HELLO WORLD
banseon
[email protected]
Project Manager
Architect
demo
http://hi.baidu.com/banseon
No
-5
Apache 2
http://www.baidu.com/banseon/LICENSE-2.0.txt
repo
A business-friendly OSS license
scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)
scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk
http://svn.baidu.com/banseon
demo
http://www.baidu.com/banseon
......
......
Windows XP
Windows
x86
5.1.2600
mavenVersion
2.0.3
/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
......
......
......
......
......
......
banseon-repository-proxy
banseon-repository-proxy
http://192.168.1.169:9999/repository/
default
......
org.apache.maven
maven-artifact
3.8.1
jar
test
spring-core
org.springframework
true
......
banseon-maven2
banseon maven2
file://${basedir}/target/deploy
banseon-maven2
Banseon-maven2 Snapshot Repository
scp://svn.baidu.com/banseon:/usr/local/maven-snapshot
banseon-site
business api website
scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web
Maven的构建生命周期
- 验证 validate 验证项目 验证项目是否正确且所有必须信息是可用的
- 编译 compile 执行编译 源代码编译在此阶段完成
- 测试 Test 测试 使用适当的单元测试框架(例如JUnit)运行测试。
- 包装 package 打包 创建JAR/WAR包如在 pom.xml 中定义提及的包
- 检查 verify 检查 对集成测试的结果进行检查,以保证质量达标
- 安装 install 安装 安装打包的项目到本地仓库,以供其他项目使用
- 部署 deploy 部署 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程
Maven的三个标准生命周期
- clean 项目清理
- default或build 项目部署
- site 项目站点文档构建
Clean 生命周期
当我们执行 mvn post-clean 命令时,Maven 调用 clean 生命周期,它包含以下阶段:
pre-clean:执行一些需要在clean之前完成的工作
clean:移除所有上一次构建生成的文件
post-clean:执行一些需要在clean之后立刻完成的工作
mvn clean 中的 clean 就是上面的 clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,mvn clean 等同于 mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。
Default (Build) 生命周期
这是 Maven 的主要生命周期,被用于构建应用,包括下面的 23 个阶段:
- validate 检查工程配置是否正确,完成构建过程的所有必要信息是否能够获取到。
- initialize 初始化构建状态,例如设置属性。
- generate-sources 生成编译阶段需要包含的任何源码文件。
- process-sources 处理源代码,例如,过滤任何值(filter any value)。
- generate-resources 生成工程包中需要包含的资源文件。
- process-resources 拷贝和处理资源文件到目的目录中,为打包阶段做准备。
- compile 编译工程源码。
- process-classes 处理编译生成的文件,例如 Java Class 字节码的加强和优化。
- generate-test-sources 生成编译阶段需要包含的任何测试源代码。
- process-test-sources 处理测试源代码,例如,过滤任何值(filter any values)。
- test-compile 编译测试源代码到测试目的目录。
- process-test-classes 处理测试代码文件编译后生成的文件。
- test 使用适当的单元测试框架(例如JUnit)运行测试。
- prepare-package 在真正打包之前,为准备打包执行任何必要的操作。
package 获取编译后的代码,并按照可发布的格式进行打包,例如 JAR、WAR 或者 EAR 文件。 - pre-integration-test 在集成测试执行之前,执行所需的操作。例如,设置所需的环境变量。
- integration-test 处理和部署必须的工程包到集成测试能够运行的环境中。
- post-integration-test 在集成测试被执行后执行必要的操作。例如,清理环境。
- verify 运行检查操作来验证工程包是有效的,并满足质量要求。
- install 安装工程包到本地仓库中,该仓库可以作为本地其他工程的依赖。
- deploy 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程。
有一些与 Maven 生命周期相关的重要概念需要说明:
当一个阶段通过 Maven 命令调用时,例如 mvn compile,只有该阶段之前以及包括该阶段在内的所有阶段会被执行。
不同的 maven 目标将根据打包的类型(JAR / WAR / EAR),被绑定到不同的 Maven 生命周期阶段。
在下面的例子中,我们将 maven-antrun-plugin:run 目标添加到 Build 生命周期的一部分阶段中。这样我们可以显示生命周期的文本信息。
Site 生命周期
Maven Site 插件一般用来创建新的报告文档、部署站点等。
- pre-site:执行一些需要在生成站点文档之前完成的工作
- site:生成项目的站点文档
- post-site: 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy:将生成的站点文档部署到特定的服务器上
这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。 在下面的例子中,我们将 maven-antrun-plugin:run 目标添加到 Site 生命周期的所有阶段中。这样我们可以显示生命周期的所有文本信息。
Maven使用构建配置文件
pom中可以引用外界的配置文件,达到不同环境(开发、测试、部署)使用不同的构建配置http://www.runoob.com/maven/maven-build-profiles.html
Maven仓库
存放依赖的一个位置/文件夹/仓库
- 本地仓库
- 中央仓库
- 远程仓库
本地仓库
第一次执行maven命令时被创建,maven运行时需要的构件都从本地仓库获取,本地仓库不存在时首先去远程仓库下载到本地仓库,然后再使用。
默认目录%USER_HOME%.m2/repostitory
需要修改的话,更改 %M2_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径。
C:/MyLocalRepository
中央仓库
Maven社区提供的仓库,包含所有的依赖库。
远程仓库
开发者自己搭建的仓库,可以放自己的私有jar包,而不让别人使用,公司内通常做一个自己的远程仓库来加快jar包的下载速度,类似的阿里云仓库就是国内的加速仓库。
companyname.lib1
http://download.companyname.org/maven2/lib1
companyname.lib2
http://download.companyname.org/maven2/lib2
Maven依赖搜索顺序
步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中已被将来引用。
步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库已被将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。
使用阿里云仓库
众所周知,中国政府实行网络闭关锁国政策。Maven访问是不可能的了,使用阿里云的仓库速度会快的多
Maven 阿里云(Aliyun)仓库
Maven 仓库默认在国外, 国内使用难免很慢,我们可以更换为阿里云的仓库。
第一步:修改 maven 根目录下的 conf 文件夹中的 setting.xml 文件,在 mirrors 节点上,添加内容如下:
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central
第二步: pom.xml文件里添加:
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
true
false
Maven插件
Maven的生命周期包含着一系列的阶段,这些phase就相当于Maven提供的接口,实现是由插件来完成的。
插件执行的命令mvn [plugin-name]:[goal-name]
常见插件
不展开细聊:http://www.runoob.com/maven/maven-plugins.html