今天编译多module项目,发现其中一个module的pom需要去远程仓库去获取,而不是 从本地仓库获取,找了好资料,一直没有找到正确的解决方案,所以想着将maven的知识点梳理一下。
Maven简介:
maven是一种项目管理和整合工具。
maven为开发者提供了一套完整的构建生命周期框架
maven皆在于简化工程的构建,并实现标准化,无缝衔接编译,发布,文档生成,团队合作。
环境配置:
系统要求:
jdk:
maven 3.3要求jdk1.7以上
磁盘:
maven自身大概需要10M的磁盘空间。初次之外,本地maven仓库需要额外i磁盘,一般需要500m
内存: 无
操作系统: 无
java 安装
maven安装:
- 下载安装文件,选择最新稳定版本:http://maven.apache.org/download.html
- 安装
- Windows:解压文件到你想要安装的位置:D:\Software\apache-maven-3.5.0
- Linux:解压文件到你想要安装的位置:/usr/local/apache-maven
- Mac:解压文件到你想要安装的位置:/usr/local/apache-maven
- 设置 Maven 环境变量(不清楚的自行查找资料)
- Windows
配置M2_HOME环境变量:
M2_HOME=D:\Software\apache-maven-3.5.0;
将bin目录追加到PATH路径中:%M2_HOME%\bin; - Linux
在/etc/profile文件中添加Maven环境变量,如下所示:
export M2_HOME=/usr/local/apache-maven/apache-maven-3.5.0
export PATH=$M2_HOME/bin:$PATH
然后执行source /etc/profile,使环境变量生效 - Mac
在/etc/profile文件中添加Maven环境变量,如下所示:
export M2_HOME=/usr/local/apache-maven/apache-maven-3.5.0
export PATH=$M2_HOME/bin:$PATH
然后执行source /etc/profile,使环境变量生效 - 验证 Maven 安装(有输出maven版本信息,Java版本信息表示安装成功)
- Windows : mvn --version
- Linux : mvn --version
- Mac : mvn --version
- Windows
功能:
项目管理 工具、依赖管理工具,构建工具
优点:
对第三方依赖进行统一的版本 管理
统一的构建过程
统一的项目的目录管理
构建:
清理: mvn clean
编译: mvn compile
测试: mvn test
部署: mvn deploy
安装: 将jar安装到本地仓库): mvn install
使用:
Maven 规定了项目的源代码,测试代码,资源文件,编译包输出文件,字节码文件等文件的目录,统一了项目的目录结构
- 源代码目录 : /src/main/java
- 资源文件目录 : /src/main/resources
- 测试代码目录 : /src/test/java
- 包输出目录 : /target
- 编译后的字节码输出目录 : /target/classes 注意:资源文件需要再classes下存在,不然报文件不存在错误
POM文件解析:
POM代表工程对象模型,是使用maven工作时候的基本组建,是一个xml文件,他放在工程的根目录下,文件命名为pom.xml
POM包含了关于工程和各种配置细节的信息,maven使用这些信息构建工程
POM包含了目标和插件,当执行一个任务或者目标时,Maven会查找当前目录下的POM,从其中读取所需要的配置信息,然 后执行目标;
在创建POM之前,我们首先确定工程组(groupId),及其名称(artifactId)和版本,在仓库中这些属性是工程的唯一标识;
- 所有的POM文件需要project元素和三个必须的字段:groupId, artifactId,version;
- 在仓库中的工程标识为groupId:artifactId:version;
- POM.xml的根元素是 project,它有三个主要的子节点
- groupId:这是工程组的标识,它在一个组织或者项目中通常是唯一的;
- artifactId:这是工程的标识,它通常是工程的名称,groupId 和 artifactId 一起定义了 artifact 在仓库中的位置;
- version:这是工程的版本号,在 artifact 的仓库中,它用来区分不同的版本;
基本配置
- modelVersion : pom模型版本,maven2和3只能为4.0.0
- groupId : 组ID,maven用于定位
- artifactId : 在组中的唯一ID用于定位
- version : 项目版本
- packaging: 项目打包方式,有一下值:pom, jar, maven-plugin, ejb, war, ear, rar, par,默认为jar
依赖配置
- parent:用于确定父项目的坐标
<parent>
<groupId>com.hyn</groupId>
<artifactId>SIP-parent</artifactId>
<relativePath></relativePath>
<version>0.0.1-SNAPSHOT</version>
</parent>
groupId:父项目的构件标识符
artifactId:父项目的唯一标识符
relativePath:Maven首先在当前项目的找父项目的pom,然后在文件系统的这个位置(relativePath),然后在本地仓库,再在远程仓库找
version:父项目的版本
- modules : 有些maven项目会做成多模块的,这个标签用于指定当前项目所包含的所有模块。之后对这个项目进行的maven操作,会让所有子模块也进行相同操作
<modules>
<module>com-a</module>
<module>com-b</module>
<module>com-c</module>
</modules>
- properties : 用于定义pom常量
<properties>
<java.version>1.7</java.version>
</properties>
这个常量可以在pom文件的任意地方通过${java.version}来引用
- dependencies : 项目相关依赖配置,如果在父项目写的依赖,会被子项目引用,一般父项目会将子项目公用的依赖引入
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
- dependencyManagement : 在父模块中定义后,子模块不会直接使用对应依赖,但是在使用相同依赖的时候可以不加版本号,这样的好处是,父项目统一了版本,而且子项目可以在需要的时候才引用对应的依赖
父项目:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
子项目:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
构建配置
- build : 用于配置项目构建相关信息