【Maven】Maven概述、安装以及其他相关知识

目录

一、Maven基础:

1、概述:

2、作用:

3、安装:

4、仓库:

(1)本质:

(2)分类:

二、Maven项目的创建:

1、创建步骤:

2、POM文件:

(1)概述:

(2)结构:

(3)坐标:

(4)依赖的配置:

(5)变量:

三、Maven生命周期:


一、Maven基础:

1、概述:

Maven是Apache旗下的一个开源项目,就是一个软件工具,用于管理和构建Java项目

Apache 软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非盈利性组织。

2、作用:

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

手动管理上面项目jar包时,可能会遇到下面问题:

  • 需要到不同的官网下载不同的jar
  • 需要自己测试多个jar之间是否版本兼容 (maven: 不兼容可手动调整)
  • 需要自己分析依赖关系,例如a.jar依赖b.jar,那么我们使用a.jar的时候也要把b.jar下载下来
  • 需要自己管理jar和其对应的源码和javadoc
  • .....

使用Maven后,这些问题都统统帮我们解决了,它会对项目中依赖的jar进行管理,我们只需要在maven项目的pom.xml文件中,添加一段如下图所示的配置即可实现。

2. 统一项目结构
提供标准、统一的项目结构。
在项目开发中,当你使用不同的开发工具 ( 如: Eclipse 、 Idea) ,创建项目工程的结构并不统一:

若我们创建的是一个maven工程,则项目结构为统一标准,具体如下:

目录说明:

  • src/main/java: java源代码目录
  • src/main/resources: 配置文件信息
  • src/test/java: 测试代码
  • src/test/resources: 测试配置文件信息

3. 项目构建

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

项目构建,是指一个项目清理、编译、测试、报告、打包、安装、部署等过程,Maven中把这些过程进行了标准化管理,可以通过一个命令,自动按照顺序,依次执行这里面的每一个步骤。

其中:

  1. 清理clean:将之前编译得到的旧文件class字节码文件删除

  2. 编译compile:将java源程序编译成class字节码文件

  3. 测试test:自动测试,自动调用junit程序

  4. 报告report:测试程序执行的结果

  5. 打包package:动态Web工程打War包,java工程打jar包

  6. 安装install:Maven特定的概念,将打包得到的文件复制到maven仓库中的指定位置

  7. 部署deploy:将工程生成的结果放到服务器中或者容器中,使其可以运行

注意,Maven允许在每个步骤中,除了默认的操作外,还可以通过插件来定义用户指定的操作

3、安装:

(1)Maven官网:maven.apache.org 找到对应的版本下载

(2)在无中文的、空格、特殊符号的路径下解压,得到目录如下

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

(3)配置配置Maven环境变量:MAVEN_HOME=D:\briup\apache-maven-3.6.3

(4)配置Path变量:Path=%MAVEN_HOME%\bin;

(5)测试安装是否成功 :重新打开一个新终端窗口,输入命令: mvn -v

4、仓库:

(1)本质:

仓库的本质就是一个目录(文件夹),这个目录被用来存储开发中所有依赖(就是jar包)和插件

(2)分类:

本地仓库:自己计算机上的一个目录(用来存储jar包)

配置方法:

在maven目录下创建一个文件夹,并赋复制该文件夹的路径。

进入到conf 目录下修改 settings.xml 配置文件
1). 使用超级记事本软件,打开settings.xml 文件,定位到 53 行左右
2). 复制标签,粘贴到注释的外面
3). 复制之前新建的用来存储jar 包的路径,替换掉标签体内容

中央仓库:由Maven团队维护的全球唯一的 https://repo1.maven.org/maven2/

当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应的jar包 如果有,则在项目直接引用 ;如果没有,则去中央仓库中下载对应的jar包到本地仓库


远程仓库(私服):一般由公司团队搭建的私有仓库

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

配置方法:

进入到conf目录下修改settings.xml配置文件:
1). 使用超级记事本软件,打开settings.xml文件,定位到160行左右

2). 在标签下为其添加子标签,内容如下:

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


注 : 只可配置一个 ( 另一个要注释 !) ,不然两个可能发生冲突,导致 jar 包无法下载!!!

仓库使用顺序:本地仓库 --> 远程仓库--> 中央仓库

二、Maven项目的创建:

1、创建步骤:

1、选择 IDEA中 File => Settings => Build,Execution,Deployment => Build Tools => Maven

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

这是一个英文版:

  • maven主路径:maven的安装目录
  • 用户设置文件:当前maven的settings.xml配置文件的路径
  • 本地仓库:刚刚创建的本地仓库的文件夹的路径

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

Maven默认使用的编译版本为5,版本过低,需要修改为8.

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

全局设置

1、进入到IDEA欢迎页面 :选择 IDEA中 File => close project 回到初始页面


2、打开 All settings,选择 Build,Execution,Deployment => Build Tools => Maven,然后配置MAVEN环境,前面已做过。

3、配置工程的编译版本为8,前面已做过。

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

案例展示:maven项目的创建案例

1、创建一个空项目

2、创建模块,选择Maven,点击Next

3、填写模块名称,坐标信息,点击finish,创建完成

4、在Maven工程下,创建HelloWorld类

5、运行程序

补充:maven项目的目录:

maven-demo01

|--- src (源代码目录和测试代码目录)

|--- main (源代码目录)

|--- java (源代码java文件目录)

|--- resources (源代码配置文件目录)

|--- test (测试代码目录)

|--- java (测试代码java目录)

|--- resources (测试代码配置文件目录)

|--- target (编译、打包生成文件存放目录)

2、POM文件:

(1)概述:

POM (Project Object Model) :指的是项目对象模型,用来描述当前的 maven 项目,其借助pom.xml 文件来实现。

(2)结构:

<project> --根标签表示当前项目

<modelVersion>......--指明遵循哪一个pom模型版本

<groupId>......--坐标

<artifactId>......

<version>......

<packaging>......</packaging>--打包方式

</project>

案例展示: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>
    <!-- 1.公司或者组织域名倒序+项目名 -->
    <groupId>com.briup.demo</groupId>
    <!-- 2.模块名 -->
    <artifactId>mvn-test</artifactId>
    <!-- 3.版本 -->
    <version>0.0.1-SNAPSHOT</version>
    <name>mvn-test</name>
    <!-- 配置当前项目中,所依赖的其他maven项目(jar包) -->
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

(3)坐标:

在Maven中,每一个项目都有三个坐标(GAV),用来唯一标识这个项目

  • groupId ,该元素定义当前Maven项目隶属的实际项目
  • artifactId ,该元素定义当前maven项目表示的具体子项目(模块)
  • version ,该元素定义当前maven项目的具体版本

依赖也是由这三个标签定义的

(4)依赖的配置:

本质:引入需要的jar包;

语法

XML 复制代码
<dependencies>
    <dependency>
        <groupId>jarbao目录中所在的文件名</groupId>
        <artifactId>所在文件名中文件的名字</artifactId>
        <version>所要依赖的版本号</version>
        <scope>该依赖可以使用的范围</scope>
    </dependency>
</dependencies>

案例展示:

XML 复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.16</version>
</dependency>

对应jarbao中的目录:

版本号的选择:

<scope>标签:

项目中添加的依赖,都是有范围的 <scope> ,默认值是compile

  1. compile ,默认值,适用于所有阶段(开发、测试、部署、运行),jar包会一直存在所有阶段

  2. provided ,只在开发、测试阶段使用,目的是不让将来部署的容器和你本地仓库的jar包冲突 因为有些jar包在将来部署的服务器或者容器中是存在的,所以打包的是就不需要把这些jar添加进来了如servlet相关jar包,项目中添加的依赖,都是有范围的 <scope> ,默认值是compile

  3. runtime ,只在运行时使用,如JDBC驱动,适用运行和测试阶段。编译时用不到

  4. test ,只在测试时使用,用于编译和运行测试代码。不会随项目发布,如JUnit相关jar包

例如:

XML 复制代码
<dependencies>
    <dependency>
        <groupId>sun.jdk</groupId>
        <artifactId>tools</artifactId>
        <version>1.5.0</version>
        <scope>system</scope>
            <systemPath>D:/vanse/hello.jar</systemPath>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
    </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
        <!--只有在测试的时候jar包才生效 -->
        <scope>test</scope>
    </dependency>
</dependencies>

注意,大多数依赖 jar 的 scope 都是 compile ,也就是默认值,在项目中导入依赖的jar 包后,可以在任何地方使用。
依赖排除:

依赖之间存在直接依赖与间接依赖(依赖于依赖的传递)

但依赖的传递可能会引发依赖冲突,如1依赖于2和3的1版本,而2依赖于3的2版本,那这样3的两个版本就会发生冲突。

解决方法:利用<exclusions>

案例展示:

XML 复制代码
<!--引入mvn-demo02模块-->
<dependency>
    <groupId>com.briup</groupId>
    <artifactId>mvn-demo02</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 依赖排除 -->
    <exclusions>
        <exclusion>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </exclusion>
    </exclusions>
</dependency>

(5)变量:

在pom.xml文件中的 <properties> 标签里面,可以定义变量,然后再下面的配置中,去使用这个变量:

XML 复制代码
<properties>
    <!-- 这三个变量,其实使用让maven默认自带的插件使用的 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <!-- 指定hello项目的版本(变量) -->
    <test.version>1.0-SNAPSHOT</test.version>
</properties>
<dependencies>
    <dependency>
        <groupId>com.briup</groupId>
        <artifactId>test</artifactId>
        <version>${test.version}</version>
    </dependency>
</dependencies>

三、Maven生命周期:

生命周期的顺序是:clean --> validate --> compile --> test --> package --> verify --> install --> site --> deploy

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

在Maven出现之前,项目构建的生命周期就已经存在,软件开发人员每天都在对项目进行清理,编译,测试及部署。虽然大家都在不停地做构建工作,但公司和公司间、项目和项目间,往往使用不同的方式做类似的工作。
Maven从大量项目和构建工具中学习和反思,然后总结了一套高度完美的,容扩展的项目构建生命周期。这个生命周期包含了项目的清理,初始化,编译,测试,打包,集成测试,验证,部署和站点生成等几乎所有构建步骤。

Maven对项目构建的生命周期划分为3套(相互独立):

clean:清理工作。

default:核心工作。如:编译、测试、打包、安装、部署等。

site:生成报告、发布站点等。

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

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

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

  • compile:编译项目源代码

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

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

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

在日常开发中,当我们要执行指定的生命周期时,有两种执行方式:

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

  2. 在DOS命令行中,通过maven命令执行

eg:mvn install

相关推荐
鸽鸽程序猿5 小时前
【算法】【优选算法】BFS 解决边权相同最短路问题
java·算法·宽度优先
xiyangxiaoguo5 小时前
Qt QEventLoop的使用的一个问题讨论
java·前端·算法
卷Java5 小时前
百度智能云车牌识别API官方配置指南
java·开发语言·经验分享·vscode·学习·微信小程序·intellij idea
盖世英雄酱581365 小时前
Where条件顺序会影响索引的使用?
数据库·后端
你的微笑,乱了夏天5 小时前
spring boot项目使用Torna生成在线接口文档
java·spring boot·中间件·postman
歪歪1006 小时前
介绍一下SQLite的基本语法和常用命令
数据库·sql·架构·sqlite
kobe_OKOK_6 小时前
有一次django开发实录
数据库·django·sqlite
重回19816 小时前
Python 操作 SQLite:Peewee ORM 与传统 sqlite3.connect 的全方位对比
数据库·oracle·sqlite
lph0096 小时前
Android compose Room Sqlite 应用 (注入式)
android·数据库·sqlite