JavaMaven
Maven 是一款项目管理工具,可以对 Java项目进行构建、依赖管理。
一、概念
Maven 是一个项目管理工具
Maven 对项目的构建过程进行了抽象,提供了多个生命周期和对应的插件
Maven 的核心思想是:约定大于配置
因此 Maven 给项目提供了一套约定俗成的规则
Maven 可以集中管理依赖,解决依赖重复和依赖冲突的问题
二、安装与配置
1. 安装
(1) 下载 Maven
(2) 解压
将下载的安装包解压到安装目录。
2. 环境变量
在环境变量面板中,
新增系统变量 MAVEN_HOME,变量值设为 ...\apache-maven-xxx
,
编辑系统变量 Path,增加变量值 %MAVEN_HOME%\bin
3. 配置文件
打开安装目录下的的 conf\setting.xml
,修改配置如下:
配置阿里云镜像,加快国内的下载速度
1
2
3
4
5
6
7
8<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>配置本地仓库地址
1
<localRepository>本地仓库地址</localRepository>
推荐在 maven 安装目录下新建一个 repository 文件夹,将本地仓库地址设为该路径即可
4. IDEA 中配置
依次打开 File - Settings - Build,Execution,Deployment - Build Tools - Maven
,修改配置如图所示:
依次打开 File - New Projects Setup - Setting for New Projects
,做同样的修改。
三、项目目录结构
Maven 生成的项目具有以下目录结构:
src:源代码
main:项目代码
java:项目 Java代码
resources:项目所需的配置文件
webapp:Web 项目资源目录
仅在 Web 项目中才会有
test:测试代码
- java:测试 Java代码
- resources:测试所需的配置文件
pom.xml:项目配置信息
四、常用命令
1 |
|
将 Java文件夹下的文件编译为 class 文件,并输出至 target 文件夹下
1 |
|
将编译后结果(即 target 文件夹)删除
1 |
|
将编译后的代码打包成可分发格式的文件,比如 JAR、WAR 或者 EAR 文件
1 |
|
将项目安装至本地仓库之中
需要注意的是:
- 命令对应 Maven 生命周期中的一个阶段,在生命周期中,运行某个阶段时,它之前的生命周期阶段会依次先执行
- 命令的实际执行是由 Maven 插件实现的
五、生命周期
Maven 将项目的构建过程抽象为三套相互独立的生命周期,分别是:
Clean Lifecycle:在构建前进行的一系列清理工作
包含以下阶段:
- pre-clean:执行一些需要在 clean 之前完成的工作
- clean:移除所有上一次构建生成的文件
- post-clean:执行一些需要在 clean 之后立刻完成的工作
Default Lifecycle:构建的核心部分,包含编译、测试、打包、部署等等
包含以下阶段:
生命周期阶段 描述 validate(校验) 校验项目是否正确并且所有必要的信息可以完成项目的构建过程。 initialize(初始化) 初始化构建状态,比如设置属性值。 generate-sources(生成源代码) 生成包含在编译阶段中的任何源代码。 process-sources(处理源代码) 处理源代码,比如说,过滤任意值。 generate-resources(生成资源文件) 生成将会包含在项目包中的资源文件。 process-resources (处理资源文件) 复制和处理资源到目标目录,为打包阶段最好准备。 compile(编译) 编译项目的源代码。 process-classes(处理类文件) 处理编译生成的文件,比如说对Javaclass文件做字节码改善优化。 generate-test-sources(生成测试源代码) 生成包含在编译阶段中的任何测试源代码。 process-test-sources(处理测试源代码) 处理测试源代码,比如说,过滤任意值。 generate-test-resources(生成测试资源文件) 为测试创建资源文件。 process-test-resources(处理测试资源文件) 复制和处理测试资源到目标目录。 test-compile(编译测试源码) 编译测试源代码到测试目标目录. process-test-classes(处理测试类文件) 处理测试源码编译生成的文件。 test(测试) 使用合适的单元测试框架运行测试(Juint是其中之一)。 prepare-package(准备打包) 在实际打包之前,执行任何的必要的操作为打包做准备。 package(打包) 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。 pre-integration-test(集成测试前) 在执行集成测试前进行必要的动作。比如说,搭建需要的环境。 integration-test(集成测试) 处理和部署项目到可以运行集成测试环境中。 post-integration-test(集成测试后) 在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。 verify (验证) 运行任意的检查来验证项目包有效且达到质量标准。 install(安装) 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。 deploy(部署) 将最终的项目包复制到远程仓库中与其他开发者和项目共享。 Site Lifecycle:项目站点文档的构建
包含以下阶段:
- pre-site:执行一些需要在生成站点文档之前完成的工作
- site:生成项目的站点文档
- post-site: 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy:将生成的站点文档部署到特定的服务器上
六、IDEA 中创建 Maven 项目
在创建项目时,选中 Maven 项即可。
勾选了 Create from archetype 代表使用模板创建项目。
1. 不使用模板
项目创建后,目录结构如图所示:
2. 使用 maven-archetype-quickstart
依次勾选 Create from archetype 和 maven-archetype-quickstart,使用模板创建一个 Java项目,目录结构如图所示:
3. 使用 maven-archetype-webapp
依次勾选 Create from archetype 和 maven-archetype-webapp,使用模板创建一个 JavaWeb 项目,目录结构如图所示:
七、Maven 坐标
坐标,即被 Maven 管理的资源的唯一标识,它由三个部分组成:
- groupId:项目组织名
- artifactId:项目名
- version:版本号
八、导入依赖
1. 导入方式
在 pom.xml
中添加信息如下:
1 |
|
2. 依赖范围
添加依赖时,需要指定依赖范围,即依赖将会在哪些范围起作用。
如果不指定,则默认依赖范围为 compile 。
依赖范围包括:
compile:默认值,编译范围为编译、测试、运行
provided:编译范围为编译、测试
适用于这样的场景:
在编译、测试时需要某个依赖才能完成,但打包后不再需要此依赖(因为 JDK 或容器已经提供)
典型案例:
Servlet-api.jar
在编译、测试时,需要导入该依赖才能完成,
在打包以后,Tomcat 等服务器会提供该依赖。
runtime:编译范围为测试、运行
test:编译范围为测试
system:编译范围为编译、测试,但 JAR 包应该在本地,且需要显式提供路径
不推荐使用
九、设置插件
如果需要针对 plugin 进行特殊配置,可以在 pom.xml
中的设置。
配置 maven-compiler-plugin 的版本为 3.8,
并设置生成字节码和编译使用的 Java版本为 1.8:
1
2
3
4
5
6
7
8
9
10
11
12
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<target>1.8</target>
<source>1.8</source>
</configuration>
</plugin>
</plugins>
</build>