###简介
Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
###安装
-
官网下载安装包,如:apache-maven-3.5.4-bin.zip
-
将其解压后放到指定路径下,如:C:\Program Files
-
设置环境变量M2_HOME和Path
-
使用命令mvn -version进行测试
-
将C:\Program Files\apache-maven-3.5.4\conf\settings.xml配置文件放置到%HOME%/.m2文件夹下(%HOME%一般为C:\Users\username)
-
修改settings.xml中的本地仓库和镜像配置
###坐标、构件、仓库
构件:在Maven中,任何依赖(jar包,tomcat等),或项目(自己打包的jar,war等)输出都可成为构件。每个构件都有自己的唯一标识(唯一坐标),由groupId,artifactId和version等信息构成,由此,Maven就可以对构件进行版本控制,管理。
GroupId/artifactId/version三个组成一个坐标,maven通过坐标下载下来的构件一般都放在C:\Users\username\.m2\repository这个文件夹中。
找各个jar包坐标的网站:http://www.mvnrepository.com/
仓库:
- 本地仓库,可以通过修改…\apache-maven-3.5.0\conf下settings.xml的localRepository属性来更改本地仓库的路径
- 远程仓库,即全球公用仓库
- 镜像仓库(可以在settings.xml中修改镜像仓库地址)
###完整的项目构件过程
清理、编译、测试、打包、集成测试、验证、部署
三套生命周期,他们之间互不影响,但是每套生命周期都有不同的阶段,他们会按顺序依次执行
- Clean清理项目,包含以下三个阶段
Pre-clean 执行清理前的工作
Clean 执行上一次构件生成的所有文件
Post-clean 执行清理后的文件 - Default构件项目(最核心),常用的有以下几种阶段
Compile
Test
Package
install - Site 生成项目站点
Pre-site 在生成站点前要完成的工作
Site 生成项目的站点文档
Post-site 在生成项目站点后要完成的工作
Site-deploy 发布生成的站点到服务器上
###Pom.xml解析
- 依赖冲突
- 短路优先
A->B->C->X(jar)
A->D->X(jar),这个被优先解析 - 路径相同的情况下,先声明先优先
- 短路优先
- 聚合和继承
- Build的讲解 http://blog.csdn.net/taiyangdao/article/details/52374125
- Reporting的讲 http://blog.csdn.net/taiyangdao/article/details/52389407
pom.xml的一个样例:
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<!-- 指定了当前的pom版本 -->
<modelVersion>4.0.0</modelVersion>
<groupId>maven02</groupId><!-- 反写的公司网址+项目名 -->
<artifactId>maven02-model</artifactId><!-- 项目名+模块名 -->
<!--有三个数字组成,第一个1表示大版本号,
第二个0表示分支版本号
第三个0表示小版本号
snapshot快照
alpha内部测试
beta公测
Release稳定
GA正式发布版本-->
<version>1.0.01SNAPSHOT</version>
<!-- 默认是jar,还可以是war zip pom -->
<packaging></packaging>
<!--项目描述名-->
<name></name>
<!--项目地址-->
<url></url>
<!--项目描述-->
<description></description>
<!--开发人员列表-->
<developers></developers>
<!--许可证-->
<licenses></licenses>
<organization></organization><!--组织信息-->
<!--比如古惑仔中,山鸡听楠哥,楠哥听B哥,因此山鸡传递依赖与B哥,但是如果在楠哥的dependency下
加上exclusions,把B个的依赖去掉,那么山鸡只听楠哥的,B哥有没有无所谓-->
<!--依赖列表-->
<dependencies>
<dependency><!--依赖项-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<type></type>
<!--依赖的范围,有6种,
compile 默认
provided 编译测试有效,最后运行时不会被加入
runtime 在测试和运行时有效
test 只在测试范围有效
system 在编译和测试时有效,与本地系统相关联,移植性差
import 导入的范围,只在dependencyManagement标签中使用,
表示从其他的pom中导入dependency的配置
控制依赖与三种classpath的关系,-->
<scope>test</scope>
<optional></optional><!--设置依赖是否可选-->
<!--排除依赖传递的列表-->
<exclusions>
<exclusion>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>maven01</groupId>
<artifactId>maven01-model</artifactId>
<version>1.0.01</version>
</dependency>
</dependencies>
<!--依赖管理,他并不会在此项目中运行,主要定义在父模块中,供子模块继承用的-->
<dependencyManagement>
<dependencies>
<dependency>
</dependency>
</dependencies>
</dependencyManagement>
<!--为构件的行为提供相应的支持-->
<build>
<plugins><!--插件列表-->
<plugin>
<groupId></groupId>
<artifactId><artifactId>
<version></version>
</plugin>
</plugins>
</build>
<!--用于在子模块中,对父模块的pom的继承-->
<parent></parent>
<!--指定多个模块一起编译-->
<modules>
<module></module>
<module></module>
<module></module>
</modules>
</project>
###常用命令
- Mvn –v 查看版本
- Mvn clean 删除target
- Mvn install 安装jar包到本地仓库
- Mvn deploy 发布项目
- Mvn compile 编译源代码
- Mvn test 测试
- Mvn package 打包
- Mvn archetype:generate -DarchetypeCatalog=internal 自动创建maven目录骨架,按提示自动选择
- Mvn archetype:generate –DgroupId=组织名,公司网站的反写+项目名
-DartifactId=项目名-模块名(创建的工程项目名)
-Dversion=版本号
-Dpackage=代码所存在的包名 - -DskipTests 不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下
-Dmaven.test.skip=true 不执行测试用例,也不编译测试用例类
###问题
- Maven创建项目时出现Generating project in Interactive mode就一直卡住
解:添加-DarchetypeCatalog=internal参数,让他不要从远程服务器上去取catalog - Maven默认使用的jdk是1.5,如何修改
解:找到setting文件,在相应的位置加入以下代码
- 在idea的多模块中,模块B依赖模块A,模块A的jar已经install到本地仓库了,此时运行模块B的compile,报Could not find artifact……错误
解:由于此时多模块的聚合工程,需要先将依赖的工程都install到本地仓库,所以需先运行主模块的install命令,这是再去compile子模块B就不会报错了。 - 在idea中的terminal下,使用mvn出现
org/apache/maven/cli/MavenCli : Unsupported major.minor version 51.0
如此错误
解:原因是jdk版本太低。只需把系统环境变量的jdk改成1.7+,idea的jdk也相应的做下修改,然后重启一下idea就行了。