本文章笔记整理来自黑马视频https://www.bilibili.com/video/BV1Ah411S7ZE
1.Maven简介
(1)传统项目管理状态分析
(2)Maven介绍
Maven的本质是一个项目管理工具,它将项目开发和管理过程抽象成一个项目对象模型 (POM),其中的POM (Project Object Model)指的是项目对象模型。
(3)Maven的作用
① 项目构建:提供标准的、跨平台的自动化项目构建方式。 ② 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题。 ③ 统一开发结构:提供标准的、统一的项目结构。
2.Maven的下载与安装
(1)下载Maven(Windows版)
① Maven官方网址为https://maven.apache.org/。 ② 下载Windows版本的安装包和源代码即可。 或者直接到https://archive.apache.org/dist/maven/maven-3中选择合适的版本进行下载。这里我下载的是3.8.1的版本(如下图所示)。
(2)安装Maven
① 将上面下载的安装包放到合适的目录下(路径名称最好不要有中文或其它特殊字符),并进行解压(Maven属于绿色版软件,解压即安装),解压进去之后如下图所示。 ② 配置环境变量(需要提前安装配置好JDK,版本为1.7及以上) ③ 测试Maven是否安装成功,只需要在命令行窗口中输入命令mvn或mvn -v,如果出现了类似下面的信息,则说明Maven已经安装成功。
3.Maven基础概念
(1)仓库
① 仓库:用于存储资源,包含各种jar包 ② 仓库分类:
本地仓库 | 自己电脑上存储资源的仓库,连接远程仓库获取资源 |
---|
远程仓库 | 非本机电脑上的仓库,为本地仓库提供资源 |
除此之外,远程仓库又分为以下两种:
中央仓库 | 由Maven团队维护,存储所有资源的仓库 |
---|
私服 | 部门/公司范围内存储资源的仓库,从中央仓库获取资源 |
③ 私服的作用: 1)保存具有版权的资源,包含购买或自主研发的jar(中央仓库中的jar都是开源的,不能存储具有版权的资源)。 2)在一定范围内共享资源,仅对内部开放,不对外共享。
(2)坐标
① 坐标指的是用于描述仓库中资源的位置(见网站https://repo1.maven.org/maven2/)。 ② Maven坐标主要组成:
groupld | 定义当前Maven项目隶属组织名称(通常是域名反写,例如: org.mybatis) |
---|
artifactld | 定义当前Maven项目名称(通常是模块名称,例如CRM、SMS) | version | 定义当前项目版本号 |
③ Maven坐标的作用: 使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成。
(3)本地仓库配置
① Maven启动后,会自动保存下载的资源到本地仓库。 ② conf目录下的settings.xml文件是Maven的全局配置文件,里面说明的默认位置如下:
<localRepository>${user.home}/.m2/repository</localRepository>
该位置位于C盘中,但一般来说,资源保存的位置最好自定义在其它盘中,例如在settings.xml文件中可以自定义位置(下面的配置应在settings标签内):
<localRepository>E:\softwares\Maven\repository</localRepository>
(4)远程仓库配置
Maven默认连接的仓库位置如下:
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<ur1>https://repo.maven.apache.org/maven2</ur1>
<layout>default</ layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
(5)镜像仓库配置
但由于默认仓库位于国外的服务器上,所以如果在国内进行访问,那么速度一般会很慢,所以可以使用国内的镜像仓库,例如阿里云镜像仓库,在settting.xml中配置阿里云镜像仓库:
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun. com/nexus/content/groups/public</url>
</mirror>
</mirrors>
(6)全局setting与用户setting
① 全局settting定义了当前计算器中Maven的公共配置(conf目录下的settings.xml文件)。 ② 用户settting定义了当前用户的配置(可以将conf目录下的settings.xml文件复制一份出来,放在其它位置,并可以对其进行自定义修改),当用户setting与全局setting不一致时,前者会覆盖后者。
4.Maven项目创建
(1)手动创建
按照下面的Maven工程目录结构手动创建一个Maven项目(具体创建过程可以观看视频p6)。
(2)插件创建
① 创建工程
mvn archetype:generate
-DgroupId={project-packaging}
-DartifactId={project-name}
-DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false
② 创建java工程
mvn archetype:generate -DgroupId=com.itheima -DartifactId=java-project -
DarchetypeArtifactId=maven-archetype-quickstart -Dversion=0.0.1-snapshot -
DinteractiveMode=false
③ 创建web工程
mvn archetype:generate -DgroupId=com.itheima -DartifactId=web-project -
DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot -
DinteractiveMode=false
(3)IDEA创建
① 在IDEA中配置好Maven环境
② 创建Maven工程
至此,一个Maven工程便创建好了。除此之外,若想改变文件夹的资源类型,也可以右键点击,选择Mark Directory as进行修改(一般保持Maven的默认即可)。 在pom.xml中引入需要的依赖,此处以Junit的jar为例(初次引入时需要联网下载,若代码报错,可以点击右侧的Maven按键,在里面选择刷新),那么这样Junit的jar包就导入到项目里了。
<?xml version="1.0" encoding="UTF-8"?>
<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>
<groupId>com.itheima</groupId>
<artifactId>java01</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
具体资源坐标在pom.xml中的表示方式见网站https://mvnrepository.com/。
③ 编写测试代码
package com.itheima;
public class Demo {
public String say(String name){
System.out.println("Hello "+name);
return "Hello "+name;
}
}
package com.itheima;
import org.junit.Assert;
import org.junit.Test;
public class DemoTest {
@Test
public void testSay(){
Demo d = new Demo();
String ret = d.say("itheima");
Assert.assertEquals("Hello itheima",ret);
}
}
④ 利用Maven操作项目 或者使用另外一种方式:
④ 使用Maven模板创建项目
1)创建普通Java项目 注:resources目录需要手工添加,并且标记为与上面一样的资源类型。 2)创建Java Web项目 配置pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<groupId>com.itheima</groupId>
<artifactId>web01</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
注:缺失的目录需要手工添加,并且标记为与上面一样的资源类型。
5.依赖管理
(1)依赖配置
① 依赖指当前项目运行所需的jar,一个项目可以设置多个依赖。 ② 格式:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactrd>junit<lartifactid>
<version>4.12</version>
</dependency>
</dependencies>
(2)依赖传递
① 依赖具有传递性 1)直接依赖:在当前项目中通过依赖配置建立的依赖关系。 2)间接依赖:被资源的资源如果依赖其他资源,当前项目间接依赖其他资源。 ② 依赖传递冲突问题 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高。 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的。 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的。 ③ 如果project-1想使用project-2,那么需要将project-2作为资源配置到project-1中,即将project-2对应的坐标(包括groupId、artifactId、version)以依赖的形式(即使用dependency标签)复制到project-1中的pom.xml中即可。
(3)可选依赖
可选依赖指对外隐藏当前所依赖的资源——不透明
<dependency>
<groupId>junit</groupid>
<artifactrd>junit</ artifactrd>
<version>4.12</version>
<optional>true</optional>
</dependency>
(4)排除依赖
排除依赖指主动断开依赖的资源,被排除的资源无需指定版本——不需要
<dependeney>
<groupId>junit</groupid>
<artifactId>junit</artifactid>
<version>4.12</version>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupid>
<artifactId>hamerest-core</artifactId>
</exelusion>
</exclusions>
</dependency>
(5)依赖范围
① 依赖的jar默认情况可以在任何地方使用,可以通过scope标签设定其作用范围 ② 作用范围 1)主程序范围有效(main文件夹范围内) 2)测试程序范围有效(test文件夹范围内) 3)是否参与打包(package指令范围内) ③ 依赖范围传递性 带有依赖范围的资源在进行传递时,作用范围将受到影响
6.生命周期与插件
(1)生命周期
① Maven构建生命周期描述的是一次构建过程经历经历了多少个事件 ② Maven对项目构建的生命周期划分为一下3套:
clean | 清理工作 |
---|
default | 核心工作,例如编译,测试,打包,部署等 | site | 产生报告,发布站点等 |
其中clean的生命周期如下:
pre-clean | 执行一些需要在clean之前完成的工作 |
---|
clean | 移除所有上一次构建生成的文件 | post-clean | 执行一些需要在clean之后立刻完成的工作 |
default构建的生命周期如下: site构建的生命周期如下:
pre-site | 执行一些需要在生成站点文档之前完成的工作 |
---|
site | 生成项目的站点文档 | post-site | 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备 | site-deploy | 将生成的站点文档部署到特定的服务器上 |
(2)插件
① 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能。 ② 默认maven在各个生命周期上绑定有预设的功能。 ③ 通过插件可以自定义其他功能。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<goals>
<goal>jar</goal>
<goal>test-jar</goal>
</goals>
<phase>generate-test-resources</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
此时对下面的这张图应该有了更深的理解。
7.分模块开发与设计
首先,需要提前准备好一个基于Maven的SSM项目(功能可以非常简单),然后按照下图来进行模块拆分。
(1)POJO模块拆分
(2)Dao模块拆分
(3)service模块拆分
(4)controller模块拆分
(5)总结
(1)模块中仅包含当前模块对应的功能类与配置文件。 (2)spring核心配置根据模块功能不同进行独立制作。 (3)当前模块所依赖的模块通过导入坐标的形式加入当前模块后才可以使用。 (4)web.xml需要加载所有的spring核心配置文件。
8.聚合
(1)作用
聚合用于快速构建maven工程,一次性构建多个项目/模块。
(2)制作方式
① 创建一个空模块,打包类型定义为pom
<packaging>pom</packaging>
② 定义当前模块进行构建操作时关联的其他模块名称
<modules>
<module>../ssm_controller</module>
<module>../ssm_service</module>
<module>../ssm_dao</module>
<module>../ssm_pojo</module>
</modules>
注:参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关。
9.继承
(1)模块依赖关系维护
(2)继承作用与制作方式
① 作用:通过继承可以实现在子工程中沿用父工程中的配置(Maven中的继承与java中的继承相似,在子工程中配置继承关系) ② 制作方式:在子工程中声明其父工程坐标与对应的位置
<parent>
<groupId>com.itheima</groupId>
<artifactId>ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../ssm/pom.xml</relativePath>
</parent>
(3)继承依赖定义与依赖使用
① 在父工程中定义依赖管理
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependencies>
<dependencyManagement>
② 在子工程中定义依赖关系,无需声明依赖版本,版本参照父工程中依赖的版本
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
</dependencies>
此外,需要注意的是继承的资源如下:
(4)继承与聚合的比较
| 继承 | 聚合 |
---|
作用 | 用于快速配置 | 用于快速构建项目 | 相同点 | 聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中 | 聚合与继承均属于设计型模块,并无实际的模块内容 | 不同点 | 聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些 | 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己 |
10.属性版本管理
(1)属性类别
自定义属性、内置属性、Setting属性、Java系统属性、环境变量属性
(2)属性类别:自定义属性
① 作用:等同于定义变量,方便统一维护 ② 定义格式:
<properties>
<spring.version>5.1.9.RELEASE</spring.version>
<junit.version>4.12</junit.version>
</properties>
③ 调用格式:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
(3)属性类别:内置属性
① 作用:使用Maven内置属性,快速配置 ② 调用格式:
${basedir}
${version}
(4)属性类别:Setting属性
① 作用:使用Maven配置文件setting.xml中的标签属性,用于动态配置 ② 调用格式:
${settings.localRepository}
(5)属性类别:Java系统属性
① 作用:读取Java系统属性 ② 调用格式:
${user.home}
③ 系统属性查询方式:
mvn help;system
(6)属性类别:环境变量属性
① 作用:使用系统环境变量的标签属性,用于动态配置 ② 调用格式:
${env.JAVA_HOME}
③ 环境变量属性查询方式:
mvn help;system
11.版本管理
(1)工程版本区分
(2)工程版本分类
SNAPSHOT(快照版本) | 项目开发过程中,为方便团队成员合作,解决模块间相互依赖和时时更新的问题,开发者对每个模块进行构建的时候,输出的临时性版本叫快照版本(测试阶段版本)。此外,快照版本会随着开发的进展不断更新。 |
---|
RELEASE(发布版本) | 项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的,即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本。 |
(3)工程版本号约定
约定规范: ① <主版本>、<次版本>、<增量版本>、<里程碑版本> ② 主版本:表示项目重大架构的变更,例如: Spring5相较于Spring4的迭代。 ③ 次版本:表示有较大的功能增加和变化,或者全面系统地修复漏洞 ④ 增量版本:表示有重大漏洞的修复。。 ⑤ 里程碑版本:表明一个版本的里程碑(版本内部)。这样的版本同下一个正式版本相比,相对来说不是很稳定,有待更多的测试。 示例: 5.1.9.RELEASE
12.资源配置
(1)作用
在任意配置文件(此处以数据库配置文件jdbc.properties为例)中加载pom.xml文件中定义的属性。
(2)调用格式:
jdbc.url=${jdbc.url}
(3)开启配置文件加载pom.xml中的属性
<properties>
<jdbc.url>jdbc:mysql://localhost:3306/ssm_db</jdbc.url>
</properties>
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
12.多环境开发配置
(1)多环境兼容
(2)在pom.xml中进行多环境配置
<profiles>
<profile>
<id>pro_env</id>
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>dep_env</id>
<properties>
<jdbc.url>jdbc:mysql://127.2.2.2:3306/ssm_db</jdbc.url>
</properties>
</profile>
</profiles>
(3)加载指定环境
① 作用:加载指定环境配置 ② 调用格式:
mvn 指令 -P 环境定义id
③ 示例:
mvn install -P pro_env
13.跳过测试
(1)跳过测试环节的应用场景
① 整体模块功能未开发 ② 模块中某个功能未开发完毕 ③ 单个功能更新调试导致其他功能失败 ⑤ 需要快速打包
(2)使用命令跳过测试
① 命令:
mvn 指令 -D skipTests
② 注意事项:执行的指令生命周期必须包含测试环节
(3)使用界面操作跳过测试
(4)使用配置跳过测试
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<skipTests>true</skipTests>
<includes>
<include>** /User*Test.java</include>
</includes>
<excludes>
<exclude>**/User*TestCase.java</exclude>
</exeludes>
</configuration>
</plugin>
14.私服
(1)分模块开发合作
(2)下载、安装、启动与配置Nexus
Nexus是Sonatype公司的一款maven私服产品。
① 下载
下载地址为:https://help.sonatype.com/repomanager3/download
② 安装
下载之后并解压,然后改名为nexus。
③ 启动
启动命令为:nexus /run nuxus 访问地址为:http://localhost:8081/
④ 配置
1)修改基础配置信息 安装路径下etc目录中nexus-default.properties文件保存有nexus基础配置信息,例如默认访问端口 2)修改服务器运行配置信息 安装路径下bin目录中nexus.vmoptions文件保存有nexus服务器启动对应的配置信息,例如默认占用内存空间
(3)获取私服资源
(4)仓库分类
① 宿主仓库hosted 保存无法从中央仓库获取的资源(一般来自于自主研发或者第三方非开源项目)。 ② 代理仓库proxy 代理远程仓库,通过nexus访问其他公共仓库,例如中央仓库。 ③ 仓库组group 将若干个仓库组成一个群组,简化配置。此外,仓库组不能保存资源,属于设计型仓库。 上传资源时要提供的信息如下: 保存的位置(宿主仓库)、资源文件、对应坐标
(5)IDEA环境中资源上传与下载
(6)访问私服配置
① 本地仓库访问私服 1)配置本地仓库访问私服的权限(setting.xml)
<servers>
<server>
<id>heima-release</id>
<username>admin</username>
<password>admin</password>
</server>
<server>
<id>heima-snapshots</id>
<username>admin</username>
<password>admin</password>
</server>
</servers>
2)配置本地仓库资源来源(setting.xml)
<mirrors>
<mirror>
<id>nexus-heima</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
② 项目工程访问私服 1)配置当前项目访问私服上传资源的保存位置(pom.xml)
<distributionManagement>
<repository>
<id>heima-release</id>
<url>http://localhost:8081/repository/heima-release/</url>
</repository>
<snapshotRepository>
<id>heima-snapshots</id>
<url>http://localhost:8081/repository/heima-snapshots/</url>
</snapshotRepository>
</distributionManagement>
2)发布资源到私服的命令
mvn deploy
|