# Maven
[TOC]
## 导学
Maven是一个项目管理工具,在之前的课程中,我们一个项目使用了多个jar包,这对于我们来说是比较麻烦的,不同的jar包之间可能相互依赖,也有可能产生冲突。在这种情况下,如何去保证我们的jar包使用正确呢?Maven就能极好的解决这个问题。
在本节课程中,需要掌握Maven的核心特性,依赖管理以及打包方式。
## Maven介绍
**Maven介绍:**
* Maven是项目管理工具,对软件项目提供构建和依赖管理
* Maven是Apache下的Java开源工具
* Maven是Java项目提供了统一的管理方式,已成为业界标准
>[warning]日常开发痛点:
>1. 不同的IDE之间创建的项目结构不同,是不能互通的,eclipse中创建的项目就不能拿到idea中运行。
>2. 一个Java软件需要多种Jar包支持,到处下载很麻烦。
>3. 一个Java项目打包无外乎jar包与war包,如何采用一个更统一更方便的方式呢?
**Maven核心特性:**
* 项目设置遵循统一的规则,保证不同开发环境的兼容性
* 强大的依赖管理,项目依赖组件自动下载、自动更新
* 可扩展的插件机制,使用简单,功能丰富
## maven的安装与配置
**首先需要安装和配置好jdk!**
maven是由Java所编写的一款软件,所以需要先安装好jdk。
下载地址:[http://maven.apache.org/](http://maven.apache.org/)
![](https://img.kancloud.cn/9c/93/9c93936b199afbfc7f8b98322bcc88ba_439x36.png)
下载完成后,解压。并将bin目录添加到系统环境变量path中。
打开cmd,输入`mvn -version`,出现如下画面就成功了。
![](https://img.kancloud.cn/28/19/2819c19130f0a269500334977897f90e_993x519.png)
**修改默认仓库**
maven默认将C盘作为下载Jar包后存放的仓库,为了节约C盘空间需要修改maven的仓库。
找到conf文件夹下的conf目录,打开setting.xml文件
![](https://img.kancloud.cn/07/8e/078e62b015442e7bb69554b720d8f68a_1362x620.png)
改为:
![](https://img.kancloud.cn/78/b5/78b5acaf9768889491f81e2a4da630eb_1362x620.png)
验证:
![](https://img.kancloud.cn/d0/48/d0488a467fbbc35d2321be00807967df_993x519.png)
**修改远程仓库**
远程仓库指的是maven从何处下载jar包,因为默认采用的是国外的地址,下载速度较慢,所以需要设置为国内阿里云的镜像仓库。
~~~
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
</mirrors>
~~~
![](https://img.kancloud.cn/f2/8c/f28cd5e45bf27579c32829b50f7cad81_1362x620.png)
**整合maven到eclipse和idea**
![](https://img.kancloud.cn/14/95/14959ad40bb595263b35164ab7807b87_828x342.png)
打开preferences
![](https://img.kancloud.cn/59/8d/598dbd694130b53c526501863f0a0e81_658x562.png)
![](https://img.kancloud.cn/e7/d0/e7d0c2b167db747049f4f3eaae0a99c8_525x454.png)
![](https://img.kancloud.cn/eb/72/eb72e49136dcc16544c218628804aa9b_658x562.png)
关于idea集成maven,可以打开File-Settings-Build,Execution,Deployment-Build Tools-Maven选项中设置,设置步骤类似。
也可以使用idea自带的maven插件,只需要打开该对应插件中的setting.xml配置本地仓库和镜像中央仓库。
## 创建maven项目
![](https://img.kancloud.cn/23/1f/231ff0ff2eca6957a68bd44dcb988834_525x500.png)
![](https://img.kancloud.cn/ab/77/ab777bd52d9bea7e3b3ad7957b3aa278_650x584.png)
![](https://img.kancloud.cn/d9/40/d9405ac85fc2adf21f3aac7b2e345b08_898x386.png)
![](https://img.kancloud.cn/3f/d0/3fd0878e93c0b328e2c7eb9373bdd4ad_650x584.png)
![](https://img.kancloud.cn/26/8f/268fbf1df74210cadb062aa97def560d_1366x746.png)
![](https://img.kancloud.cn/5e/a2/5ea25db622be7e9c635122f399c0101e_957x481.png)
## maven依赖管理
**依赖管理:**
1. Maven利用dependency(依赖)自动下载、管理第三方jar;
2. 在pom.xml文件中配置项目依赖的第三方组件
3. maven自动将依赖从远程仓库下载至本地仓库,并在工程中引用
![](https://img.kancloud.cn/60/3d/603db93b6dd36984b2c22c2acd8632f0_657x370.png)
可以在该pom.xml中添加一个dependencies的根标签。
并去[https://search.maven.org](https://search.maven.org/)中查找对应jar包的依赖
比如,我现在添加该依赖就可以下载对应的mysql连接驱动。
~~~
<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.dodoke</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
</dependencies>
</project>
~~~
比较复杂的组件由多个jar包组合,maven对组件进行深入解析,对所有jar包进行下载。
## 本地仓库与中央仓库
在我们使用maven之前,其实我们已经去设置了中央仓库为阿里云的镜像仓库,而且也设置了本地仓库为c盘之外的其他盘符。
那么,究竟什么是maven的中央仓库与本地仓库呢?
![](https://img.kancloud.cn/3d/a6/3da6b7c9983cb9c6a8db20c79f5c7795_748x187.png)
当我们使用maven的时候,我们可以通过pom.xml下载对应的jar包。其实maven会经历如下的步骤:
1. 解析pom.xml,分析要下载的内容
2. 查看本地仓库,查找是否已经下载过该jar包
3. 如果没有该jar包,将前往中央仓库下载该jar包到本地仓库
4. 在下载好以后或本地存在该jar,则自动的将该jar包添加到项目中
其实在之前的设置中,我们设置了maven默认下载的阿里云提供的中央仓库中保存的jar包。但是这在我们正式开发中不怎么建议。
通常我们会设置单独某个项目采用私服(代理服务器,保存有备份的jar包,最有名的就是阿里云的私服)的仓库,比如我们会在pom.xml中设置仓库地址。
~~~
<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.dodoke</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun</name>
<!-- 可能阿里云仓库的地址会发生变化,需要查找最新的地址 -->
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
</dependencies>
</project>
~~~
这样就可以设置单个项目的jar下载,优先从阿里云私服下载,如果私服没有,才从maven官网下载。
## 项目打包
Maven可以将项目打包成jar和war包,Maven项目打包是通过Plugins(插件)来实现的,Maven输出Jar包的插件叫做`maven-assembly-plugin`
~~~xml
<!-- 与dependencies节点同级 -->
<build>
<!-- 打jar包的配置插件 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<!-- 尽管已经有更高版本的插件,但是2.5.5是一个经典版本 -->
<version>2.5.5</version>
<!-- 配置 -->
<configuration>
<!-- 指定入口类 即带有main方法的类-->
<archive>
<manifest>
<mainClass>com.dodoke.maven.JDBCTest</mainClass>
</manifest>
</archive>
<!-- 额外参数 -->
<descriptorRefs>
<!-- all in one 在打包时将所有引用的jar(包括非自己写的类)合并到输出的jar文件中 -->
<descriptorRef>
jar-with-dependencies
</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
~~~
![](https://img.kancloud.cn/9e/09/9e096cd50e1a56b53139c2940492bca6_1366x746.png)
**如何运行,生成jar包**
1. 选择run菜单中的Run Configurations命令-选择Maven build创建新运行命令
![](https://img.kancloud.cn/55/65/556570d0307446711219409d30416453_890x732.png)
![](https://img.kancloud.cn/11/49/114939df3c7c3ba6f3af44a61362bc26_890x732.png)
2. 运行新命令
![](https://img.kancloud.cn/9e/dd/9edd6ad869592394e6e5e233e3026881_1366x746.png)
3. 生成的jar包
![](https://img.kancloud.cn/36/f3/36f391138725ac92d09ed364dfa83f36_1206x622.png)
## maven创建Java web项目
创建Java web,其实对于maven来说,步骤和创建普通Java项目一样。
但是要注意修改一下maven项目使用的jdk和编译级别(默认使用jdk 1.5)
![](https://img.kancloud.cn/ce/6a/ce6a897353d27e03d15f4cf8eec016cd_359x582.png)
项目上右键选择properties,选择Java compiler
![](https://img.kancloud.cn/f7/44/f744ae409c66812a7aded10f32ed876f_840x721.png)
创建保存网页的文件夹
![](https://img.kancloud.cn/9e/fc/9efcafe8540b3d293089f5eae9e38174_351x290.png)
**这时前期的准备工作就已经完成了。**
接下来,需要将普通工程转变为Java web工程,同样项目上右键选择properties
![](https://img.kancloud.cn/b4/20/b4208512ae4807edb1ace85b9604f09e_726x738.png)
![](https://img.kancloud.cn/2d/98/2d98f435fa1d14c1b93984d3192b9b04_1007x738.png)
![](https://img.kancloud.cn/f4/4f/f44f576a6b078dce8622a5c36464e811_525x445.png)
![](https://img.kancloud.cn/2f/bc/2fbc9b15155080ac5269024fa440e52b_359x582.png)
## web工程打包
~~~
<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.dodoke</groupId>
<artifactId>maven</artifactId>
<version>1.0.0-SNAPSHOT</version>
<!-- packaging代表输出格式,只有jar和war两种格式,如果没写,默认输出jar包 -->
<packaging>war</packaging>
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun</name>
<!-- 可能阿里云仓库的地址会发生变化,需要查找最新的地址 -->
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<build>
<!-- 定义输出的war包的文件名 -->
<finalName>maven-web</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven.war.plugis</artifactId>
<version>3.2.2</version>
</plugin>
</plugins>
</build>
</project>
~~~
同样新增创建一个新的打包运行命令:
![](https://img.kancloud.cn/a7/a6/a7a62d6e14f4849553ac4c39a5f802b4_890x732.png)
## maven常用命令
![](https://img.kancloud.cn/df/cd/dfcdc3f8b0b9dfb1e1b98800996feee2_985x404.png)
之前我们都是在eclipse中使用maven,其实我们也可以通过控制台创建maven项目。
本节内容仅做了解
## idea中使用maven
**普通Java项目**
![](https://img.kancloud.cn/8e/ff/8eff4aa67b3108237dc6d6712d8ed21b_1366x738.png)
![](https://img.kancloud.cn/9e/73/9e7331bdd9fc40cd4b0284fd4aca42ee_1366x738.png)
![](https://img.kancloud.cn/d5/ff/d5ff484c105aa3443a0939ce6da7e2b3_1366x746.png)
**创建Java Web项目**
[https://blog.csdn.net/qq\_37856300/article/details/85776785](https://blog.csdn.net/qq_37856300/article/details/85776785)