maven是基于项目对象模型(pom),可以通过一小段描述信息来管理项目的构建,文档和报告的软件项目管理工具。
安装JDK,配置java环境变量:略
下载maven包,下载地址:http://maven.apache.org/download.cgi#
注意maven的版本号需要和jdk版本兼容,当jdk版本低,而Maven的版本高时,会报错:
“Exception in thread “main” java.lang.UnsupportedClassVersionError:org/apache/maven/cli/MavenCli:Unsupported major.minor version 51.0”
配置maven环境变量: 解压包,配置path: 添加指向解压目录下的bin目录,即$M2_HOME/bin 或者 新增系统环境变量M2_HOME指向解压的目录
校验配置: 在命令行执行 mvn -v如果能够现实maven和java版本号,则配置成功
和settings.xml这个文件有关。这个文件存在于两个地方:
本地仓库的配置,修改settings.xml:
<localRepository>C:\mvn\repos</localRepository>
这个配置将会将依赖库都下载存放在本地的C:\mvn\repos中
maven项目代码结构:
src
main
java
com.company.xxx(包名)
- 项目开发代码 resources
- 开发资源文件 test
java
com.company.xxx(包名)
- 项目的测试代码 resources
-测试资源文件 pom.xml
mvn -v 查看maven版本
mvn compile 编译
mvn test 测试
mvn package 打包
mvn clean 删除maven在target中所生成的字节码文件
mvn install 安装jar包到本地仓库中,以便其他的项目可以调用
mvn deploy 运行发布,发布到私服上
组合使用:
mvn clean compile 表示先运行清理之后运行编译,会见代码编译到target文件夹中
mvn clean test 运行清理和测试
mvn clean package 运行清理和打包
mvn clean install 运行清理和安装
mvn clean deploy 运行清理和发布(发布到私服上面)
pom.xml是maven配置的核心文件,用来描述项目信息,组织依赖,项目管理,其中包含很多标签
<project>
<modelVersion>4.0.0</modelVersion>
<!--maven2.0必须是这样写,现在是maven2唯一支持的版本-->
<!-- 基础设置 -->
<modelVersion>4.0.0</modelVersion> 指定了当前pom的版本
<groupId>cn.itcast.hadoop.mr</groupId> 用来指定当前的maven属于哪个实际的项目
<artifactId>datacount</artifactId>
<version>0.0.1-SNAPSHOT</version> 当前项目的版本号
<packaging></packaging> 打包方式,默认是jar
<name></name>项目描述名
<url></url>项目的地址
<description></description>项目描述
<name>...</name>
<repositories></repositories>配置依赖包从什么中央仓库进行下载
<dependencies>...</dependencies> 项目的依赖
<parent>...</parent> 被继承的父项目的构件
<dependencyManagement>...</dependencyManagement> 缺省的依赖信息将会从这个元素中继承
<modules>...</modules> 模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径
<properties>...</properties> 以值替代名称,Properties可以在整个POM中使用,也可以作为触发条件
</project>
pom.xml中依赖的配置形如:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>
说明:
groupId
,必选,实际隶属项目
artifactId
,必选,其中的模块
version
, 必选,版本号
type
, 可选,依赖类型,默认jar
scope
, 可选,依赖范围,默认compile
optional
, 可选,标记依赖是否可选,默认false
exclusion
, 可选,排除传递依赖性,默认空
依赖的范围
其中 scope
代表依赖的范围,取值有6种:
compile
:默认的范围,编译测试运行都有效
provided
:只在编译测试时有效,在实际打包时不会放进去,例如servlet-api.jar包,在web服务器tomcat的lib中已经自带,再打包进去可能会引起冲突,这时使用provided不会将该包打包
test
:只在测试时有效
runtime
:在测试和运行时有效
system
:与本机系统相关联,可移植性差
import
:导入的范围,它只使用在dependencyManagement中,表示从其它的pom中导入dependency的配置。
依赖的传递性
所谓依赖的传递性,A依赖于B,B依赖于C ,可以推出 A依赖于C,需要注意这种依赖的传递性只在compile范围进行。即A ,B,C的scope都是compile
依赖的搜索
maven搜索依赖时会先搜索本地仓库即settings.xml中localRepository配置的仓库,如果本地仓库没有再搜索中央仓库,即pom.xml中repositories配置的仓库
依赖冲突和查询
存在多个模块依赖不同版本的包时,会存在依赖冲突,此时maven并不会报错,而是根据一定规则选用一个依赖包来生效。规则:
在同一个pom.xml文件中配置了同一个包的不同版本,谁配置在前面,则谁生效
不同模块之间的依赖关系短路优先,优先解析路径短的生效.
此外,可以使用exclusion标签来排除该依赖:
<dependency>
<groupId>com.company.xxx</groupId>
<artifactId>xxx-xxx</artifactId>
<version>1.0.0-SNAPSHOT</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.company.xxx</groupId>
<artifactId>xxx-aggreation</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging> pom </packaging> <!-- 这里必须是pom-->
<name>xxx Aggregator</name>
<modules>
<module>../xxx-module1</module>
<module>../xxx-module2</module>
</modules>
</project>
注意事项: 由于聚合的maven项目和各个子项目是对等的,所以再聚合项目中module的配置一定是 ../子模块
的格式
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.company.xxx</groupId>
<artifactId> xxx-parentmodule </artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name> xxx-parentmodule</name>
<dependencyManagement> <!--默认被子模块继承的依赖-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
</dependencyManagement>
</project>
子模块的配置:
<project>
<modelVersion>4.0.0</modelVersion>
< parent >
<groupId>com.company.xxx</groupId>
<artifactId> xxx-parentmodule </artifactId>
<version>1.0.0-SNAPSHOT</version>
< relativePath >../xxx-parentmodule/pom.xml</ relativePath> <!--这里需要指明父模块pom.xml的位置,使用相对路径-->
</ parent >
<artifactId> xxx-sonmodule </artifactId>
<name>xxx-sonmodule</name>
...
</project>
由于maven的聚合项目只在pom.xml中加入要聚合的各个子模块的信息,没有任何项目代码,而pom.xml中父模块中的配置往往也是为了让其他子模块有选择性的继承。这两者往往会合并,都放在一个pom.xml文件中,成为这样的形式:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.company.xxx</groupId>
<artifactId>xxx-parentmodule</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging> pom </packaging>
<name>xxx-parentmodule</name>
<modules>
<module>../xxx-sonmodule1</module>
<module>../xxx-sonmoudule2</module>
</modules>
</project>
注意:
- 如果子模块没有声明groupId和version, 这两个属性继承至父模块。但如果子模块有不同与父模块的 groupId、version ,也可指定;
- 不应该继承artifactId,如果groupId ,version,artifactId 完全继承的话会造成坐标冲突;另外即使使用不同的 groupId或version,同样的 artifactId也容易产生混淆。