目录
简介
Maven是一个跨平台的项目管理工具。作为Apache组织的一个颇为成功的开源项目,其主要服务于基于Java平台的项目创建,依赖管理和项目信息管理。
Maven 功能
- 构建
- 文档生成
- 报告
- 依赖
- SCMs
- 发布
- 分发
- 邮件列表
环境
下载:
官网:http://maven.apache.org/index.html
配置:
配置环境变量(必须依赖jdk,所以要求环境变量中有对应的JAVA_HOME)
Window下
配置maven信息
新建环境变量 maven_home 变量值 :对应安装路径配置Path 在之后添加 ;%maven_home%\bin;
LIUXS下
编辑 /etc/profile 文件 sudo vim /etc/profile,在文件末尾添加如下代码:
export MAVEN_HOME=安装目录
PATH=${PATH}:${MAVEN_HOME}/bin
保存文件,并运行如下命令使环境变量生效:
source /etc/profile
概念
约定配置
Maven 提倡使用一个共同的标准目录结构,Maven 使用约定优于配置的原则,大家尽可能的遵守这样的目录结构。如下所示:
目录 | 目的 |
${basedir} | 存放pom.xml和所有的子目录 |
${basedir}/src/main/java | 项目的java源代码 |
${basedir}/src/main/resources | 项目的资源,比如说property文件,springmvc.xml |
${basedir}/src/test/java | 项目的测试类,比如说Junit代码 |
${basedir}/src/test/resources | 测试用的资源 |
${basedir}/src/main/webapp/WEB-INF | web应用文件目录,web项目的信息,比如存放web.xml、本地图片、jsp视图页面 |
${basedir}/target | 打包输出目录 |
${basedir}/target/classes | 编译输出目录 |
${basedir}/target/test-classes | 测试编译输出目录 |
Test.java | Maven只会自动运行符合该命名规则的测试类 |
~/.m2/repository | Maven默认的本地仓库目录位置 |
POM
POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖。
所有 POM 文件都需要 project 元素和三个必需字段:groupId,artifactId,version。
project:工程的根标签。
modelVersion:模型版本需要设置为 4.0。
groupId:这是工程组的标识。它在一个组织或者项目中通常是唯一的。
artifactId:这是工程的标识。它通常是工程的名称。
version:这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。
扩展
父(Super)POM是 Maven 默认的 POM。所有的 POM 都继承自一个父 POM(无论是否显式定义了这个父 POM)。父 POM 包含了一些可以被继承的默认设置。因此,当 Maven 发现需要下载 POM 中的 依赖时,它会到 Super POM 中配置的默认仓库 http://repo1.maven.org/maven2 去下载。
Maven 使用 effective pom(Super pom 加上工程自己的配置)来执行相关的目标,它帮助开发者在 pom.xml 中做尽可能少的配置,当然这些配置可以被重写。
使用以下命令来查看 Super POM 默认配置:
mvn help:effective-pom
生命周期
Maven 拥有三套独立的生命周期,它们分别是 clean、default 和 site。clean 生命周期的目的是清理项目;default 生命周期的目的是构建项目;site 生命周期的目的是建立项目站点。每个生命周期又包含了多个阶段。这些阶段在执行的时候是有固定顺序的。后面的阶段一定要等前面的阶段执行完成后才能被执行。
每套生命周期的各个阶段。
1. clean 生命周期
clean 生命周期的目的是清理项目,它包括以下三个阶段。
pre-clean:执行清理前需要完成的工作。
clean:清理上一次构建过程中生成的文件,比如编译后的 class 文件等。
post-clean:执行清理后需要完成的工作。
2. default 生命周期
default 生命周期定义了构建项目时所需要的执行步骤,它是所有生命周期中最核心部分,包含的阶段如下表所述,比较常用的阶段用粗体标记。
名称 | 说明 |
validate | 验证项目结构是否正常,必要的配置文件是否存在 |
initialize | 做构建前的初始化操作,比如初始化参数、创建必要的目录等 |
generate-sources | 产生在编译过程中需要的源代码 |
process-sources | 处理源代码,比如过滤值 |
generate-resources | 产生主代码中的资源在 classpath 中的包 |
process-resources | 将资源文件复制到 classpath 的对应包中 |
compile | 编译项目中的源代码 |
process-classes | 产生编译过程中生成的文件 |
generate-test-sources | 产生编译过程中测试相关的代码 |
process-test-sources | 处理测试代码 |
generate-test-resources | 产生测试中资源在 classpath 中的包 |
process-test-resources | 将测试资源复制到 classpath 中 |
test-compile | 编译测试代码 |
process-test-classes | 产生编译测试代码过程的文件 |
test | 运行测试案例 |
prepare-package | 处理打包前需要初始化的准备工作 |
package | 将编译后的 class 和资源打包成压缩文件,比如 rar |
pre-integration-test | 做好集成测试前的准备工作,比如集成环境的参数设置 |
integration-test | 集成测试 |
post-integration-test | 完成集成测试后的收尾工作,比如清理集成环境的值 |
verify | 检测测试后的包是否完好 |
install | 将打包的组件以构件的形式,安装到本地依赖仓库中,以便共享给本地的其他项目 |
deploy | 运行集成和发布环境,将测试后的最终包以构件的方式发布到远程仓库中,方便所有程序员共享 |
这些阶段的详细介绍内容可以参考链接:
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
3. site 生命周期
site 生命周期的目的是建立和发布项目站点。Maven 可以基于 pom 所描述的信息自动生成项目的站点,同时还可以根据需要生成相关的报告文档集成在站点中,方便团队交流和发布项目信息。site 生命周期包括如下阶段。
pre-site:执行生成站点前的准备工作。
site:生成站点文档。
post-site:执行生成站点后需要收尾的工作。
site-deploy:将生成的站点发布到服务器上。
配置文件
- 构建配置文件大体上有三种类型:
项目级(Per Project) 定义在项目的POM文件pom.xml中
用户级 (Per User) 定义在Maven的设置xml文件中 (%USER_HOME%/.m2/settings.xml)
全局(Global) 定义在 Maven 全局的设置 xml 文件中 (%M2_HOME%/conf/settings.xml)
- 配置文件激活方式
使用命令控制台输入显式激活。
通过 maven 设置。
基于环境变量(用户或者系统变量)。
操作系统设置(比如说,Windows系列)。
文件的存在或者缺失。
插件
Maven 生命周期的每一个阶段的具体实现都是由 Maven 插件实现的。Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。
插件是在 pom.xml 中使用 plugins 元素定义的。
仓库
Maven 仓库有三种类型:
- 本地(local)
Maven 在根据坐标查找依赖的构件时,先是在本地仓库中查找,配置方式,maven的setting.xml中
<localRepository>C:/java/xxxx</localRepository>
- 中央(central)
Maven 必须知道至少一个远程仓库才能执行 Maven 的命令。这个远程仓库是默认的,也就是不需要用户专门配置,这里把它叫作中央仓库。也就是说,中央仓库就是一个默认的远程仓库。修改maven setting.xml 文件。
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
- 远程(remote)
安装好 Maven 后,如果不执行任何 Maven 命令的话,本地仓库目录是不存在的。当用户输入第 1 条 Maven 命令后,Maven 才会创建本地仓库。然后根据配置和需要从远程仓库下载对应的构件到本地仓库,以备需要的时候使用。
本地仓库只会有一个,而远程仓库可以有很多。它是开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的 jar 文件。
配置方式:POM.XML 中,常用的构建产品:NEXUS,参见NEXUS构建
<repositories>
<repository>
<id>companyname.lib1</id>
<url>xxxxx</url>
</repository>
<repository>
<id>companyname.lib2</id>
<url>xxxxxx</url>
</repository>
</repositories>
Maven 依赖搜索顺序
步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中以备将来引用。
步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库以备将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。
升级为MAVEN项目
第一步:按“IDEA下MAVEN项目的创建”创建一个新的项目;
第二步:将原来的项目代码拷贝到:src/main/java 下;
第三步:将项目的配置文件拷贝到:src/main/resource 下,
第四步:若项目存在多环境时,可在java 同目录创建 evns文件夹存放差异文件,不存在多环境可以跳过此步骤;
第五步:将项目的web文件拷贝到webapp 目录下,并删除class文件夹(若项目由需要可以保留);
第六步:构建项目依赖包
- 将项目依赖的jar 按对应的版本添加到pom中;
- 若jar为自建则可以放到公司私服,并定义好版本号,再添加到pom中;
- 非自建,但是版本号不清晰的,可以将jar拷贝到项目某一个文件夹下,使用
<dependency>
<groupId>xxx</groupId>
<artifactId>xxxxx</artifactId>
<version>xxxxx</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/xxxxx.jar</systemPath>
</dependency>
- 项目依赖的jar版本久远,无从下周, 可:
- 将依赖的jar 全部放到webapp/WEB-INF/lib 下;
- Idea下引入编译时依赖此文件
- 添加maven编译插件
<!--项目编译插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<encoding>${encoding}</encoding>
<!--根据你把lib放的位置,但需要注意的是,mac平台上,路径分隔符用的"/",windows下用的分隔符是"\"-->
<compilerArguments>
<extdirs>src/main/webapp/WEB-INF/lib</extdirs>
</compilerArguments>
</configuration>
</plugin>
第七步:多环境的配置
<profiles>
<profile>
<id>GS_DEV</id>
<properties>
<!--profiles.active是自定义的字段(名字随便起),自定义字段可以有多个-->
<profiles.active>GS_DEV</profiles.active>
</properties>
<activation>
<!---当前是否激活->
<activeByDefault>true</activeByDefault>
</activation>
<build>
<resources>
<!--差异文件-->
<resource>
<directory>src/main/evns/GS_DEV</directory>
</resource>
<!--源文件-->
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</profile>
</profiles>