Maven
Maven
ruoxijunMaven 安装与使用
Maven 突出的几个特点:
- 有强制规定的指定文件存放指定文件,方便管理项目
 - jar 包的管理,使用 jar 包时我们不用再将整个 jar 包存放在项目中。maven 中有 jar 仓库,将需要的jar 包依赖(jar 的坐标)写入 maven 的配置内,它会帮我们找到需要的 jar 包
 
1. Maven 的安装
我们也回忆一下 Java jdk 和 Tomcat 的安装。(下载不用多说,见官网: https://maven.apache.org/)
几个安装都有的前奏:我的电脑右击 → 属性 → 高级系统设置 → 环境变量
安装后续:
新建系统变量 → 变量名MAVEN_HOME,变量值Maven解压的路径,确定 → 找到Path,编辑输入:%刚刚定义的变量名%\bin
打开 cmd 输入mvn -v查看是否成功。
jdk 和 Tomcat 的安装与此差别不大,不过 jdk 变量名为:JAVA_HOME,Tomact 变量名为:CATALINA_HOME。
2. Maven 全局配置文件(settings.xml)
以下配置都是在 Maven 安装文件夹下的 conf 文件夹下 settings.xml 文件中需要添加或修改的配置
设置仓库位置:
定义存放 jar 包的本地仓库(路径):
1  | // 建议先创建好该路径且路径以 repository 结尾  | 
设置阿里云中央仓库(镜像):
原镜像下载极慢可以用无法使用来形容,替换为国内的阿里云镜像。
1  | <mirrors>  | 
配置全局编译 jdk 版本:
在 <profiles></profiles> 标签中添加:
1  | <!-- 声明编译环境的 jdk 版本 -->  | 
3. Maven 项目结构与文件
项目标准目录结构:
- src/main/java:核心代码部分
 - src/main/resources:配置文件部分
 - src/test/java:测试代码部分
 - src/test/resources:测试配置文件
 - target:编译后自动生成存储 class 文件的文件夹
 - src/main/webapp:web(网页)有关文件(此部分是创建 web 项目才需要)
 
web项目webapp下必须有 WEB-INF目录,WEB-INF下必须有 web.xml 文件和classes(编译后),其中classes中存放的是编译好的class
Tomcat规定的必须这样建立目录才会Tomcat认为是web项目
pom.xml 文件:
Maven 工程配置文件:依赖管理,项目信息、运行环境信息(jdk、Tomcat 信息等)
基本样式:
1  | 
  | 
构建设置:
1  | <!-- 对项目构建进行设置 -->  | 
4. Maven 常用命令与生命周期
常用命令:
首先 cmd 进入 Maven 项目路径,在项目目录下使用如下指令
mvn compile:对 java 文件进行编译,并在 src 外创建了一个 target 目录,将编译文件存放在了里面。mvn test:测试文件夹下和主 Java 文件夹下的 java 文件都编译mvn package:打包,将所有 java 和 test 编译,再打包成指定文件(通过项目下的pom.xml文件packaging 标签决定打包类型)都放在 target 文件夹下mvn clean:清理编译的文件,target 文件夹将被删除mvn install:安装,编译 + 打包 + 将打包文件移到到本地仓库
Maven 生命周期(简化周期):
默认生命周期:验证(validate) → 编译(compile) → 测试(test) → 打包(package) → 验证(verify) → 安装(install) → 发布(deploy)
清理生命周期:清除项目编译信息(clean)
5. IDEA 配置 Maven:
file → settings方式表示本项目设置,当创建新项目时设置内容将重置。所以我们需要 配置新建项目 的设置如下图:

- 配置新建项目的 Maven 设置:
 

将 Maven → Runner 中下图选项勾选,否则容易出现导入的依赖在测试或运行时报依赖中的类不存在的错误,若还是出现此错误建议使用maven命令: mvn idea:idea 之后再运行。(目前已知idea2020.1常出现此错误)

- 此后新建的 Maven 项目都配置好了,但此项目配置并未改变。只需在 
file → settings中按步骤 2 同等配置即可。 - 同上图中 Skip Tests (跳过测试)选项打钩,问题缘由我在整合mybatis和spring时调用插入数据方法, SQL语句被执行了两遍 这主要是运行时测试调用了一次主项目再会调用一次。
 
6. Maven 依赖详解
了解 classpath:
- 简单的理解就是,项目编译好后形成的 
class文件所在的路径。 - Maven 工程会将 
src/main/java和src/main/resources文件夹下的文件编译后全部打包在classpath中。 
依赖范围(常用):
Maven 中添加的依赖编译后也会打包进
classpath中,而不同的阶段所需依赖不同。
此时我们可以给依赖添加范围限制,依赖中通过scope标签中添加限制指令方式规定依赖的范围。
| 限制指令 | 范围 | 
|---|---|
| compile | 未写 scope 标签时默认。编译,测试,运行都有效 | 
| test | 测试时有效 | 
| provided | 编译和测试有效 | 
| runtime | 测试和运行有效 | 
如下 junit 依赖只有测试才需要用到,所以使用 test 对齐加以限制:
1  | <dependencies>  | 
依赖传递:
- 依赖传递使我们不需要关注添加的依赖是否依赖了其它依赖。Maven会自动将所关联的依赖以自动传递的方式传递进来。
 - 最短路径优先:A依赖了B和D,B依赖了C和D,当A和B所依赖的D版本不同时,会选择A依赖的D作为最终依赖。
 - 先声明优先:项目中依赖了A和B它们同时依赖了C,当两个C版本不同时,取决于我们先依赖A还是B,谁先声明就最终依赖谁的C。
 
IDEA 中 Maven 常见错误(待改正):
- 本地运行错误(Javaweb):
 
在本地运行时 idea 中需要设置配置 Tomcat7 运行方式,在 pom.xml 中插入如下配置:
1  | <build>  | 
之后 maven 中输入 mvn tomcat7:run 运行。
- Servlet 中@WebServlet(“XXXX”)注解无效(javaweb):
 
打开 web.xml 检查 web-app 标签中的两个属性,①version 是否大于 3.0,②metadata-complete 是否为 false,或直接将 web.xml 中 web-app 头标签替换为如下设置:
1  | <web-app  | 
- maven 的程序测试运行必须检查是否有 
Junit包:
pom.xml 中: 
1  | <dependency>  | 

