基础介绍
在前端开发的大型项目中,我们经常会使用框架进行项目开发,如vue的脚手架vue-cli、项目依赖我们会使用npm进行管理。
Java开发中,也有完整的项目解决方案:Maven。
Maven是一个跨平台的项目管理工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建。它主要有三个功能:
依赖管理 | 方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题 | |
---|---|---|
统一项目结构 | 提供标准、统一的项目结构 | |
项目构建 | 标准跨平台 (Linux、Windows.Macos) 的自动化项目构建方式 |
它的官网如下: http://maven.apache.org/
创建Maven项目
创建maven项目前,我们必须先下载安装maven,且IDEA做一些简单配置。本文不在赘述!
使用IDEA创建maven项目非常容易,我们只需要新建项目,在Build system一栏中选择Maven即可
点击create按钮后,项目会自动创建,并下载一些依赖
maven项目结构简析
使用IDEA创建的maven项目结构如下:
- pom.xml是Maven项目的核心配置文件,包含了项目的各种信息和依赖。
默认配置中包含一个基本的maven坐标信息
<groupId>org.example</groupId>
<artifactId>Maven_demo</artifactId>
<version>1.0-SNAPSHOT</version>
什么是坐标
- Maven 中的坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置。
- 使用坐标来定义项目或引入项目中需要的依赖。
Maven 坐标主要组成
- groupld:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.shixiaoshi)
- artifactld:定义当前Maven项目名称(通常是模块名称,例如 order-service、goods-service)
- version:定义当前项目版本号
和项目编译打包的jdk版本
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
- src/main/java:这个目录下存放的是项目的Java源代码。其中,每个Java包对应一个目录,例如com.example.app对应的就是com/example/app这个目录。
- src/main/resources:这个目录下存放的是项目的资源文件,例如配置文件,图片等。
- src/test/java:这个目录下存放的是项目的测试代码。和src/main/java类似,每个Java包对应一个目录。
hello world
我们写个简单的hello world打印下。先创建一个first包,包里有个helloWorld
当我们运行程序时,我们会发现项目多了一个target包,这个包内的文件就是编译后的字节码文件
依赖管理
依赖管理是maven最核心的功能,它主要包含四个方面
- 依赖配置
- 依赖传递
- 依赖范围
- 生命周期
依赖配置
依赖:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖。
配置依赖非常容易,比如我们要增加日志相关的依赖,在pom.xml中增加如下标签
<dependencies></dependencies>
然后在标签中配置依赖的坐标信息
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
作为新手,标签的依赖信息可以官方网站搜索关键词复制
最后点击界面右上角的“刷新”按钮,等待即可(test一栏可以删除,刷新后需要等待依赖下载,字体红色变白即可)
依赖传递
直接依赖与间接依赖
依赖具有传递性,如下图:
A项目依赖项目B和一个jar包A,jar包A称为A项目的直接依赖:
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
项目B依赖项目C和jar包B,项目C依赖jar包C,jar包B和jar包C称为A项目的间接依赖:
- 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
依赖之间的关联演示
我们来感受下
首先,我们导入三个相互关联的maven项目
如图,我们在A项目的pom文件中按中ctrl点击maven-projectB可以进入B项目的pom文件,在B项目的pom文件中点击maven-projectC可以进入C项目,这说明了他们之间的相互依赖性
我们也可以在编译器的maven面板中看到这些项目之间的依赖
在IDEA中,也提供了可视化面板观察项目中的依赖。比如我们观察A项目的依赖![image.png](https://cdn.nlark.com/yuque/0/2023/png/21865277/1699350387205-89115745-6cf5-46ab-ba1a-ab04e12b8608.png#averageHue=%233e4349&clientId=u7cf56a6e-00e4-4&from=paste&height=350&id=uea03f40d&originHeight=438&originWidth=654&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=33861&status=done&style=shadow&taskId=u223e8630-95d1-4efe-bda8-427a454e843&title=&width=523.2)
排除依赖
假设A项目不想关联B项目中的junit依赖改怎么做呢?
在Maven中,可以通过在项目的pom.xml文件中使用exclusions元素排除特定的依赖。我们以A项目排除B项目的junit依赖为例
标签内部为每个你想排除的依赖添加一个元素。每个元素应包含你想要排除的依赖的groupId和artifactId。更改完成记得点击编译器右上角的“刷新”按钮
依赖范围
默认情况下,pom文件内配置的依赖在任何地方都可以使用。其作用范围如下:
- 主程序范围有效。(main文件夹范围内)
- 测试程序范围有效。(test文件夹范围内)
打包后的程序
![image.png](https://cdn.nlark.com/yuque/0/2023/png/21865277/1699352637834-116aa672-0473-4816-adab-821a2e454375.png#averageHue=%233d4242&clientId=u7cf56a6e-00e4-4&from=paste&height=115&id=u2de5fafc&originHeight=179&originWidth=584&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=13106&status=done&style=shadow&taskId=uc3d3340d-430c-4d88-a6f0-1e68e3202fa&title=&width=374.20001220703125)
当然,我们也可以通过...</ scope> 设置其作用范围。
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> + <scope>test</scope> </dependency>
scope的取值有四种,它们的作用范围如下:
![image.png](https://cdn.nlark.com/yuque/0/2023/png/21865277/1699352790855-fe27bf26-8ca1-494c-b062-fc6638f7fe97.png#averageHue=%23e5beba&clientId=u7cf56a6e-00e4-4&from=paste&height=162&id=u06031f9b&originHeight=282&originWidth=1047&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=147879&status=done&style=shadow&taskId=ude2492b6-630b-4792-a806-21d264c6e17&title=&width=602.4000244140625)
我们以A项目为例,来验证下test作用范围。A项目的pom文件如下
<dependencies> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> + <scope>test</scope> </dependency> <dependency> <groupId>com.shixaoshi</groupId> <artifactId>maven-projectB</artifactId> <version>1.0-SNAPSHOT</version> <!--排除依赖--> <exclusions> <exclusion> <groupId>junit</groupId> <artifactId>junit</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
它引入了logback-classic的依赖,这意味着,在其作用范围内是可以使用logback-classic包提供的相关功能的。
logback-classic提供了一个Logger类(ch.qos.logback.classic.Logger),我们验证使用这个类时有没有智能提示即可。test文件范围验证
我们在test的java目录下创建一个包名为com.shixiaoshi的Test类,在主程序中使用Logger类试试
如图,编译器有智能提示,这说明test文件范围内是有效的。main程序验证
如图,我们并找不到ch.qos.logback.classic.Logger路径下的Logger类,这说明,这个包在main文件范围内是不生效的。
那我们删除test配置呢?
如图,删除test配置后,main文件范围内就可以使用logback-classic依赖了!
生命周期
生命周期简介
Maven的生命周期是对所有的构建过程进行抽象和统一,包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有的构建步骤。
Maven中有3套相互独立的生命周期:
clean生命周期 | default生命周期 | site生命周期 |
---|---|---|
pre-clean | validate | pre-site |
clean: |
清理上一次构建生成的文件。 | compile:编译源代码。 | site |
| post-clean | test:使用合适的单元测试框架运行测试。 | post-site |
| | package:将产品打包成jar或其他格式 | |
| | install:
将打包的产物安装到本地仓库,供其他项目使用。 | |
| | deploy | |
我们并不需要理解全部的生命周期。
在编译器的面板中,也已经集成好了这些生命周期:
执行指定生命周期
生命周期的执行方式有两种:
在idea中,右侧的maven工具栏,选中对应的生命周期,双击执行
如图,我们执行了compile声明周期,编译出了target目录。
在命令行中,通过命令执行
如图,我们在命令行执行了 mvn clean命令,target编译目录被清除了。