Maven概述
Maven概述
Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具
maven的作用
- 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题
- 统一项目结构:提供标准、统一的项目结构
- 项目构建:标准跨平台的自动化项目构建方式
maven的安装
- 下载
maven安装包 apache-maven-4.0.0-rc-2-bin - 配置本地仓库:修改
conf/settings.xml文件中的localRepository标签为一个指定目录 - 配置阿里云私服:修改
conf/settings.xml文件中的mirror标签,为其添加如下子标签
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
- 配置环境变量:将
maven安装目录下的bin目录添加到PATH环境变量中 - 验证:打开cmd窗口,输入
mvn -v,如果出现如下信息,则表示安装成功
maven坐标的主要组成
- groupld:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itheima)
- artifactld:定义当前Maven项目名称(通常是模块名称,例如 order-service、goods-service)
- version:定义当前项目版本号
依赖管理
依赖配置
依赖:指当前项目运行时所需要的jar包,一个项目可以引入多个依赖
- 在 pom.xml中编写
<dependencies>标签 - 在
<dependencies>标签中 使用<dependency>引入依赖 - 定义坐标的
groupld,artifactld,version - 点击刷新按钮,引入最新加入的坐标
<dependencies>
<!-- 每一个依赖-->
<!--依赖的坐标信息-->
<dependency>
<!--组织名-->
<groupld>ch.qos.logback</groupld>
<!--依赖名称-->
<artifactld>logback-classic</artifactld>
<!--版本号-->
<version>1.2.3</version>
</dependency>
</dependencies>
注意
- 如果本地依赖不存在,将会链接远程仓库/中央仓库,下载依赖项
- 如果不知道依赖的坐标信息可以到
中搜索
依赖传递
依赖具有传递性
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
排除依赖
排除依赖指主动断开依赖的资源,被排除的资源无需指定版本。
<dependency>
<groupld>com.itheima</groupld>
<artifactld>maven-projectB</artifactld>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupld>junit</groupld>
<artifactld>junit</artifactld>
</exclusion>
</exclusions>
</dependency>
依赖范围
依赖的jar包,默认情况下,可以在任何地方使用。可以通过**<scope>..</scope>**设置其作用范围作用范围:
- 主程序范围有效。(main文件夹范围内)
- 测试程序范围有效。(test文件夹范围内)
- 是否参与打包运行。(package指令范围内)
scope取值
scope值 | 主程序 | 测试程序 | 打包(运行) | 范例 |
|---|---|---|---|---|
| compile(默认,全局有效) | √ | √ | √ | log4j |
| text (在测试程序范围有效) | - | √ | - | junit |
| provided (在主程序和测试范围都有效,但不参与打包) | √ | √ | - | servlet-api |
| runtime | - | √ | √ | mysql、jdbc驱动 |
生命周期
Maven的生命周期就是为了对所有的maven项目构建过程进行抽象和统-
Maven中有3套相互独立的生命周期:
- clean:清理工作。
- default:核心工作,如:编译、测试、打包、安装、部署等。
- site:生成报告、发布站点等。
生命周期中的阶段:
- clean:移除上一次构建生成的文件
- compile:编译项目源代码
- text:使用合适的单元测试框架运行测试(junit)
- package:将编译后的文件打包,如:jar、war等
- install:安装项目到本地仓库
使用idea创建SpringBoot项目
- 创建springboot工程,填写模块信息,并勾选web开发相关依赖
- 创建请求处理类HelloController,添加请求处理方法 hello,并添加注解
//Controller软件包
package com.springboot.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/hone")
public String hello() {
return "Hello World!";
}
}
分模块设计与开发
- 分模块设计:将项目按照功能拆分成多个子模块,方便项目的管理维护、拓展也方便模块间的相互调用,资源共享
继承
- 概念:继承描述的是两个工程之间的关系,与java中的继承类似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承
- 作用:简化依赖配置、统一管理依赖
- 实现
<parent>...</parent>标签
maven继承关系的实现
- 打包方式
jar:普通模块打包、springboot项目基本都是jar包(内嵌Tomcat运行)war:war包,用于部署到外部Tomcat服务器上运行pom: 父工程或聚合工程,该模块不写代码,仅进行依赖管理
- 创建
maven父工程文件,需设置打包方式为pom
- 在
maven工程中,一个工程只能继承一个父工程
<packaging>pom</packaging>
- 在工程的
pom.xml文件中,配置继承关系 - 在父工程中配置各个工程的共有依赖(子工程会自动继承父工程的依赖)
版本锁定
在maven中,可以在父工程的pom文件中通过<dependencyManagement>标签,锁定子工程所依赖的版本,从而避免版本冲突
#父工程 pom.xml
<dependencyManagement>
<dependencies>
<dependency>
<groupld>io.jsonwebtoken</groupld>
<artifactld>jjwt</artifactld>
#锁定子工程版本
<version>0.9.1</version>
</dependency>
</dependencies>
</dependencyManagement>
注意
- 父工程锁定版本后,子工程在引入依赖时就无需指定依赖的版本号,依赖版本由父工程统一管理,变更依赖版本,只需在父工程中统一变更即可
<dependencyManagement>标签仅仅管理依赖的版本,不进行依赖的引入
dependencies标签与dependencyManagement标签的区别
dependencies标签用于引入依赖,是直接依赖,在父工程中配置了依赖,子工程就会直接继承下来dependencyManagement标签用于管理依赖的版本,不进行依赖的引入,还需要在子工程中引入所需依赖(无需指定版本`)
自定义属性/引入属性
- 自定义属性在
pom.xml文件中以<properties>标签进行定义,自定义属性的引入,以${}进行引入
#定义自定义属性
<properties>
<lombok.version>2.6.3</lombok.version>
</properties>
#使用自定义属性
<dependencies>
<dependency>
<groupld>org.projectlombok</groupld>
<artifactld>lombok</artifactld>
<version>${lombok.version}</version>
</dependency>
</dependencies>
聚合
- 功能:主要用于项目构建,将多个模块组织成一个整体,同时进行项目构建
- 作用:快速构建项目(无需根据依赖关系手动构建,直接在聚合工程上构建即可)
聚合工程
- 一个不具有业务功能的“空”工程(有且仅有一个
pom.xml文件,没有源代码,没有测试代码,没有资源文件,没有web.xml文件),一般使用父工程来做为聚合项目
使用
在一个maven工程中通过使用modules标签,设置当前聚合工程所包含的所有子模块的名称
#父工程 pom.xml
<modules>
<module>子工程1</module>
<module>子工程2</module>
</modules>
注意
- 聚合工程中所包含的模块,在构建时,会自动根据模块间的依赖关系设置构建顺序,与聚合工程中模块的配置书写位置无关
私服
- 私服是一种特殊的远程仓库,他是架设在局域网内额仓库服务,用来代理位于外部的中央仓库,用来解决团队内部的资源共享与资源同步问题