【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

相关推荐
望获linux21 分钟前
【实时Linux实战系列】Linux 内核的实时组调度(Real-Time Group Scheduling)
java·linux·服务器·前端·数据库·人工智能·深度学习
云宏信息23 分钟前
【深度解析】VMware替代的关键一环:云宏ROW快照如何实现高频业务下的“无感”数据保护?
服务器·网络·数据库·架构·云计算·快照
Never_Satisfied24 分钟前
在 JavaScript 中,删除数组中内容为xxx的元素
java·前端·javascript
MC丶科32 分钟前
【SpringBoot常见报错与解决方案】端口被占用?Spring Boot 修改端口号的 3 种方法,第 3 种 90% 的人不知道!
java·linux·spring boot
怪兽201436 分钟前
Redis常见性能问题和解决方案
java·数据库·redis·面试
zz-zjx37 分钟前
JVM 内存结构与 GC 机制详解( 实战优化版)
java·jvm·tomcat
nvvas1 小时前
Android Studio JAVA开发按钮跳转功能
android·java·android studio
计算机学长felix1 小时前
基于SpringBoot的“中学信息技术课程教学网站”的设计与实现(源码+数据库+文档+PPT)_2025-10-17
数据库·spring boot·后端
CV工程师丁Sir1 小时前
Rokid设备连接全解析:蓝牙与Wi-Fi通信源码深度剖析
java
zoyation1 小时前
多线程简介和在JAVA中应用
java·开发语言