第十九天 Maven总结

目录

Maven

1. 前言

2. 概述

2.1 介绍

2.2 安装

3. IDEA集成Maven

3.1 集成Maven环境

3.2 创建Maven项目

3.3 Maven坐标详解

3.4 导入maven项目

4. 依赖管理

4.1 依赖配置

4.2 依赖传递

4.3 依赖范围

4.4 生命周期

4.5 插件


Maven

1. 前言

1). 什么是Maven?

Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具。

官网:Maven – Welcome to Apache Maven

2). Maven的作用是什么?

A. 依赖管理 : 方便快捷的管理项目依赖的资源jar包,避免版本冲突问题。

若没有通过maven进行大型项目的依赖管理,我们在开发项目时,需要引入大量的jar包。 那么此时,jar包和jar包之间很多时候是需要版本匹配的,如果版本不匹配,此时很容易出现版本冲突问题。 引入的依赖jar包如下:

而通过maven进行项目依赖管理,则很方面的可以解决这个问题。 我们只需要在maven项目的pom.xml文件中,配置该项目的依赖坐标即可,它会自动解决依赖的版本冲突问题。 pom.xml中引入的依赖,如下图所示:

B. 统一项目结构 : 提供标准、统一的项目结构。

项目开发中,无论你使用的是早期的eclipse ,还是myeclipse , 还是idea。 若我们创建的是一个maven工程,是可以帮我们自动生成一个统一、标准的项目目录结构。 具体的统一结构如下:

目录说明:

src/main/java: java源代码目录

src/main/resources: 配置文件信息

src/test/java: 测试代码

src/test/resources: 测试配置文件信息

C. 项目构建 : maven提供了标准的、跨平台(Linux、Windows、MacOS)的自动化项目构建方式。

如上图所示我们开发了一套系统,代码需要进行编译、测试、打包、发布,这些操作如果需要反复进行就显得特别麻烦,而Maven提供了一套简单的命令来完成项目构建。

综上所述,Maven是一款管理和构建java项目的工具。

2. 概述

2.1 介绍

2.1.1 什么是maven

1). Apache Maven 是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档。

2). 官网:Maven – Welcome to Apache Maven

3). 作用:

- 方便的依赖管理

- 统一的项目结构

- 标准的项目构建流程

2.1.2 Maven模型

  • 项目对象模型 (Project Object Model)
  • 依赖管理模型(Dependency)
  • 插件(Plugin)

如上图所示就是Maven的模型,而我们先看紫色框框起来的部分,他就是用来完成 标准化构建流程 。如我们需要编译,Maven提供了一个编译插件供我们使用,我们需要打包,Maven就提供了一个打包插件提供我们使用等。

上图中紫色框起来的部分,项目对象模型就是将我们自己抽象成一个对象模型,有自己专属的坐标,如下图所示是一个Maven项目:

依赖管理模型则是使用坐标来描述当前项目依赖哪儿些第三方jar包,如下图所示:

上述Maven模型图中还有一部分是仓库。如何理解仓库呢?

2.1.3 Maven仓库

大家想想这样的场景,我们创建Maven项目,在项目中使用坐标来指定项目的依赖,那么依赖的jar包到底存储在什么地方呢?其实依赖jar包是存储在我们的本地仓库中。而项目运行时从本地仓库中拿需要的依赖jar包。

仓库:用于存储资源,管理各种jar包。 下图中, 右侧整个虚线框, 框起来的部分都是仓库。

仓库分类:

  • 本地仓库:自己计算机上的一个目录。
  • 远程仓库(私服):一般由公司团队搭建的私有仓库。
  • 中央仓库:由Maven团队维护的全球唯一的。 仓库地址:Central Repository:

当项目中使用坐标引入对应依赖jar包后,首先会查找 本地仓库 中是否有对应的jar包:

  • 如果有,则在项目直接引用;
  • 如果没有,则去中央仓库中下载对应的jar包到本地仓库。

如果还可以搭建远程仓库(私服),将来jar包的查找顺序则变为: 本地仓库 --> 远程仓库--> 中央仓库

2.2 安装

2.2.1 下载

下载地址:Maven – Download Apache Mavenicon-default.png?t=N176https://maven.apache.org/download.cgi

2.2.2 安装步骤(以3.5.0为例)

1). 解压 apache-maven-3.5.0-bin.zip , 既安装完成

建议解压缩到没有中文、特殊字符的路径下。如解压缩到 F:\apache-maven-3.5.0 下。

解压缩后的目录结构如下:

  • bin目录 : 存放的是可执行命令。mvn 命令重点关注。
  • conf目录 :存放Maven的配置文件。settings.xml 配置文件后期需要修改。
  • lib目录 :存放Maven依赖的jar包。Maven也是使用java开发的,所以它也依赖其他的jar包。

2). 配置本地仓库

修改 conf/settings.xml 中的 <localRepository> 为一个指定目录作为本地仓库,用来存储jar包。

3). 配置阿里云私服

中央仓库在国外,所以下载jar包速度可能比较慢,而阿里公司提供了一个远程仓库,里面基本也都有开源项目的jar包。

修改 conf/settings.xml 中的 <mirrors>标签,为其添加如下子标签:

<mirror>  
    <id>alimaven</id>  
    <name>aliyun maven</name>  
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>          
</mirror>

注意配置的位置, 在<mirrors> ... </mirrors> 中间添加配置。

4). 配置环境变量 MAVEN_HOME

此电脑 右键 --> 高级系统设置 --> 高级 --> 环境变量

A. 在系统变量处新建一个变量 MAVEN_HOME

B. 在 Path 中进行配置

打开命令提示符进行验证,出现如图所示表示安装成功

mvn -v

3. IDEA集成Maven

3.1 集成Maven环境

我们要想在IDEA中使用Maven进行项目构建,就需要在IDEA中继承Maven。

3.1.1 当前工程设置

1). 选择 IDEA中 File --> Settings --> Build,Execution,Deployment --> Build Tools --> Maven

2). 设置 IDEA 使用本地安装的 Maven,并修改配置文件及本地仓库路径

  • Maven home path: 指定当前Maven的安装目录。
  • User settings file: 指定当前Maven的settings.xml配置文件的存放路径。
  • Local repository: 指定Maven的本地仓库的路径。(如果指定了settings.xml, 这个目录会自动读取出来, 可以不用手动指定)

3). 配置工程的编译版本为8

上述配置的maven环境,只是针对于当前工程的,如果我们再创建一个project,又恢复成默认的配置了。 要解决这个问题, 我们就需要配置全局的maven环境。

3.1.2 全局设置

1). 选择 IDEA中 File --> close project。

2). 打开 settings , 选择 Build,Execution,Deployment --> Build Tools --> Maven

3). 配置工程的编译版本为8

这里所设置的maven的环境信息,并未指定任何一个project,此时设置的信息就属于全局配置信息。 以后,我们再创建project,默认就是使用我们全局配置的信息。

3.2 创建Maven项目

1). 创建模块,选择Maven,点击Next

2). 填写模块名称,坐标信息,点击finish,创建完成

3). 编写 HelloWorld,并运行

public class HelloWorld {
	
    public static void main(String[] args) {
        System.out.println("Hello Maven ...");
    }
	
}

Maven项目的目录结构:

maven-project01
	|- src  (源代码目录和测试代码目录)
		|- main (源代码目录)
			|- java (源代码java文件目录)
			|- resources (源代码配置文件目录)
		|- test (测试代码目录)
			|- java (测试代码java目录)
			|- resources (测试代码配置文件目录)
	|- target (编译、打包生成文件存放目录)

3.3 Maven坐标详解

1). 什么是坐标?

  • Maven 中的坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置。
  • 使用坐标来定义项目或引入项目中需要的依赖

2). Maven 坐标主要组成

  • groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itheima)
  • artifactId:定义当前Maven项目名称(通常是模块名称,例如 order-service、goods-service)
  • version:定义当前项目版本号

如下图就是使用坐标表示一个项目:

注意:

  • 上面所说的资源可以是插件、依赖、当前项目。
  • 我们的项目如果被其他的项目依赖时,也是需要坐标来引入的。

3.4 导入maven项目

1. 打开IDEA,选择右侧Maven面板,点击 + 号,选中对应项目的pom.xml文件,双击即可

2. 如果没有Maven面板,选择 View --> Appearance --> Tool Window Bars

4. 依赖管理

4.1 依赖配置

依赖:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖。

比如,在当前工程中,我们需要用到logback来记录日志,此时, 就可以在maven工程的pom.xml文件中,引入logback的依赖。具体步骤如下:

1). 在 pom.xml 中编写 <dependencies> 标签

2). 在 <dependencies> 标签中 使用 <dependency> 引入坐标

3). 定义坐标的 groupId,artifactId,version

<dependencies>
    <!-- log4j 日志依赖 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.11</version>
    </dependency>
</dependencies>

4). 点击刷新按钮,引入最新加入的坐标

或者

这样,每一次引入新的依赖,或者修改现有的依赖配置,都需要点击刷新按钮,刷新依赖,在可以加入最新的坐标。

注意事项:

①. 如果引入的依赖,在本地仓库中不存在,将会连接远程仓库 / 中央仓库,然后下载依赖。(这个过程会比较耗时,耐心等待)

②. 如果不知道依赖的坐标信息,可以到mvn的中央仓库(https://mvnrepository.com/)中搜索。

4.2 依赖传递

4.2.1 依赖具有传递性

1). 直接依赖:在当前项目中通过依赖配置建立的依赖关系

2). 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

比如:上图中,projectA 依赖了 projectB , 而projectB 依赖了 projectC 及其他jar包。 那么此时,在projectA中也会将projectC的依赖传递下来。

对于projectA 来说, projectB 就是直接依赖。 而 projectC 就是间接依赖。

4.2.2 排除依赖

A依赖B,B依赖C,如果A不想将C依赖进来,是否可以做到? 在maven项目中,我们可以通过排除依赖来实现。

排除依赖:指主动断开依赖的资源,被排除的资源无需指定版本。

<dependency>
    <groupId>com.itheima</groupId>
    <artifactId>maven-projectB</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <!--排除依赖, 主动断开依赖的资源-->
    <exclusions>
    	<exclusion>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </exclusion>
    </exclusions>
</dependency>

4.3 依赖范围

依赖的jar包,默认情况下,可以在任何地方使用。可以通过 <scope> … </scope> 设置其作用范围。

作用范围:

1). 主程序范围有效。(main文件夹范围内)

2). 测试程序范围有效。(test文件夹范围内)

3). 是否参与打包运行。(package指令范围内)

如下图所示给 junit 依赖通过 scope 标签指定依赖的作用范围。 那么这个依赖就只能作用在测试环境,其他环境下不能使用。

scope

主程序

测试程序

打包(运行)

范例

compile(默认)

Y

Y

Y

log4j

test

-

Y

-

junit

provided

Y

Y

-

servlet-api

runtime

-

Y

Y

jdbc驱动

4.4 生命周期

4.4.1 介绍

Maven的生命周期就是为了对所有的构建过程进行抽象和统一。 描述了一次项目构建,经历哪些阶段。

Maven对项目构建的生命周期划分为3套:

  • clean:清理工作。
  • default:核心工作,如:编译、测试、打包、安装、部署等。
  • site:生成报告、发布站点等。

具体三套生命周期又包含哪些具体的阶段呢, 我们来看下面这幅图:

我们看到这三套生命周期,里面有很多很多的阶段,那么这么多生命周期,其实我们常用的并不多,主要关注以下几个:

• clean:移除上一次构建生成的文件

• compile:编译项目源代码

• test:使用合适的单元测试框架运行测试(junit)

• package:将编译后的文件打包,如:jar、war等

• install:安装项目到本地仓库

而这些生命周期阶段呢,在IDEA中右侧的maven工具栏中,可以很方便的展示出来。

而生命周期的顺序是:clean --> validate --> compile --> test --> package --> verify --> install --> site --> deploy 。我们需要关注的就是:clean --> compile --> test --> package --> install 。

而这些生命周期,我们在执行后面的生命周期时,前面的生命周期都会执行。

4.4.2 执行

执行指定生命周期的两种方式:

1). 在idea中,右侧的maven工具栏,选中对应的生命周期,双击执行。

2). 在命令行中,通过命令执行。

4.5 插件

4.5.1 介绍

  • Maven 本质上是一个插件执行框架,所有工作都是由插件完成。
  • 默认maven在各个生命周期上都绑定有预设的插件,在执行到对应生命周期时执行对应的插件功能。

4.5.2 跳过测试

可以在pom.xml中通过maven插件配置,自定义其他功能。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12.4</version>
            <configuration>
            		<skipTests>true</skipTests>
            </configuration>
        </plugin>
    </plugins>
</build>

通过配置插件的形式,可以实现跳过单元测试的功能。 而在IDEA中其实还给我们提供了一个简洁操作。将执行的 闪电按钮 点击一下,就可以跳过单元测试了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/1719.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux实操之服务管理

文章目录一、服务(service)管理介绍:service管理指令查看服务名服务的运行级别(runlevel):CentOS7后运行级别说明chkconfig指令介绍一、服务(service)管理介绍: 服务(service)本质就是进程&#xff0c;但是是运行在后台的&#xff0c;通常都会监听某个端口&#xff0c;等待其它…

原力计划来了【协作共赢 成就未来】

catalogue&#x1f31f; 写在前面&#x1f31f; 新星计划持续上新&#x1f31f; 原力计划方向&#x1f31f; 原力计划拥抱优质&#x1f31f; AIGC&#x1f31f; 参加新星计划还是原力计划&#x1f31f; 创作成就未来&#x1f31f; 写在最后&#x1f31f; 写在前面 哈喽&#x…

依赖注入~

依赖注入之setter注入&#xff1a; 依赖注入是IOC具体的一种实现方式&#xff0c; 这是针对资源获取的方式角度来说的&#xff0c;之前我们是被动接受&#xff0c;现在IOC具体的实现叫做依赖注入&#xff0c;从代码的角度来说&#xff0c;原来创建对象的时候需要new&#xff0…

Phoenix基础命令_视图映射和表映射_数字存储问题---大数据之Hbase工作笔记0036

然后我们再来看看,用Phoenix来操作hbase,的基本用法 具体的其他的命令在官网都能找到,这里就说几个 https://phoenix.apache.org/language/index.html 首先是创建表,这里注意,默认表名给弄成大写的 这里的varchar对应的其实就是hbase中的string 然后这里的id表示行的rowkey 可…

chatgpt3.5和chatgpt4的区别

ChatGPT4是基于GPT-3模型的一个实例&#xff0c;但ChatGPT4已经进行了进一步的改进和优化。GPT-3&#xff08;第三代生成式预训练模型&#xff09;是OpenAl开发的一个大型语言模型&#xff0c;它在很多自然语言处理任务中表现出色。ChatGPT4继承了GPT-3的基本架构和能力&#x…

复旦微ZYNQ7020全国产替代方案设计

现在国产化进度赶人&#xff0c;进口的芯片只做了个功能验证&#xff0c;马上就要换上国产的。国内现在已经做出来zynq的只有复旦微一家&#xff0c;已经在研制的有上海安路&#xff0c;还有成都华微&#xff08;不排除深圳国威也在做&#xff0c;毕竟这个市场潜力很大&#xf…

如何在Unity中实现AStar寻路算法及地图编辑器

文章目录AStar算法简介实现Node节点节点间的估价算法核心邻节点的搜索方式地图编辑器简介实现绘制地图网格障碍/可行走区域地图数据存储AStar算法 简介 Unity中提供了NavMesh导航寻路的AI功能&#xff0c;如果项目不涉及服务端它应该能满足大部分需求&#xff0c;但如果涉及服…

树莓派(3B):启动流程,系统初始化配置,引脚图图示说明

目录 一&#xff0c;树莓派刷机及串口方式登陆 ① 准备工具 ② 操作步骤 二&#xff0c;配置树莓派接入网络 ① 树莓派入网 ② 固定树莓派的ip地址 三&#xff0c;网络SSH方式登陆树莓派 ① 打开树莓派SSH功能 ② 登陆SSH 四&#xff0c;用国内的源更新vim 五&…

48天C++笔试强训 001

作者&#xff1a;小萌新 专栏&#xff1a;笔试强训 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;讲解48天笔试强训第一天的题目 笔试强训 day1选择题12345678910编程题12选择题 1 以下for循环的执行次数是&#xff08;&#xff…

手把手教你基于HTML、CSS搭建我的相册(上)

The sand accumulates to form a pagoda写在前面HTML是什么&#xff1f;CSS是什么&#xff1f;demo搭建写在最后写在前面 其实有过一些粉丝咨询前端该从什么开始学&#xff0c;那当然是我们的前端基础三件套开始学起&#xff0c;HTML、CSS、javaScript&#xff0c;前端的大部分…

字符函数和字符串函数【下篇】

文章目录&#x1f396;️1.函数介绍&#x1f4ec;1.8. strstr&#x1f4ec;1.9. strtok&#x1f4ec;1.10. strerror&#x1f4ec;1.11. memcpy&#x1f4ec;1.12. memmove&#x1f4ec;1.13. memcmp&#x1f4ec;1.14. memset&#x1f396;️1.函数介绍 &#x1f4ec;1.8. st…

Linux - 进程控制(进程等待)

进程等待必要性之前讲过&#xff0c;子进程退出&#xff0c;父进程如果不管不顾&#xff0c;就可能造成‘僵尸进程’的问题&#xff0c;进而造成内存泄漏。另外&#xff0c;进程一旦变成僵尸状态&#xff0c;那就刀枪不入&#xff0c;“杀人不眨眼”的kill -9 也无能为力&#…

基于java下Springboot框架实现旅游管理平台系统

基于java下Springboot框架实现旅游管理平台系统开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven…

自动驾驶自主避障概况

文章目录前言1. 自主避障在自动驾驶系统架构中的位置2. 自主避障算法分类2.1 人工势场法&#xff08;APF&#xff09;2.1.1引力势场的构建2.1.2斥力势场的构建2.1.3人工势场法的改进2.2 TEB&#xff08;Timed-Eastic-Band, 定时弹性带&#xff09;2.3 栅格法2.4 向量场直方图(V…

基于鲸鱼算法的极限学习机(ELM)分类算法-附代码

基于鲸鱼算法的极限学习机(ELM)分类算法 文章目录基于鲸鱼算法的极限学习机(ELM)分类算法1.极限学习机原理概述2.ELM学习算法3.分类问题4.基于鲸鱼算法优化的ELM5.测试结果6.参考文献7.Matlab代码摘要&#xff1a;本文利用鲸鱼算法对极限学习机进行优化&#xff0c;并用于分类问…

C++继承

文章目录继承的概念和定义继承的概念继承定义继承定义格式继承基类成员访问方式的变化基类和派生类对象赋值转换继承中的作用域派生类的默认成员函数继承与友元继承与静态成员复杂的菱形继承及菱形虚拟继承菱形虚拟继承菱形虚拟继承原理菱形虚拟继承中虚指针应用继承的总结和反…

【C语言】字符串函数和内存函数

前言&#x1f338;在我们编写C程序时&#xff0c;除了使用自定义函数&#xff0c;往往还会使用一些库函数&#xff0c;例如标准输入输出函数printf&#xff0c;scanf&#xff0c;字符串函数strlen&#xff0c;内存函数memset等等&#xff0c;使用这些系统自带的库函数可以轻松地…

MongoDB【部署 01】mongodb最新版本6.0.5安装部署配置使用及mongodb-shell1.8.0安装使用(云盘分享安装文件)

云盘分享文件&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/11sbj1QgogYHPM4udwoB1rA 提取码&#xff1a;l2wz 1.mongodb简单介绍 MongoDB的 官网 内容还是挺丰富的。 是由 C语言编写的&#xff0c;是一个基于分布式文件存储的开源数据库系统。在高负载的情况下&…

【JavaEE初阶】第八节.网络原理网络层和数据链路层,应用层

文章目录 前言 一、网络层协议 1.1 IP协议 1.2 IP地址&#xff1b; 1.3 路由选择&#xff1b; 二、数据链路层 2.1 以太网协议&#xff1b; 三、应用层&#xff1b; 3.1 应用层协议DNS&#xff1b; 3.2 DNS是如何完成转换的&#xff1b; 3.3 如何解决DNS访问量太高的…

c语言的基础知识之结构体

目录前言结构体结构的自引用typedef函数结构体内存对齐修改默认对齐数位段什么是位段位段的内存分配位段的跨平台问题位段的意义以及应用枚举枚举常量的赋值枚举的优点总结前言 欢迎来到戴佳伟的小课堂&#xff0c;那今天我们讲啥呢&#xff1f; 问得好&#xff0c;我们今天要讲…