参考自黑马程序员在b站发布的视频教程
一.Maven的安装和基本配置
1.下载地址
https://maven.apache.org/download.cgi
2.复制下载的压缩包到安装目录,解压
Maven目录结构:
- \bin:
- 该目录包含了 mvn 运行的脚本,这些脚本用来配置Java命令,准备好 classpath 和相关的Java系统属性,然后执行Java命令。
- 其中 mvn 是基于 UNIX 平台的 shell 脚本,mvn.bat 是基于 Windows 平台的 bat 脚本。在命令行输入任何一条 mvn 命令时,实际上就是在调用这些脚本。
- 该目录还包含了 mvnDebug 和 mvnDebug.bat 两个文件,同样,前者是 UNIX 平台的 shell 脚本,后者是 Windows 平台的 bat 脚本。打开文件可以看到,两者基本是一样的,只是 mvnDebug 多了一条 MAVEN_DEBUG_OPTS 配置,其作用就是在运行 Maven 时开启debug,以便调试 Maven 本身。
- 该目录还包含 m2.conf 文件,这是 classworlds 的配置文件。
- \boot:
- 该目录存放着Maven的类加载器 plexus-classworlds框架,相对于默认的 java 类加载器,它提供了更丰富的语法以方便配置,Maven 使用该框架加载自己的类库。
- \conf:
- 这个目录存放着Maven的配置文件 settings.xml。直接修改该文件,就能在机器上全局地定制 Maven 的行为。
- \lib:
- 该目录包含了所有 Maven 运行时需要的jar包,Maven 本身是分模块开发的,因此该目录下可以看到诸如 maven-core-3.0.jar、maven-model-3.0.jar 之类的文件。
- 此外,这里还包含一些 Maven 用到的第三方依赖,如 common-cli-1.2.jar、commons-lang-2.6.jar 等。
- LICENSE.txt
- 记录了 Maven 使用的软件许可证Apache License Version 2.0。
- NOTICE.txt
- 记录了 Maven 包含的第三方软件。
- README.txt
- 包含了 Maven 的简要介绍,包括安装需求及如何安装的简要指令等。
3.配置环境变量(JAVA_HOME 和 MAVEN_HONE):
4.本地仓库配置
-
在安装目录下新建本地仓库文件夹
-
打开
\conf\settings.xml
文件,配置本地仓库。
– 在第50行左右位置
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<!--配置本地仓库路径-->
<localRepository>D:\Emvironment\apache-maven-3.8.5\maven-repo</localRepository>
5.配置国内镜像仓库
– 在150行左右位置
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
-->
<!--配置阿里的镜像仓库-->
<mirror>
<!--此镜像的唯一标识符,用来区分不同的mirror元素-->
<id>nexus-aliyun</id>
<!--对哪种仓库进行镜像,简单来说就是替代哪个仓库-->
<mirrorOf>central</mirrorOf>
<!--镜像名称-->
<name>Nexus aliyun</name>
<!--镜像URL-->
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
二.Maven基础概念
1.什么是Maven
Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
-
POM (Project Object Model) :项目对象模型
2.Maven的作用
- 项目构建:提供标准的、跨平台的自动化项目构建方式
- 依赖管理:方便快捷的管理项目依赖的资源(jar包) ,避免资源间的版本冲突问题
- 统一开发结构:提供标准的、统一的项目结构
3.仓库
用于存储资源,包含各种jar包
- 仓库的分类:
- 本地仓库:本地计算机存储资源的仓库,连接远程仓库获取资源;
- 远程仓库:非本机的仓库,为本机仓库提供资源。
- 中央仓库:Maven团队维护,存储所有资源的仓库
- 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源
- 私服的作用:
- 保存具有版权的资源,包含购买或自主研发的jar
- 中央仓库的jar都是开源的,不能存储具有版权的jar
- 一定范围内共享,仅对内开放,不对外共享。
- 保存具有版权的资源,包含购买或自主研发的jar
4.坐标
Maven中坐标用于描述仓库中资源的位置。
- Maven坐标的组成:
groupld
:定义当前Maven项目隶属组织名称(通常是域名反写,例如: org.mybatis)artifactld
:定义当前Maven项目名称(通常 是模块名称,例如CRM、SMS)version
:定义当前项目版本号.packaging
:定义该项目的打包方式
- Maven坐标的作用
- 使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成
三.创建Maven项目
-
Maven项目目录结构
├─ project │ └─ module │ └─ src │ ├─ pom.xml │ │ │ ├─ main │ │ ├─ java │ │ │ └─ com │ │ │ └─ sun │ │ │ └─ Demo.java │ │ │ │ │ └─ resources │ └─ test │ ├─ java │ │ └─ com │ │ └─ sun │ │ └─ DemoTest.java │ │ │ └─ resources
-
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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sun</groupId> <artifactId>project-java</artifactId> <version>1.0</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> </project>
配置文件详解请移步此处:http://t.csdn.cn/jB5Pz
感谢原文作者
-
Maven项目构建命令:
目录创建好后,接下来开始构建项目。
Maven构建命令使用
mvn
开头,后面添加功能参数,可以一次执行多个命令,使用空格分隔。命令 作用 mvn compile #编译,生成target文件 mvn clean #清理,删除target文件 mvn test #测试,执行单元测试,其中包含了compile命令 mvn package #打包,打包,其中包含了test命令 mvn install #安装到本地仓库,只能是jar包,其中包含了package命令
1.手动创建Maven工程
-
创建工程
mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name} -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
-
创建java工程
mvn archetype:generate -DgroupId=com.sun -DartifactId=java-project -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=0.0.1-snapshot -DinteractiveMode=false
-
创建web工程
mvn archetype:generate -DgroupId=com.sun -DartifactId=web-project -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot -DinteractiveMode=false
2.IDEA生成Maven工程
步骤:
- 新建空工程(maven-project),设置SDK
- settings搜索Maven,设置Maven home directory、settings.xml、maven-repo
- ProjetStructure ==> 新建Moudles
- 点击Maven(Create from archetype暂未勾选)==> Next
- GroupId和artifactId统称“坐标”,GroupId为项目组名称,通常为域名倒写,artifactId为项目唯一标识符,实际项目的名称,Version默认。
- 项目创建完后,检查项目结构,将其补充完整。Maven项目创建完成!
2.1 IDEA&Maven使用基本介绍
-
界面右侧的Maven项目管理目录
-
使用Maven导包(以junit为例)
-
打开pom.xml文件
-
<dependencies> <!--导入Junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
-
点击文件编辑框右上角的刷新按钮
-
-
尝试使用Maven项目构建命令:
-
编写Demo和DemoTest,双击执行“Test”,可以看到生成了target
-
双击执行“clean”,可以看到target消失。
-
-
若需要打断点调试?
2.2 IDEA使用骨架创建Maven工程
步骤:
- 新建空工程(maven-project),设置SDK
- settings搜索Maven,设置Maven home directory、settings.xml、maven-repo
- ProjetStructure ==> 新建Moudles
- 点击Maven,勾选reate from archetype,选择
org.apache.maven.archetypes:maven-archetype-quickstart
==> Next - GroupId和artifactId统称“坐标”,GroupId为项目组名称,通常为域名倒写,artifactId为项目唯一标识符,实际项目的名称,Version默认。
- 检查Maven、settings.xml、本地仓库的路径,无误点击Finish。
- 同上补全目录结构。
- 点击Maven,勾选reate from archetype,选择
3.IDEA使用骨架创建web项目
-
新建空工程(maven-project),设置SDK
-
settings搜索Maven,设置Maven home directory、settings.xml、maven-repo
-
ProjetStructure ==> 新建Moudles
-
点击Maven,勾选reate from archetype,选择
org.apache.maven.archetypes:maven-archetype-webapp
==> Next -
GroupId和artifactId统称“坐标”,GroupId为项目组名称,通常为域名倒写,artifactId为项目唯一标识符,实际项目的名称,Version默认。
-
检查Maven、settings.xml、本地仓库的路径,无误点击Finish。
-
补全目录结构。(web目录结构如下:)
-
3.1 安装tomcat插件启动web项目
-
在pom.xml中添加:
<!--构建--> <build> <!--设置插件--> <plugins> <!--具体的插件配置--> <plugin> <!-- https://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin --> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <!--设置端口--> <port>80</port> <!--设置虚拟路径--> <path>/</path> </configuration> </plugin> </plugins> </build>
-
刷新,点击右侧maven项目管理目录,可以看到web项目的Plugins目录下出现了tomcat插件,双击
tomcat7:tun
即可运行项目,进入浏览器访问控制台给出的路径即可访问到webapp目录下的文件。
4. pom文件基本解读
<?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/xsd/maven-4.0.0.xsd">
<!--指定pom的模型版本-->
<modelVersion>4.0.0</modelVersion>
<!--组织id-->
<groupId>com.sun</groupId>
<!--项目id-->
<artifactId>web01</artifactId>
<!--版本号:release 完成版 ,snapshot 开发版-->
<version>1.0-SNAPSHOT</version>
<!--打包方式:web项目打包为war,java工程打包为jar-->
<packaging>war</packaging>
<!--设置当前项目所需的依赖-->
<dependencies>
<!--具体的依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--构建-->
<build>
<!--设置插件-->
<plugins>
<!--具体的插件配置-->
<plugin>
<!-- https://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin -->
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!--设置端口-->
<port>80</port>
<!--设置虚拟路径-->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
四.依赖管理
1.添加依赖的基本方式
-
在
<dependencies>
标签中配置<dependency>
,<!--设置当前项目所需的依赖--> <dependencies> <!--具体的依赖--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> </dependency> </dependencies>
2.依赖传递
- 依赖具有传递性
- 直接传递:当前项目中通过依赖配置建立的依赖关系
- 间接传递:被资源的资源如果依赖其他资源,当前项目同样依赖其他资源。
- 特殊优先:当同级配置了相同资源的不同版本,后配置的会覆盖先配置的。
比如:在java01的配置文件中导入以下命令:
<dependencies
<dependency>
<groupId>com.sun</groupId>
<artifactId>web01</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
可以看到web01的pom文件里的依赖被导入进java01,而此时web01是察觉不到的。
3.可选依赖
当自己的某个依赖不想被下一级项目得到时,可以加入<optional>true</optional>
标签。当后面有项目导入自己时,将不导入添加此标签的依赖。
-
可选依赖指:主动对外隐藏当前所依赖的资源–不透明
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> <!--默认false,没有变化,改为true则隐藏--> <optional>true</optional> </dependency>
4.排除依赖
-
排除依赖指:主动断开依赖的资源,被排除的资源无需指定版本–不需要
<dependencies> <dependency> <groupId>com.sun</groupId> <artifactId>web01</artifactId> <version>1.0-SNAPSHOT</version> <exclusions> <!--排除web01的log4j的依赖--> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> </dependencies
5.依赖范围
依赖的jar可以通过
scope
标签设定其范围,默认情况可以在任何地方引用
-
作用范围:
- 主程序范围有效(main文件夹范围内)
- 测试程序范围有效(test文件夹范围内)
- 是否参与打包(package指令范围内)
scope 主代码 测试代码 打包 范例 compile (默认) Y Y Y log4j test Y junit provided Y Y servlet-api runtime Y jdbc -
依赖范围的传递性:
带有依赖范围的资源在进行传递时,作用范围将会受到影响。
五.生命周期与插件
1.Maven的生命周期
Maven构建生命周期描述的是一次构建过程经历了多少个事件。
Maven对项目构建的生命周期划分为3套:
- clean:清理工作
- pre-clean :执行一些需要在clean之前完成的工作
- clean :移除所有上一次构建生成的文件
- post-clean :执行一些需要在clean之后立刻完成的工作
- default:核心工作,如编译,测试,打包, 部署等
- validate(校验) 校验项目是否正确并且所有必要的信息可以完成项目的构建过程。
- initialize(初始化) 初始化构建状态,比如设置属性值。
- generate-sources(生成源代码) 生成包含在编译阶段中的任何源代码。
- process-sources(处理源代码) 处理源代码,比如说,过滤任意值。
- generate-resources(生成资源文件) 生成将会包含在项目包中的资源文件。
- process-resources (处理资源文件) 复制和处理资源到目标目录,为打包阶段最好准备。
- compile(编译) 编译项目的源代码。
- process-classes(处理类文件) 处理编译生成的文件,比如说对Java class文件做字节码改善优化。
- 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:产生报告,发布站点等。
- pre-site 执行一些需要在生成站点文档之前完成的工作
- site 生成项目的站点文档
- post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy 将生成的站点文档部署到特定的服务器上
2.插件
插件使用说明查看官网:https://maven.apache.org/plugins/index.html
- 插件与生命周期内的阶段绑定,在执行到对应生命周期是执行对应的插件功能;
- 默认maven在各个生命周期上绑定有预设的功能;
- 通过插件可以自定义其他功能。
示例: 使用source
插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<goals>
<!--对main的源码进行打包-->
<goal>jar</goal>
<!--对test的源码进行打包-->
<goal>test-jar</goal>
</goals>
<!--运行指定的阶段执行这个插件-->
<phase>generate-test-resources</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>