一、什么是Maven?
Maven 翻译为"专家"、"内行",是 Apache 下的一个纯 Java开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。 Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。 Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。 Maven 曾是 Jakarta项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。
二、 Maven的常见概念
它是一个Apache的开源项目,主要服务于基于Java平台的项目构建、依赖管理和项目信息管理,为了不重复造轮子。
例如:两个项目A B,项目A需要依赖一些jar包,项目B也需要依赖这些jar包,那么此时如果都把jar包引入到项目中,就是在重复造轮子,我们应该把这些所有的jar包放到一个地方,需要用的时候过去取即可。
在使用前需要先理解 Maven 的常见概念:构建、坐标、仓库、私服、镜像
2.1 构建
2.1.1 什么是构建
构建并不是创建,创建一个工程并不等于构建一个项目。要了解构建的含义我们应该由浅入深的从 以下三个层面来看:
- 纯 Java 代码 大家都知道,我们 Java 是一门编译型语言,.java 扩展名的源文件需要编译成.class 扩展名的字节码文件才能够执行。所以编写任何 Java 代码想要执行的话就必须经过编译得到对应的.class 文件。
- Web 工程 当我们需要通过浏览器访问 Java 程序时就必须将包含 Java 程序的 Web 工程编译的结果“拿”到服务器上的指定目录下,并启动服务器才行。这个“拿”的过程我们叫部署。
- 实际项目 在实际项目中整合第三方框架,Web 工程中除了 Java 程序和 JSP 页面、图片等静态资源之外,还包括第三方框架的 jar 包以及各种各样的配置文件。所有这些资源都必须按照正确的目录结构部署到服务器上,项目才可以运行。
所以综上所述:构建就是以我们编写的 Java 代码、框架配置文件、国际化等其他资源文件、JSP 页 面和图片等静态资源作为“原材料”,去“生产”出一个可以运行的项目的过程。那么项目构建的全过程中都包含哪些环节呢?
2.1.2 构建过程的几个环节
- 清理:删除以前的编译结果,为重新编译做好准备。
- 编译:将 Java源程序编译为字节码文件。
- 测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
- 报告:在每一次测试后以标准的格式记录和展示测试结果。
- 打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web工程对应 war 包。
- 安装:在 Maven 环境下特指将打包的结果——jar 包或 war 包安装到本地仓库中。
- 部署:将打包的结果部署到远程仓库或将 war 包部署到服务器上运行。
2.2 Maven的约定目录结构
约定的目录结构对于Maven实现自动化构建而言是必不可少的一环,就拿自动化编译来说,Maven必须能找到Java源文件,下一步才能编译,而编译之后也必须有一个准确的位置保持编译得到的字节码文件。 我们在开发中如果需要让第三方工具或框架知道我们自己创建的资源在哪,那么基本上就是两种方式:
- 通过配置的形式明确告诉它
- 基于第三方工具或框架约定
现在JavaEE开发领域普遍认同一个观点:约定>配置>编码。意思就是能用配置解决的问题就不编码。能基于约定的就不进行配置。而Maven正是因为制定了特定文件保存的目录才能够对我们的Java工程进行自动化构建
2.3 Maven坐标
在Maven世界中任何一个依赖、插件或者项目构建的输出都可以称为构件,任何一个构件都有一个坐标作为唯一的标识。
这个坐标就是:groupId、artifactId、version;
- groupId:公司或组织的域名倒序+当前项目名称
- artifactId:当前项目的模块名称
- version:当前模块的版本
<groupId>com.queen.web</groupId>
<artifactId>queen-web</artifactId>
<version>1.0.0-SNAPSHOT</version>
根据这个坐标就可以定义其在仓库的唯一存储路径,那么就可以在项目中引用。
将groupId、artifactId、version三个连起来 com.queen.web+queen-web+1.0.0-SNAPSHOT 以连接起来的字符串作为目录结构去仓库中查找
com/queen/web/queen-web/1.0.0-SNAPSHOT/queen-web-1.0.0-SNAPSHOT.jar
注意:我们自己的Maven工程必须执行安装操作才会进入仓库,
安装命令:mvn install
2.4 Maven仓库
Maven仓库是基于简单文件系统存储的,只要在文件系统中没有发现相关的文件,说明这几依赖并不存在,因此,我们很容易在本地仓库查找具体的依赖是否存在。 Maven仓库分为两种:本地仓库和远程仓库 本地仓库就是我们自己机器上的文件系统,所以他是唯一的,项目构建时首先在本地仓库查找依赖,如果本地没有依赖时才会去寻找远程仓库
远程仓库指的是非本地的其他所有仓库,中央仓库、私服等都是远程仓库的一种。如果本地仓库没有项目构建需要的构件,你们就会从远程仓库下载,可是远程仓库如果也没有的话,你们就会项目报错。
2.5 Maven私服
私服是一种特殊的远程仓库,他是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在改构件,则从外部的远程仓库下载,同时缓存在私服之上,然后为Maven下载请求提供服务,另外,对于第三方的jar无法从仓库下载(JDBC驱动),可以从本地上传到私服供客户端下载。
优点主要有:
- 节省外网宽带
- 加速Maven构建
- 部署第三方构件
- 提高稳定性、增强控制:原因是外网不稳定
- 降低中央仓库的负荷:原因是中央仓库访问量太大
三、下载安装Maven
-
点此进入maven官网
-
选择左侧Download
-
点击指定的链接进行下载
-
下载完成后,选择一个路径进行解压 然后配置path环境变量,如图 新建系统变量:MAVEN_HOME = F:\dev\apache-maven-3.6.1 添加系统变量:%MAVEN_HOME%\bin (注意使用maven之前确定jdk安装环境)
-
运行cmd 输入 mvn -v,如图所示则配置成功
四、配置Maven文件
-
在maven文件conf下可以找到settings文件,notepad打开
-
大约在第52行,这里是maven默认的仓库
修改默认仓库位置,在指定位置新建用于保存的文件夹例如F:/repository
-
复制第53行并将标签内容修改该为你设置的地址书写在注释外
<localRepository>F:/repository</localRepository>
- 因为国外的服务器下载jar包很慢所以我们改为阿里云服务器(大约在150行左右)
直接复制粘贴指定位置即可 注意粘贴在mirrors标签中如图
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
- 修改maven默认的JDK版本
全局配置
全局配置是指在${MAVEN_HOME}\conf\settings.xml中进行配置,注${MAVEN_HOME}指的是maven的安装目录。例如,要配置jdk1.8,打开settings.xml这个文件,然后在<profiles> </profiles>之间添加如下代码。
<profile>
<id>JDK-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
局部配置
局部配置就是只针对具体某个项目进行配置的。具体就是,在项目的pom.xml文件中添加如下代码
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
五、maven配置文件 pom.xml 的使用
setting.xml主要用于配置maven的运行环境等一系列通用的属性,是全局级别的配置文件;而pom.xml主要描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和licenses,以及其他所有的项目相关因素,是项目级别的配置文件。 maven在项目中进行jar包管理就是依赖于pom文件
pom中主要有三个功能:
5.1 通过坐标管理项目中jar包
<dependencies>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
所有坐标书写在dependencies标签中 GroupId:jar包所在包名 artifactId:jar包名 version:版本
可以通过https://mvnrepository.com进行坐标的查找以及jar包的直接下载
5.2 配置项目使用插件
书写在build的plugins标签中,创建maven项目时模板后自动添加与生命周期对应
会在右侧边栏中展示插件(如下是idea默认集成,应该是plugins中的)
常用对应的maven指令(一般都是通过插件直接使用不会书写指令)
-
mvn clean 清理
进入项目根目录,执行「mvn clean」命令清理项目,清理项目的过程就是把执行「mvn compile」命令编译项目时生成的target文件夹删掉
-
mvn compile 编译
-
进入项目根目录执行 「mvn compile」命令编译项目java类
-
编译成功之后,项目的根目录下多了一个「target」文件夹
-
-
mvn test 测试
- 测试成功之后,项目的根目录下多了一个「target」文件夹
- 执行测试时, Maven会自动执行编译过程
-
mvn package 打包
-
打包成功后,项目的根目录下的「target」文件夹中多了一个项目名-版本号.ja或war
-
mvn install 项目部署
- Maven 会对项目自动执行「清理」→「编译」→「测试」→「打包」过程
- 同时将打包好的jar包发布到本地的Maven仓库中,平时这个命令使用最多
命令组合
maven的编译,清理,测试,打包,部署命令是可以几个命令同时组合起来使用的
- 先清理再编译:mvn clean compile
- 先清理再测试:mvn clean test
- 先清理再打包:mvn clean package
- 先清理再部署:mvn clean install
配置tomcat插件
<build>
<pluginManagement>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/maven</path>
<port>8080</port>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
5.3 将项目拆分成多个工程并进行依赖
maven多模块开发(一般微服务阶段进行讲解)
六、IDEA使用maven创建web项目
- 打开IDEA new->File->Project
- 选择maven->create from archetype->webapp
使用原型创建maven项目
- 选下拉填入项目详细信息(非必要)
Name:项目名 GroupId:包路径 ArtifactId:项目名(跟默认跟name相同)
4. 选择maven相关配置,选择maven路径、仓库地址
点击+号添加DarchetypeCatalog=internal
这样在创建maven时就不会每次都去中央仓库下载导致创建过慢
默认结构
5. 在main下新建文件夹
java:java代码存放路径类似于src
resources:配置文件存放路径也可以当做src
- 在java文件下创建包
- 在pom.xml中添加web项目依赖
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
- 重新导入依赖(默认maven会自动加载,但还是手动导入下)
- 在包下书写servlet
- 将项目添加到tomcat
这里演示使用war的方式,开发建议使用war exploded的方式
war模式:将WEB工程以包的形式上传到服务器 ;
war exploded模式:将WEB工程以当前文件夹的位置关系上传到服务器;
(1)war模式这种可以称之为是发布模式,看名字也知道,这是先打成war包,再发布;
(2)war exploded模式是直接把文件夹、jsp页面 、classes等等移到Tomcat 部署文件夹里面,进行加载部署。因此这种方式支持热部署,一般在开发的时候也是用这种方式。
(3)在平时开发的时候,使用热部署的话,应该对Tomcat进行相应的设置,这样的话修改的jsp界面什么的东西才可以及时的显示出来。
- 启动项目发送请求