Maven最全使用指南,都在这里了。
张三最近做了个项目,但是这个项目需要 30 多个 jar包。他只能从网上一个个去下载,下载完还要一个一个手动导入。
好不容易搞完了,结果却发现有些 jar 包版本竟然不兼容,搞了一天也没搞好。真的是“豆腐拌腐乳-越搞越糊涂!。”
经过一个多月的疯狂加班,这个项目终于做好了,张三部署好测试环境之后就交给测试人员李四了。
张三想着终于能好好摸鱼了,谁知道李四工作特认真,一会就测出来一堆 bug。
张三只能立即去更改 bug,改完还要手动编译、打包项目。最多的时候一天打包了十几次,可把张三累坏了。
那如何避免上面的场景呢?Maven 闪亮登场。
1. Maven 简介
Maven 是 Apache 软件基金会旗下一款自动化构建工具,专注于 Java 平台的项目构建和依赖管理。
简单点说 Maven 就是一个好用的工具。我们以前做项目需要自己到网上找 jar 包,而用了 Maven 之后,我们只需要配置一下依赖的坐标,它会自动将 jar 包下载到我们电脑硬盘的某一个目录下。
除了管理 jar 包,它还能帮我们干很多事情:
- 1.自动下载需要的 jar 包,管理 jar 包的版本以及它们之间的依赖关系。
- 2.帮你编译程序
- 3.帮你打包程序
- 4.帮你部署程序
- 5.帮你管理项目中各个模块的关系
名词解释:
依赖: 例如我们的项目中需要 servlet.jar,这个 jar 包就可以叫做依赖,或者说项目依赖 servlet.jar。我们在导入 a.jar 的时候发现还需要导入 b.jar,说明 a.jar 依赖 b.jar。
项目构建: 项目构建描述的是代码的编译、运行、打包、部署等一系列过程。
- 1.项目清理:清理之前编译的代码。
- 2.编译:将程序源代码编译为虚拟机可执行的代码,也就是 class 文件。maven 可以帮我们批量编译一堆代码。
- 3.测试:maven 可以执行测试程序代码,验证你的功能是否正确。
- 4.打包:将所有的 class 文件、配置文件等资源放到一个压缩文件中。 对于 java 程序,压缩文件是 xx.jar,对于 web 应用,压缩文件扩展名是 xx.war。
- 5.安装:将 jar 文件或者 war 文件安装到本机仓库中。
- 6.部署:将程序部署到服务器上,我们可以通过网址进行访问。
2. Maven 的安装和配置
2.1 下载安装
注: Maven 是使用 Java 开发的,所以必须先安装配置 JDK。
Maven 官网:
https://archive.apache.org/dist/maven/maven-3/
将下载完的压缩包解压到一个非中文无空格的目录下:
2.2 配置环境变量
1.新增变量
变量名:MAVEN_HOME
变量值:maven 的安装路径
2.修改 path
增加变量值:%MAVEN_HOME%\bin
3.验证
同时按下 window+R 键,输入 cmd,按下回车键。 然后命令行输入: mvn -v
4.修改配置本地仓库
为什么要修改本地仓库?
因为 Maven 默认的本地仓库在C/用户/.m2 文件夹里,随着下载的 jar 包越来越多,系统盘会越来越满,电脑会越来越卡,所以建议在 C 盘之外建一个本地仓库。
打开 Maven 的核心配置文件 settings.xml
添加如下标签:
<localRepository>你的repository目录</localRepository>
例如:
<localRepository>D:\CodeSoftware\Maven\repository</localRepository>
5.配置阿里云镜像下载地址
因为国外远程仓库下载 jar 包速度慢,国内阿里云下载速度快。
在 setting.xml 文件里面添加:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>;
<mirrorOf>central</mirrorOf>
</mirror>
完整的 setting.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>D:\CodeSoftware\maven\repository</localRepository>
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>
3. IDEA 中使用 Maven
3.1 IDEA 中配置 Maven
File -> Settings:
3.2 创建 JAVA 工程
File -> New -> Project
3.3 创建 WEB 工程
File -> New -> Project
这里我们需要使用 Maven 自带的 web 项目模板。
因为使用 Maven 自带的 web 项目模板创建的项目目录不全,所以需要在 main 目录下创建 java 和 resources 目录。
3.4 使用 Maven 工具
当我们在 IDEA 中配置完 Maven 工具之后,IDEA 窗口的右边会出现 Maven 的按钮:
Maven 窗口图标的作用:
4. Maven 的核心概念
4.1 目录结构
maven 中规定的目录结构:
- 1.sms:项目名,也是项目的根路径
- 2.src:项目的源代码
- 3.main:主程序
- 4.java:项目源代码
- 5.rsources:主程序的配置文件
- 6.test:测试代码
- 7.rsources:测试代码的配置文件
- 8.pom.xml:Maven 项目的配置文件
4.2 pom 文件
pom 全称:Project Object Model,即项目对象模型。
Maven 把一个项目的结构和内容抽象成一个模型,在 pom.xml 文件中进行声明和描述。所以说 pom.xml 是 Maven 的核心。
完整的 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">
<parent>
<artifactId>spring-boot-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.2.5.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxl</groupId>
<artifactId>sms</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<modules>
<module></module>
</modules>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
</dependencies>
<build>
<plugins>
</plugins>
</build>
</project>
- 1.modelVersion: Maven 模型的版本,默认配置。
- 2.groupId:公司或者是组织的id,一般是公司域名的倒写,例如 com.alibaba。或者是公司域名+项目名的倒写,例如 com.alibaba.taotao。
- 3.artifactId:项目名称。
- 4.version:项目的版本号,通常使用三位数字标识,例如 2.2.5。如果项目还在开发中,通常在版本后加上 SNAPSHOT。如果项目很稳定,已经发布,一般会在版本后加上 RELEASE。
- 5.parent:用来声明要继承的父工程的 pom 配置。
- 6.packaging:项目打包的类型,默认是 jar。一般 java 程序打包成 jar,web 程序打包成 war。
- 7.properties:用来定义项目中一些配置,例如编码格式等。
- 8.dependencies:在 Maven 项目中,我们需要的 jar 包叫做依赖。我们在 dependencies 标签中配置依赖,依赖的配置是通过坐标来表示。坐标就是 groupId、artifactId、version 的组合。
- 9.modules:在 Maven 多模块开发中,设置本模块和其他模块的关系。
- 10.build:build 主要包含和项目构建相关的配置,例如设置编译插件的 jdk 版本。
4.3 依赖
在 Maven 项目中,我们需要的 jar 包叫做依赖。我们在 dependencies 标签中配置依赖的坐标之后,Maven 会根据依赖的坐标自动到本地仓库中查找,找到之后会自动引入到我们的项目中。
如果没有找到,Maven 会根据依赖的坐标从中央仓库将 jar 包下载到本地仓库中。
依赖需要在 dependency 标签里面书写,它包含 groupId、artifactId、version。例如:
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
</dependencies>
其实我们可以将依赖的坐标(dependency)当成是 jar 包的身份证,你在 pom.xml 中配置了依赖坐标,Maven 会根据这个身份证先去本机的 repository 目录下找 jar 包,如果找不到就去中央仓库将该 jar 包下载到你电脑的 repository 文件夹下,然后引入到项目中。
4.4 依赖的范围
我们在配置依赖时,其实还有一个依赖的范围 scope:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
<scope>compile</scope>
</dependency>
依赖的范围:compile、test、provided,默认是 compile。
例如 junit 依赖的范围就是 test,只参与测试。 而 servlet 依赖的范围是 provided,不参与打包和部署,因为 tomcat 服务器已经包含 servlet 的 jar 包。
4.5 坐标
Maven 把任何一个 jar 包都作为仓库中的一个项目进行管理,用三个向量组成的坐标来表示。坐标在仓库中可以表示唯一的 Maven 项目。
坐标就是 groupId、artifactId、version 的组合。groupId、artifactId 和 version 决定项目在仓库中的路径,artifactId 和 version 决定 jar 包的名称。
4.6 仓库
我们在 pom.xml 文件里面配置了依赖(jar包)的坐标,Maven 就能自动将 jar 包加载到项目中,它从哪儿搞到的 jar 包?Maven 的仓库。
我们都知道仓库是用来存放东西的,那 Maven 仓库用来存放什么?jar 包。
根据仓库存储的位置,我们把 Maven 仓库分为本地仓库和远程仓库。
本地仓库: 就是把 jar 包存放到你电脑上的一个文件夹下面,Maven 默认将 jar 包放到 C 盘的 .m2\repository 目录中。
远程仓库: 远程仓库又分为中央仓库、中央仓库的镜像、私服。
中央仓库包含所有通用的 jar 包,所有的程序员都能联网从中央仓库中获取 jar 包。中央仓库是 maven 默认的远程仓库,是最权威的。
中央仓库官网地址:
https://mvnrepository.com/
我们需要的所有的依赖都能在上面找到:
中央仓库的镜像: 亚洲、欧洲等每个洲都有若干的服务器,为中央仓库分担流量。减轻中央仓库的访问压力。所在洲的用户首先访问的是本洲的镜像服务器。上面我们配置的阿里云的 Maven 仓库镜像就属于中央仓库的镜像。
私服: 在局域网环境中部署的服务器,一般公司中会使用私服。
4.7 Maven 生命周期
Maven 的生命周期:就是 Maven 构建项目的过程,清理,编译,测试,报告,打包,安装,部署。
5. Maven 常用设置
5.1 定义全局变量
我们可以在 properties 定义全局变量,然后使用 ${变量名} 统一配置依赖的坐标。例如:
<properties>
<mysql.version>8.0.27</mysql.version>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
5.2 指定资源位置
src 目录中所有的 java 文件会分别在 comile 和 test-comiple 阶段被编译,但是这两个目录中的其他文件都会被忽略掉,如果需要把 src 目录下的其他文件作为打包的 jar 包的一部分,需要指定资源文件位置。
我们需要在 build 标签中指定那个资源的位置:
<build>
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
6. Maven 管理多模块应用
有时候我们会把一个项目分为多个模块,例如 common 模块主要包含一些工具类、常量信息等,service 模块主要用来处理业务,web 模块主要是控制器。
Maven 可以很方便地帮我们维护不同模块之间的关系。
6.1 使用 Maven 创建多模块项目
创建 Maven 父工程 sms
File -> new -> Module -> Maven
删除父工程 src 目录,pom 文件打包方式改为 pom
创建子工程 sms-web
File -> new -> Module -> Maven
创建子工程 sms-service
File -> new -> Module -> Maven
创建子工程 sms-dao
File -> new -> Module -> Maven
创建子工程 sms-model
File -> new -> Module -> Maven
创建子工程 sms-common
File -> new -> Module -> Maven
父工程 pom 文件:
6.2 引入依赖
1. 模块之间的依赖:
我们都知道依赖是会传递的,例如 B 模块引入了 A 模块,C 模块引入了 B 模块,就相当于 C 模块引入了 A 模块。
而在项目中我们知道 service 依赖 dao,controller 依赖 service。dao、service、controller 又都依赖 model 实体类,dao 和 service 又都需要用到 common 。但是我们不可能在他们三个中都添加 model 的依赖,在 dao 和 service 中都添加 common 的依赖。
根据依赖的传递性,我们可以在 common 模块中添加 model 的依赖,在 dao 中添加 common 的依赖,在 service 中添加 dao 的依赖,在 controller 中添加 service 的依赖。
sms-common 的 pom.xml:
sms-dao 的 pom.xml:
sms-service 的 pom.xml:
sms-web 的 pom.xml:
然后再用 Maven 工具打包、安装之后,各模块之间就可以相互调用了。
2. 第三方依赖:
我们一般会在父工程的 pom.xml 中使用 dependencyManagement 标签来管理依赖的版本。子模块中如果用到了这个依赖,只需要在 dependencies 标签中引入即可。
通过上面的图片我们知道,dependencyManagement 标签并不能真正引用依赖,它只是规定了依赖的版本,便于我们统一管理。
假如 sms-web 模块需要使用 commons-io 的依赖,我们只需要在它的 pom.xml 文件的 dependencies 依赖中加入该依赖的坐标即可。
因为父模块中通过 properties 标签规定了依赖的版本,所以子模块中不需要再加入版本号,这样方便统一管理。
转载自:https://juejin.cn/post/7051407711308627981