03-Maven详解
1. 简介
- Maven 是一个项目管理工具,可以对 Java 项目进行自动化的构建和依赖管理。在JavaWeb开发中,可以极大地方便导入jar包
- Maven的高级之处在于:帮助导入所需jar包所依赖的所有jar包
- Maven的核心思想是:约定大于配置。即:Maven会规定好该如何去编写Java代码(eg:项目的目录结构等),必须要按照这个规范来,不要去违反
2. 下载安装
- 官网 下载Maven安装包
apache-maven-3.8.6-bin.zip
- 将
apache-maven-3.8.6-bin.zip
解压的安装目录下即可直接使用
3. 目录分析
4. 环境变量
- 在《高级系统设置》中配置《环境变量》的《系统变量中》进行配置:
- 环境变量配置后,在
cmd
窗口输入如下指令:mvn -version
,,检验是否配置成功。若配置成功则返回Maven的版本信息
5. 配置文件
- 在maven安装目录下
conf
目录下修改settings.xml
配置文件。
1. 阿里云镜像
- 为了加速下载jar包,国内建议使用阿里云的镜像。在
<mirrors>……</mirrors>
中添加:
<!-- 阿里云镜像 -->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
- 注:①一定不要配置已经失效的镜像,否则会导致导包有问题,②可以在此配置多个镜像。
2. 本地仓库
- 在Maven安装目录下,新建一个
maven-repository
文件夹用来存放项目依赖的jar
包
<!-- 本地仓库 -->
<localRepository>D:\Environment\apache-maven-3.8.6\maven-repository</localRepository>
- 注:
settings.xml
配置文件中默认的本地仓库地址:${user.home}/.m2/repository
,如下图所示:
6. IDEA创建Maven项目
1. Maven创建Web项目
- 启动IDEA,使用Maven的webapp模板创建一个MavenWeb项目
- 填写项目基本信息(传说中的Maven GAV)
- 配置Maven的安装目录、配置文件、本地仓库目录信息后,点击
Finish
按钮,完成MavenWeb项目创建。此时,Maven会自动从阿里云上导入大量jar
包到本地仓库
- 注:
Bundled(Maven 3)
是IDEA默认自带的Maven,它的可配置信息非常少。选择的是自己下载安装的Maven
- 等待项目初始化完毕,直至消息窗口出现
BUILD SUCCESS
,表明项目创建成功
- 查看Maven本地仓库,会发现里面已经下载了许多
jar
包 - 点击
File
下的Settings
菜单,检查项目中maven的相关配置是否正常
- 注: IDEA在项目自动创建完成后,
Maven home directory
经常会指向IDEA默认的Maven目录
Maven
的高级配置:建议选中《自动导入源码》选项。
- MavenWeb项目目录
- 注: 一般不直接使用Maven的项目模板创建Web项目,而是将普通的Maven项目手动转化成Web项目
2. 普通Maven项目
- 在上述MavenWeb项目打开的基础上,点击
File
→New Projects Setings
→Settings for New Projects
菜单修改idea的全局默认配置
- 对Maven的安装目录、配置文件、本地仓库进行全局设置
- 点击
File
→New
→Project
菜单,使用Maven创建一个普通的maven项目。不选择使用模板,直接点击next
按钮
- 填写项目基本信息(GAV)
- 点击
Finish
按钮,并选择在新窗口中打开,便完成普通Maven项目创建
- 使用IDEA创建的普通Maven项目目录
3. IDEA全局配置、项目配置
- IDEA中的
File
→New Projects Setings
→Settings for New Projects
菜单 - IDEA欢迎界面下方的
Configure
→Setings
菜单均为全局配置,对所有的新项目均有效 - IDEA中的
File
→Setings
菜单是项目配置,仅对当前打开的项目有效
7. IDEA标记文件夹
- IDEA中不同颜色的文件夹用于存放不同类型的文件。对于新建的文件夹,两种方法进行标记
- 通过右键
mark directory as
菜单直接对文件夹进行逐一标记
- 通过右键
File
→Project Structure
(项目结构配置)菜单对所有文件夹进行统一标记
- 注:
target
目录是IDEA
默认的编译路径,用来存放项目的:文件和目录、jar包、war包、class文件等
8. Maven侧边栏的使用
Maven的常用命令行操作(双击即可执行):
cmd | 介绍 |
---|---|
clean(清理) | 对项目进行清理,删除target目录下编译的内容 |
compile(编译) | 编译项目源代码 |
test(测试) | 对项目进行运行测试 |
package(打包) | 打包文件并存放到项目的target 目录下,打包好的文件通常都是编译后的.class 文件 |
install(安装) | 在本地仓库生成仓库的安装包,可供其他项目引用,同时打包后的文件放到项目的target 目录下 |
deploy(部署) | 在整合、发布环境下执行,将最终版本的包上传到远程的repository ,使得其他的开发者或工程可以共享 |
9. pom.xml
pom.xml
是Maven的核心配置文件
<?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>
<!-- 这就是我们创建项目时配置的GAV -->
<groupId>com.atangbiji</groupId><!-- 项目组织的唯一标识符 -->
<artifactId>javaWeb-01-maven</artifactId><!-- 项目的唯一标识符 -->
<version>1.0-SNAPSHOT</version><!-- 版本号 -->
<!-- 项目的打包方式:1. jar包:Java应用 2.war包:JavaWeb应用 -->
<packaging>war</packaging>
<!-- 项目的名称, Maven产生的文档用(了解) -->
<name>javaWeb-01-maven Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<!-- 项目主页的URL, Maven产生的文档用(了解) -->
<url>http://www.example.com</url>
<!-- 属性 -->
<properties>
<!-- 项目的默认构建编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 编译器版本 -->
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<!-- 项目依赖(重点) -->
<!-- Maven的高级之处在于:它会帮助我们导入我们所需jar包所依赖的所有jar包 -->
<dependencies>
<!-- 具体依赖的jar包配置文件 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<!-- 注:mybatis、redis、spring、SpringMVC等内容所依赖的jar包均在此配置 -->
</dependencies>
<!-- 项目构建用到的插件 -->
<build>
<!-- 在此对target目录下mvn clean package打的jar包进行重命名 -->
<finalName>javaWeb-01-maven</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
- 注1:
dependencies
(项目依赖)是关注的重点,与Maven窗口中的dependencies
目录和项目窗口中的External Libraries
是对应的
- 注2:Maven的约定大于配置思想,可能会遇到配置文件(eg:
*.xml
写在了项目中的Java
目录下)无法被导出或无法生效的问题。解决方法:在pom.xml
的<build>……</build>
中配置resources
,修改Maven约定的过滤条件,来防止资源导出失败
<!-- 在build中配置resources,防止资源导出失败的问题 -->
<build>
<resources>
<!-- 选择需要导出资源的路径,可以选择多个 -->
<resource>
<directory>src/main/resources</directory>
<!-- 写入需要导出的什么类型的文件 -->
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!-- 不去过滤这些文件 -->
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!-- 不去过滤这些文件 -->
<filtering>false</filtering>
</resource>
</resources>
</build>
10. 导包dependencies机制
1. 依赖机制介绍
Maven
仓库是通过dependency
(依赖)机制进行jar
包导入的dependency
机制是通过在配置文件pom.xml
中的手动添加…
标签来实现的。 具体代码由Maven在线仓库处获得
- 在 Maven的在线仓库 中搜索目标
jar
包
- 选择合适的版本(一般选使用者较多的版本)
- 复制Maven的
dependency
依赖代码
- 将代码粘贴到
pom.xml
文件的<dependencies> ... </dependencies>
标签中
- 重新加载Maven项目。Maven便会自动下载相关依赖包。
pom.xml
文件中的dependencies
与Maven
窗口中的dependencies
目录和项目窗口中的External Libraries
是对应的
2. 项目jar包结构树
- 点击Maven依赖结构树生成按钮,会生成该项目中各依赖包之间的关系树
99. bug
1. Maven、JDK版本匹配问题
1. 现象描述
MavenWeb
项目和Maven
普通项目创建成功,当使用Maven编译/运行
该项目时会发现:Maven虽然会把依赖包导入到本地仓库中,也不报错,但在左侧项目栏的External Libraries
目录下始终只有JDK的包,右侧Maven窗口中也无法生成该项目的Plugins
和Dependencies
组件包
2. 问题分析
- 在
Maven
窗口中右键打开Maven
的配置文件,此时会发现配置文件中有两个错误
- 点击
Help
→Show Log in Explorer
菜单打开IDEA日志文件idea.log
(最新的日志在最下面)
- 查看IDEA日志文件发现有函数找不到
- 经分析,是Maven版本过高,和JDK版本不匹配造成的
3. 解决方法
将Maven版本更换为maven-3.6.1
,让Maven版本与JDK1.8
版本相匹配(IDEA2020.2
)
- 重新下载安装
apache-maven-3.6.1
- 重新配置Maven环境变量
- 重新配置阿里云镜像和本地仓库
- 重新对Maven的安装目录、配置文件和本地仓库进行全局设置
- 通过
File
→Invalidate Caches/Restart
菜单,清除缓存并重启项目
- 此时便可以正常使用
Maven编译/运行
项目了。左侧项目栏的External Libraries
目录下除了JDK的包外会生成Maven导入的依赖包,右侧Maven窗口中也会生成该项目的Plugins
和Dependencies
组件包