1.关于Maven

1.1.简介

Maven是apache下的一个开源项目,是纯Java开发的,主要作用于管理java项目。Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具

总结一下这么官方的话术:方便Java的CV程序员们创建一个统一结构的项目让大家看起来都用起来都方便!

1.2.好处与功能

  1. 依赖管理:就是对jar包的同一管理 可以节省空间
    • 想要找到对应的jar包就需要给坐标,坐标的写法:哪个公司或组织+哪个项目+哪个版本(后面会介绍)
  2. 项目构建
    • 项目的一键构建指的是项目从 编译—-测试—–运行—–打包—-安装 都交给maven进行管理,这个过程称为构建
  3. 跨平台(纯Java开发)
  4. 应用于大型项目可以提高开发效率
    • maven的分模块开发:每个模块都单独开发,在用maven的时候改变单独模块的源码不需要去同时编译别的模块

1.3.Maven的安装

在我们安装Maven之前,要确保自己的电脑上有我们的Java环境(JDK),这个不再多说啦!

附上地址:Maven官方下载地址

1.3.1.安装教程

  1. 先安装jdk,要求1.7版本以上
  2. 把maven软件解压缩,解压目录最好不要有中文

    1

  3. 配置环境变量MAVEN_HOME,变量值就是maven的解压路径

    2

  4. 配置环境变量PATH,将%MAVEN_HOME%\bin加入Path中,在Windows中一定要注意要用分号;与其他值隔开

  5. 验证是否配置成功:打开cmd窗口,输入mvn –v看是否有版本信息弹出如下

1.3.2.Maven的配置

全局配置

在你所在的Maven解压文件中settings.xml就是你的全局配置,可以直接改全局配置,但是更好的是可以直接写一个自己的用户配置

用户配置(建议用这个)

当运行完cmd的mvn –v之后会产生一个默认的maven目录:~/.m2/repository。

其中~表示当前用户路径C:\Users\ [UserName] (桌上上的用户文档)

~/.m2/settings.xml是用户的配置文件(默认没有该文件,需要将全局配置文件拷贝过来在进行修改)

注意:一般本地仓库的地址不使用默认配置,通常情况下需要在用户配置中,配置新的仓库地址。

配置步骤

  1. 创建一个本地仓库目录,比如D:\Maven\repository
  2. 复制maven的全局配置文件到~/.m2目录下,即创建用户配置文件
  3. 修改maven的用户配置文件

在此我直接贴上我用的settings.xml文件,其中主要的部分就是要修改镜像mirror地址

修改镜像地址的原因可想而知,因为maven在下载资源的时候走的是外网有时候相对较慢,我们可以换成国内阿里云的服务资源进行下载。

<?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:\java\repository\maven_repository</localRepository>
  <!-- 修改镜像 -->
    <mirrors>
		<mirror>
			<id>nexus-aliyun</id>
			<mirrorOf>*</mirrorOf>
			<name>Nexus aliyun</name>
			<url>http://maven.aliyun.com/nexus/content/groups/public</url>
		</mirror> 
    </mirrors>
	<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> 
  </profiles>
</settings>

2.Maven入门

2.1.maven的三种仓库

什么是Maven的仓库呢?

在开头的时候我们有说过,利用Maven我们可以更加方便的引入jar包

那么我们这些jar包不是凭空而来的,而是Maven通过镜像帮你下载到本地,然后统一管理、重复利用

因此我们就有了仓库这个概念,并且我们的仓库还分为几种

  • 本地仓库:自己维护
  • 远程仓库(私服):公司维护(如果你进的公司有安全限制,就不会让你直接从公共平台直接下载依赖)
  • 中央仓库:maven团队维护

三种仓库的关系图

7

三种层级关系是层层叠加的。

在本地仓库没有你想要的Jar包的情况,会前往当前所在的私有仓库去下载Jar包到本地。

当然如果你没有私有仓库,那么就会直接去中央仓库下载相关的Jar包到本地。

2.2.Maven的目录结构

maven项目结构

在这里讲述一下在Maven的项目中比较重要的几个东西。

首先是我们的pom.xml文件,这个是整个Maven项目的核心,关系到我们相关Jar包的引入与Maven项目的配置

其次如果你能成功运行一个Maven项目,你会发现在与pom.xml同级别目录下会产生一个target文件夹,这里面放着的是经过编译后的源码文件以及一些打包的项目文件(war、jar)。

注意:Maven的工程目录结构是固定的,如果不一样,会导致项目无法正常使用

这也就是为什么说,使用Maven项目以后我们可以保证就算是不同的工程师之间也不会因为不同的项目结构而混乱。因为Maven统一了这个项目结构)

2.2.1.IDEA创建Maven工程

  1. 先需要对IDEA中的Maven进行一下配置

    在红框圈起来的部分则表示选择你Maven解压的地址,这样IDEA才可以根据你本地的Maven来进行项目管理(如果你本地没有其实IDEA是也有自带的)

    其次注意:User settings file这个属性表示的是加载配置文件的位置,也就是我们前面提到的settings.xml文件

    如果你是按照我的建议,直接在用户目录下的.m2\文件夹下创建了对应的配置文件,那么就不需要更改。

    如果你不是这样操作,那么需要你自己手动指定你settings.xml文件的路径啦!

    8

  2. 创建Maven项目

    在创建项目的时候选择可以直接选择Next,我们并不需要项目的骨架模板

    所以直接下一步即可

    img

  3. 填写相关的项目信息

    在Next之后会出现项目信息让你填写,进行简单填写后直接Next即可。

    这样就可以得到一个Maven的JavaSE项目

  4. 新建JavaSE的Maven项目

    我们会得到一个项目结构如下的Maven项目,会发现和我们之前介绍的Maven项目结构一样。

    在Maven中test目录下如果没有resources文件则会调用main目录下的

    img

  5. 细节

    在一开始创建Maven项目的时候,有的版本的IDEA编译器会提示如下,一般情况下可以选择自动导入相关依赖。

    其意思就是当你去改变pom.xml文件内容的时候,如果有新的依赖引入,那么IDEA会帮你自动更新。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QP9B8qhQ-1668131885723)(/Users/dengs/Desktop/NETBOX/Java-19:09/02_管理_Maven&log4j/maven文档/img/10.png)]

  6. 创建一个小案例试试

    image-20221111003824222

    输出后得到:

    Hello Maven!

2.2.2.Eclipse创建Maven工程

其实无论是什么工具创建Maven工程的本质都是差不多的。

无非就是注意核心的pom.xml文件,以及工程目录结构。在保持好这两个的情况下配置对应IDE工具与Maven相关的配置即可。

其实整个Eclipse在市场上的使用率是有所下降的,博主在这里也推荐一份写的还不错Eclipse教程。

大家可以作为参照。

2.3.创建Maven的JavaWeb工程

上面我们阐述的是如何创建一个基本的JavaSE所支持的Maven工程。

但是实际我们开发过程中,还有可能遇到的就是JavaWeb工程,上面的工程结构并不支持。

所以我们要在上述的结构中进行下一步的改造。

2.3.1.Web工程的目录结构

我简单的画了一下在Maven中的JavaWeb的项目目录结构

大家可以看如下图

从图中我们可以看到,相比于原本的JavaSE结构,在src目录下多出了webapp这个文件,这也就是我们web项目的核心了。

因此我们的改造就是要将原本的目录更改成如下样子

image-20221111005207493

  1. 修改核心的pom.xml文件

    首先,我们需要对maven的核心文件进行配置,说白了就是让Maven知道我们当前的这个项目是一个web项目。

    在Java中,Web项目是以war包的方式存在的,而普通的JavaSE项目则是以jar包的形式存在。

    因此我们需要将我们pom.xml文件中的项目打包形式进行变更

    image-20221111010122304

  2. 创建缺失的文件夹与文件

    根据上述内容,我们需要将缺失的文件夹进行补充,并且补上web.xml文件

    以下我给出了web.xml文件的模板内容,大家可以复制去用。

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
             version="3.0" >
        
    </web-app>
  3. 刷新项目结构

    当我们改动完成之后,需要让Maven知道我们已经改变当前的Maven项目了,需要刷新一下我们的项目。

    image-20221111010417311

    可以点击右上角的刷新按钮

    或者可以打开IDEA右侧栏的Maven插件,点击刷新按钮也可以!

  4. 配置Tomcat

    以上工作准备就绪以后我们的JavaWeb工程就完成了。

    想要运行这个web项目我们还需要服务器的支持,因此需要来配置一下Tomcat

    image-20221111011049950

    先选择我们的项目配置

    image-20221111011257731

    选择添加一个本地的Tomcat服务器,当然你本地需要先解压好Tomcat服务器。

    image-20221111011445848

    填写好名字,配置好本地Tomcat所在的路径。即可

    下一步是点击底部的Fix警告,来配置项目依赖。

    image-20221111011610297

    配置好之后,可以看到如下界面。

    通过Application context这个属性,可以配置你项目的访问路径

    image-20221111011715448

    如上图所示,我们当前这个Web项目的访问路径就是localhost:8080/maven_demo_war/

    当然你如果不需要这个项目有开头路径那么你可以将Application context的值设置为/即可

最后:启动我们的项目,尝试进行访问

在访问的之前,如果你没有首页,那么你可以在你的webapp目录下创建一个index.html文件来充当首页。

最终访问结果如下:

image-20221111012748053

index.html文件代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <h1>这是一个首页</h1>
</body>
</html>

3.Maven核心

3.1.坐标

什么是坐标?

在平面几何中坐标(x,y)可以标识平面中唯一的一点。在maven中坐标就是为了定位一个唯一确定的jar包。

Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范拥有了统一规范,就可以把查找工作交给机器

3.1.1.坐标的组成

maven的坐标由以下三个部分组成

  1. groupId:定义当前Maven组织名称
  2. artifactId:定义实际项目名称
  3. version:定义当前项目的当前版本

3.2.依赖管理

就是对项目中jar 包的管理。可以在pom文件中定义jar包的GAV(三大元素简称)坐标,管理依赖。

依赖声明主要包含如下元素:

如下所示

<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>	
</dependencies>

3.3.依赖范围

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fux2SgNE-1668131885724)(/Users/dengs/Desktop/NETBOX/Java-19:09/02_管理_Maven&log4j/maven文档/img/11.png)]

其中依赖范围scope 用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:

  1. compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
  2. test:测试依赖范围。只对于测试classpath有效
  3. provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
  4. runtime:运行时提供。例如:jdbc驱动

3.4.依赖传递

假设我们在项目中引用了某个jar包,而这个jar包又需要另外一个jar包才可以运行,这个时候maven就会将这个所需要的jar包也导入进来,这个就是依赖传递

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h49nwO0d-1668131885724)(/Users/dengs/Desktop/NETBOX/Java-19:09/02_管理_Maven&log4j/maven文档/img/12.png)]

如果B中使用A,C中使用B,则称B是C的直接依赖,而称A是C的间接依赖。

C->B B->A

C直接依赖B

C间接依赖A

3.5.依赖冲突

  • 如果直接与间接依赖中包含有同一个坐标不同版本的资源依赖,以直接依赖的版本为准——就近原则
  • 如果直接依赖中包含有同一个坐标不同版本的资源依赖,以配置顺序下方的版本为准——第一声明者优先原则

总结,简单来说可能就在Maven中引入了两个相同的Jar包,但是版本不同,那么在这种情况下,我们的Maven就会自动选择以上两种之一的解决方式。

3.6.依赖排除

在遇到依赖冲突的这种情况,我们可以采用依赖排除的方式,来剔除自己不想要的Jar包。

排除掉不想要的Jar包就需要了解该Java包的artifactId与groupId

<dependency>
	  <groupId>junit</groupId>
	  <artifactId>junit</artifactId>
	  <version>4.12</version>
	  <scope>test</scope>
	  <exclusions>
           <exclusion>
               <artifactId>hamcrest-core</artifactId>
               <groupId>org.hamcrest</groupId>
           </exclusion>			
	 </exclusions>
</dependency>

排除依赖包中所包含的依赖关系,不需要添加版本号。

如果在本次依赖中有一些多余的jar包也被传递依赖过来,如果想把这些jar包排除的话可以配置exclusions进行排除

提示: 在idea中有maven helper插件可以更方便的管理和排除依赖,直接在idea的插件部分搜索即可

3.7.查找依赖

从上述的内容中我们可以知道,依赖非常多,每个Jar包都有不同的AGV元素,我们不能真的每个都记住吧?

所以我们在不知道的情况下其实是可以直接去中央仓库中进行模糊搜索的,只要你大概几的Jar包的名字就可以直接去搜索到相关的内容。