maven概述
maven基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的项目管理工具。
groupId是项目的包名
artifactId是模块名,只有一个项目时是项目名
maven构建命令
mvn -v 查看maven版本
mvn compile 编译项目
mvn test 测试
mvn package 打包项目
mvn clean 删除target目录下的文件
mvn install 安装jar到本地仓库repository
maven自动构建目录骨架
archetype插件,创建服务maven规定的目录骨架
创建项目文件夹后,mvn archetype:generate 按照提示进行选择的交互式创建方式
一键创建:archetye:generate -DgroupI=组织名(通常是公司网址的反写+项目名) -DartifactI=项目名 -Dversion=版本号 -Dpackage=代码所存在的包名
java 项目构建:mvn archetype:generate -DgroupId=cn.luxh.app -DartifactId=my-web-app -DarchetypeArtifactId=maven-archetype-webapp -DinteractivMode=false
web项目构建:mvn archetype:generate -DgroupId=cn.luxh.app -DartifactId=my-web-app -DarchetypeArtifactId=maven-archetype-webapp -DinteractivMode=false
maven的坐标和仓库
maven中,构件通过坐标作为其唯一标识。groupId、artifactId、version组成了坐标
仓库分为本地仓库和远程仓库。
远程仓库的默认地址在lib的maven-model-builder-3.5.2中pom-4.0.0.xml,全球超级仓库,所有pom的超级类:https://repo.maven.apache.org/maven2
镜像仓库(setting.xml文件150行处):配置mirror
maven的生命周期
完整的项目构建过程包括:清理、编译、测试、打包、集成测试、验证、部署
maven的三套相互独立的生命周期:clean 清理项目、 default 构建项目、 site生成项目站点
1、clean 清理项目阶段:pre-clean执行清理前的工作,clean清理上一次构建生成的所有文件,post-clean执行清理后的文件
2、default 构建项目阶段:compile、test、package、install。运行package时自动执行compile和test
3、site 生成项目站点阶段:pre-site、site生成项目的站点文档、post-site、site-deploy发布生成的站点到服务器上
maven核心管理文件pom.xml
4.0.0
com.mq.test
mq-test
1.0.0
war
项目名
http://www.lufax.com
项目描述
org.apache.activemq
activemq-all
5.9.0
junit
junit
4.12
test
true
org.apache.maven.plugins
maven-source-plugin
2.4
package
jar-no-fork
-project根元素,包括约束信息
--modelVersion固定版本,指定了当前pom的版本
--groupId反写的公司网址+项目名
--artifactId实际的项目名+模块名
--version第一个0表示大版本号/第二个0表示分支版本号/第3个0表示小版本号
--packaging打包方式,组成坐标信息。
--version:snapshot快照版本,alpha内测版本,beta公测版本,release稳定版本,GA正式版本
--packaging:默认为jar,还可以为war、zip、pom
--name项目描述名,一般为产生项目文档时使用
--url项目地址
--description项目描述
--developers开发人员列表
--licenses许可证
--organization组织信息
--dependencies依赖列表,可包含多个依赖项dependency
---groupId、artifactId、version坐标
---type类型
---scope依赖范围,例如junit只在test时有用
---optional设置依赖是否可选,默认为false
---exclusions排除依赖的列表
--dependencyManagement依赖管理,包含多个dependencies。不会被运行,即不会使用到实际的依赖中。该标签多定义在父模块中,供子模块继承使用。例如多个模块都使用到junit,可以抽象一个父类模块,在父模块中对junit定义,然后子模块只需要继承即可。
--build对构建行为提供相应支持
---plugins插件列表,包含多个plugin
--parent在子模块中对父模块的pom进行继承
--modules聚合运行的多个maven模块,一起编译
maven依赖范围scope
开发时使用某个框架,需要将该框架引入到classpath中。maven提供三种classpath:编译、测试、运行,所以scope是控制依赖和三种classpath的关系。
dependency scope:compile、provided、runtime、test、system、import
compile是默认值,对编译、测试、运行都有效
provided对编译、测试有效
runtime在测试、运行时有效。如jdbc
test只在测试范围有效,如junit
system与本机系统有关,如java_home
import是导入的范围,只使用啊dependencyManagement中,表示从其他的pom中继承过来的依赖
maven依赖传递
依赖传递传递后,external libraries中可看到;可通过exclusion消除传递依赖。
setting.xml中可定义jdk版本,默认显示为1.5
maven依赖冲突
原则:短路优先。如果路径长度相同,谁先声明,先解析谁。
maven聚合和继承
聚合:多个模块一起install。创建一个maven项目,pom.xml中,修改packaging为pom,依次添加多个module。clean并install之后,本地仓库中有多个编译后的jar
继承:将共同的特性抽出来,放到一个parent module中,如junit。创建一个parent maven项目,修改packaging为pom,pom.xml中,将junit的dependency放到dependencyManagement中。parent module中的src和test没什么作用,可删除。
子module继承:添加parent标签,引入父module的坐标,删除junit的version和scope,即完成junit从父module继承。
作者 @salome
2018年 01月 11日