1.maven的简介
maven是Apache一款优秀的开源产品,被广大java程序员所使用,maven能帮我们项目依赖,项目构建,和项目信息的管理。
1.1项目依赖
maven坐标可以确定一个构件(构件可以是,jar包,war包,插件等等)。
maven坐标由groupId,artifactId,version,packaging,classifier组成。
groupId:定义了项目输入哪个组,这个组往往和项目所在组织或公司管理,例如:com.google,org.springframework。
artifactId:定义了当前项目在maven组中的唯一id,一般一个项目下有多个模块,artifactId表示模块名,例如spring-core,spring-bean。
version:表示版本号,版本有稳定版本,和快照版本(快照版带后缀SNAPSHOT,属于不稳定版本,表示还在卡法中)
packageing:打包方式,默认为jar包,还有war,pom,maven-plugin等。
classifier:附属构件。
1.2项目构建
maven是一款优秀的构建工具,只需要输入简单的命令就可以帮助我们完成清理,编译,打包,部署,生成站点等操作。要了解项目构建就就必须的了解maven的生命周期,maven构建的生命周期由3套生命周期构成,clean,default,site,每个生命周期都包含若干个阶段。当我们输入命令时,该命令所在的那一套生命周期中的前面的步骤都会执行,
比如输入mvn clean install 对应2套生命周期,clean周期的pre-clean,和clean,default周期的install包括自己和前面的周期都会执行。
1.2.1 clean的生命周期
pre-clean:执行清理前需要完成的工作
clean:清理上一次的构建生成的文件
post-clean:清理后需要完成的工作
1.2.2 default 的生命周期
validate:验证操作
- initialize:初始化
- generate-source:
- process-sources:处理项目主资源文件。一般来说将src/main/resources目录的内容处理后,赋值到项目输出目录的classpath目录中
- generate-resources:
- process-resources:
- compile:一般来说,将src/main/java目录下的java文件编译后输出到classpath目录中
- process-classes:
- generate-test-sources:
- process-test-sources:一般来说将src/test/resources目录的内容处理后,赋值到test输出目录的classpath目录中
- generate-test-resources:
- process-test-resources:
- test-compile:编译项目的测试代码。
- process-test-classess :
- test:使用单元测试框架,运行测试结果
- prepare-package package:打包,如jar,war
- pre-integration-test
- integration-test
- post-integration-test
- verfiy:
- install:将包安装到maven本地仓库
- deploy:将包部署至远程仓库。
1.2.3 site 的生命周期
site生命周期的目的是建立和发布项目站点。maven恩呢该基于pom所包含的信息,自动生成一个友好的站点。
- pre-site
- site:生成项目站点文档
- post-site
- site-deploy:将生成的项目站点发布到服务器上
2.常用的maven命令
在maven项目根目录输入maven命令
- mvn clean:清理输出目录
- mvn compiler:对应前面的default生命周期的compile阶段,compiler阶段,及前面的阶段都会执行。
- mvn test:使用测试框架测试
- mvn package:打包
- mvn install:安装到本地仓库
- mvn deploy:部署至远程仓库
- mvn site-deploy:生成站点信息
一般3套生命周期会被配合使用
例如 mvn clean deploy site-deploy
3.maven的插件
maven内置了很多插件,构建的任务都是由插件完成的,构建的生命周期和插件的目标项目绑定。
3.1 clean的生命周期和插件目标的绑定
| 生命周期 | 插件目标 |
|---|---|
| pre-clean | maven-clean-plugin:clean |
| clean | maven-clean-plugin:clean |
| post-clean | maven-clean-plugin:clean |
3.2 default的生命周期和插件目标的绑定
| 生命周期 | 插件目标 | 作用 |
|---|---|---|
| process-resources | maven-resources-plugin:resources | 复制主资源文件至主输出目录 |
| compiler | maven-compiler-plugin:compile | 编译主代码至输出目录 |
| test | maven-surefire-plugin:test | 执行测试用例 |
| package | maven-jar-plugin:test | 创建项目jar包 |
| install | maven-install-plugin:install | 安装至本地仓库 |
| deploy | maven-deploy-plugin:deploy | 部署构建至远程仓库 |
3.3 site的生命周期和插件目标的绑定
| 生命周期 | 插件目标 |
|---|---|
| pre-site | maven-site-plugin:site |
| site | maven-site-plugin:site |
| post-site | maven-site-plugin:site |
| site-deploy | maven-site-plugin:deploy |
3.4 获取插件的帮助信息
除了查询文档之外,我们还可以借助maven-help-plugin 来获取插件的帮助信息。
用法:
mvn help:describe -Dplugin=groupId:artifactId:版本号
输入组件的坐标信息,以冒号分割
例如:获取编译插件的帮助信息。注意切勿输入不必要的空格,以免报错
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1
也可以不指定版本号:默认会搜索最新版本的插件
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin
可以指定目标前缀,写法更简洁
mvn help:describe -Dplugin=compiler -Dgoal=compile -Ddetail
-Ddetail 表示查询更详细的信息。
3.5 显示依赖树
以树结构展示依赖的信息
mvn dependency:tree
3.6常用插件前缀
| 插件名 | 前缀 | 作用 |
|---|---|---|
| maven-clean-plugin | clean | 清理项目 |
| maven-compiler-plugin | compiler | 编译项目 |
| maven-install-plugin | install | 安装项目 |
| maven-deploy-plugin | deploy | 部署项目 |
| maven-resources-plugin | resources | 处理资源 |
| maven-surefire-plugin | surefire | 执行测试 |
| maven-jar-plugin | jar | 打jar包 |
| maven-war-plugin | war | 打war包 |
| maven-assembly-plugin | assembly | 自定义格式分发包 |
| maven-source-plugin | source | 生成源码包 |
查看插件前缀链接
http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-metadata.xml
4.maven属性
4.1 自定义属性
在pom文件中的properties中定义的属性,
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
在别的地方可以通过,${project.build.sourceEncoding}访问
4.2 java系统属性和环境变量属性
maven可以访问java系统属性,例如${user.home}指向用户目录。
环境变量属性:以env开头,例如${env.JAVA_HOME}指向javahome的环境变量。
4.3常用内置属性
- ${basedir}:项目的根目录
- ${version}:项目的根目录
- ${project.build.sourceDirectory}:项目的主源码目录 src/main/java
- ${project.build.directory}:项目构建输出目录,默认 target/
- ${project.outputDirectory}:项目主代码编译输出目录 默认target/classes/