Maven相关知识点整理
- Maven概念
- Maven的作用
- maven下载地址
- maven环境变量配置
- 仓库
- 坐标
- 本地仓库配置
-
- 本地仓库具体配置步骤:
- 远程仓库配置
-
- 镜像仓库配置
-
- 步骤;
- 全局setting 和 用户setting 区别
- maven工程目录结构
- maven项目构建命令
- 插件创建工程
- 使用maven创建java项目的pom.xml配置演示---不使用骨架
- 使用maven创建java项目的pom.xml配置演示---使用骨架
- 使用maven创建web项目的pom.xml配置演示---不使用骨架
- 使用tomcat插件启动web项目
- 依赖配置---dependencies
-
- 依赖传递
- 依赖冲突问题
- 可选依赖---对外隐藏
- 排除依赖
- 依赖范围
- 依赖范围传递性
- 生命周期与插件
-
- clean生命周期
- default构建生命周期
- 插件---build
- 可以使用alt + insert快速导入jar包和插件
- Maven高级部分
-
- 分模块开发与设计
-
- 介绍
- SSM项目多模块开发作为案例
- 聚合
-
- 多模块构建维护
- 作用
- 创建一个聚合模块,完成对分模块的统一管理
- 小结
- 继承
-
- 实现
- 继承依赖定义与使用
- 同样也可以在父工程中对插件的版本进行统筹管理
- 继承的资源
- 继承与聚合
- 属性
-
- 版本统一的重要性
-
- 场景
- 定义【每个项目的父工程必须导入一下三个属性】
- 属性类别
-
- 自定义属性
- 内置属性
- setting属性
- Java系统属性
- 环境变量属性
- 每个项目的父工程必须导入一下三个属性
- 版本管理
-
- 工程版本
-
- 工程版本号约定
- 资源配置
-
- 资源配置多文件维护
- 配置文件引用pom属性
- 多环境开发配置
-
- 多环境兼容
- 多环境配置
- 加载指定环境
- 跳过测试
-
- 使用命令跳过测试---适用所有maven项目
- 使用配置跳过测试
- Maven的常用指令
- 私服---小范围内资源共享
-
- 分模块合作开发
- Nexus
- Nexus*安装、启动与配置
- 私服资源获取
- 仓库分类
- 资源上传
- idea环境中资源上传与下载
-
- 本地仓库访问私服
- 访问私服配置( 项目工程访问私服)
Maven概念
Maven的作用
maven下载地址
maven官网下载地址
maven环境变量配置
MAVEN_HOME环境配置:
检测maven配置成功的标识:
仓库
坐标
本地仓库配置
本地仓库具体配置步骤:
远程仓库配置
镜像仓库配置
步骤;
<!--配置具体的仓库下载镜像-->
<mirror>
<!--此镜像的唯一标识符,用来区分不同的mirror元素-->
<id>nexus-aliyun</id>
<!--对那种仓库镜像,简单说就是替代哪个仓库-->
<mirrorOf>central</mirrorOf>
<!--镜像名称-->
<name>Nexus aliyun</name>
<!--镜像URL-->
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
全局setting 和 用户setting 区别
maven工程目录结构
maven构建的web项目与普通的java项目区别在于,少了一个wepapp文件
maven项目构建命令
clean清理的是target目录
插件创建工程
cmd窗口中输入以下命令即可:
使用maven创建java项目的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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--当前项目的坐标-->
<groupId>org.example</groupId>
<artifactId>111</artifactId>
<version>1.0-SNAPSHOT</version>
<!--
打包方式:
1.jar: java项目。 默认值
2. war: web项目
3. pom
-->
<packaging>jar</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
还需要在测试目录下面,添加一个resource文件,这样目录结构就完整了
使用maven创建java项目的pom.xml配置演示—使用骨架
如果有需要可以创建两个resource文件,用来存放配置文件
使用maven创建web项目的pom.xml配置演示—不使用骨架
首先要在pom.xml中规定打包方式为war包
补齐webapp目录结构
使用tomcat插件启动web项目
需要配置tomcat插件,可以在配置插件的同时通过port和path配置端口号和虚拟目录
依赖配置—dependencies
依赖传递
依赖冲突问题
可选依赖—对外隐藏
排除依赖
依赖范围
默认为complie
<scope>test</scope>
依赖范围传递性
生命周期与插件
clean生命周期
default构建生命周期
插件—build
使用Build方式添加
生命周期是几岁,插件是几岁干了什么事情
上面的插件是在测试阶段,对源码进行打包
<goal>jar</goal>
<goal>test-jar</goal>
上面的写法是同时打两个包,一个源码包,一个一个测试包
execution是执行的意思,goal是目标的元素,phase是时期的意思
可以使用alt + insert快速导入jar包和插件
快速导入的前提是本地仓库有相关jar包或者插件
Maven高级部分
分模块开发与设计
介绍
如果项目很大,那么可以在项目搭建时,考虑使用 Maven 多模块功能。比如一个能力平台,可能分为API 模块、日志模块与计费模块等等。这样做的好处是:
(1) 方便重用。一个新项目如果需要使用某个模块时,就可以直接将其依赖过来;
(2) 每个模块都有各自的 pom.xml 配置,可以根据模块需要添加各自的第三方依赖;
(3) 每个模块都可以独立进行构建,特别是在微服务项目,我们可以把某些已经稳定的模块发布到 docker镜像中,然后只构建我们目前仍然需要进行开发的项目;
(4) 某些模块可以打成 jar作为公共组件库以供其它项目依赖使用。
SSM项目多模块开发作为案例
将SSM项目拆分为多个模块进行开发
ssm_pojo拆分:
1.新建模块
在同级目录下建立模块
new module-->maven -->组名com.itheima
名称--ssm_pojo-->放置在同级别目录下
2.拷贝原始项目中对应的相关内容(实体类)到ssm_pojo中
domain包全表拷贝
3.配置文件 不做修改
# 由于实体类的API全是idea自带,故不去修改配置
4.compile:编译
测试编译是否通过
添加到本地仓库 的操作install,如果不添加到本地仓库,那么maven就无法找到对应的资源
ssm_dao拆分
1.新建模块
在同级目录下建立模块
new module-->maven -->组名com.itheima
名称--ssm_dao-->放置在同级别目录下
2.拷贝原始项目中对应的相关内容到ssm_dao中
* 数据层接口
* 配置文件:保留与数据层相关配置文件3个
* 注意:分页插件在配置中与SqlSessionFactoryBear绑定,需要保留
3.配置文件pom.xml 引入数据层相关坐标即可,删除springmvc相关坐标
*spring
*mybatis
*spring整合mybatis
*mysql
*druid
*pagehelper
*导入资源文件=>直接依赖ssm_pojo,需要对ssm_pojo模块执行install指令,将其安装到本地仓库
4.compile:编译
(编译要保证仓库有对应的资源)
测试编译是否通过(需要先对ssm_pojo模块执行install指令),否则仓库里找不到
当我们编译模块时,必须保证仓库有对应的资源
ssm_service拆分
1.新建模块
在同级目录下建立模块
new module-->maven -->组名com.itheima
名称--ssm_service-->放置在同级别目录下
2.拷贝原始项目中对应的相关内容到ssm_service中
业务层接口与实现类(xxxService和xxxServiceImpl)
保留与数据层相关配置
3.配置文件 pom.xml 引入数据层相关坐标即可,删除springmvc相关坐标
*spring
*junit
*spring整合junit
*直接依赖ssm_dao(对ssm_dao模块执行install指令,将其安装到本地仓库,在导入依赖)
*间接依赖ssm_pojo(由ssm_dao模块负责依赖关系建立)
4.compile:编译
测试编译是否通过
5.其他
1.修改service模块的spring核心配置文件名,添加模块名称,格式:applicationContext-service.xml
2.修改dao模块的spring核心配置文件名,添加模块名称,格式:applicationContext-dao.xml
3.修改单元测试引入的配置文件名,由单个文件修改为多个文件
ssm_control拆分
1.新建模块
在同级目录下建立模块
new module-->maven (由于是表现层需要选择模板webapp) -->组名com.itheima
名称--ssm_control-->放置在同级别目录下
2.拷贝原始项目中对应的相关内容到ssm_control中
表现层控制器类与相关设置类(controller和异常相关)
配置文件:保留与表现层相关的配置文件,服务器相关配置文件
3.配置文件 pom.xml 引入数据层相关坐标即可,删除springmvc相关坐标
*spring
*springmvc
*jackson
*servlet
*tomcat服务器插件
*直接依赖ssm_service(对ssm_service模块执行install指令,将其安装到本地仓库,在导入依赖)
*间接依赖ssm_pojo和ssm_pojo
4.compile:编译
测试编译是否通过
修改web.xml配置文件中加载spring环境的配置文件名称.使用*通配,加载所有的applicationContext-开始的配置文件
聚合
多模块构建维护
多模块构建维护
多个模块全部 install到了本地仓库
其中一个更新或损坏,会导致其他与他依赖的功能无法运行
解决方法:
定义一个工程进行统一维护管理,即创建一个聚合模块
功能:对管理范围内的模块,进行统一操作
<packaging>war</packaging>
默认打包为jar文件,声明为war,则打包为war文件
作用
作用:聚合用于快速构建内maven工程,一次性构建多个项目/模块
创建一个聚合模块,完成对分模块的统一管理
<!--创建一个空模块,打包类型定义为pom -->
<!--定义该工程用于构建管理 -->
<packaging>pom</packaging>
<!--定义当前模块进行构建操作时关联的其他模块名称 -->
<!--管理工程列表 -->
<modules>
<!--具体的工程名称 -->
<module>../ssm_controller</module>
<module>../ssm_service</module>
<module>../ssm_dao</module>
<module>../ssm_pojo</module>
</modules>
注意事项:参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关
小结
作用:方便进行批量的项目打包等操作
注意事项:参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关
(线性依赖)
同级别的则与配置顺序有关(即非线性依赖)
packaging 默认是jar形式(所有的资源文件都是以jar包形式呈现的)
pom是专门做聚合工程的
war是web工程
继承
起因:各个模块所依赖的配置文件版本未必同步与兼容
模块依赖关系维护
统一管理子项目的资源,即统一管理子项目的依赖版本
继承
作用:通过继承可以实现在子过程中沿用父类中的配置,这里注意沿用父类中依赖的版本
* maven中的继承与java中的继承相似,在子过程中配置继承关系
实现
在每一个子工程中声明其父工程坐标与对应的位置
<!--定义该工程的父工程 -->
<parent>
<!--当前工程的父工程就是ssm工程-->
<groupId>com.itheima</groupId>
<artifactId>ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 填写父工程的pom文件的相对路径 -->
<relativePath>../ssm/pom.xml</relativePath>
</parent>
------------------controller模块------------------------------
<!--原则上子工程和父工程属于同样的组织id,因此groupId可以省略不写-->
<artifactId>ssm_control</artifactId><!--只留下项目id-->
<!--工程版本尽量与父工程保持一致,因此版本号也可以省略不写-->
<!-- 只有controller(web工程的)pom文件需要打包weiwar -->
<packaging>war</packaging>
---------------------service模块-------------------------------------
<!-- 其余的拆分工程(非web工程的)pom文件需要打包jar -->
<!--<artifactId>ssm_service</artifactId>-->
<!--<packaging>jar</packaging>-->
继承依赖定义与使用
在父工程中定义依赖管理
父工程中统一管理版本问题,防止版本不兼容的问题
<!-- 声明此处进行依赖管理-->
<dependencyManagement>
<!-- 具体的依赖-->
<dependencies>
<!--添加自己的工程模块依赖-->
<dependency>
<groupId>com.itheima</groupId>
<artifactId>ssm_pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.itheima</groupId>
<artifactId>ssm_dao</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.itheima</groupId>
<artifactId>ssm_service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--spring环境 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependencies>
<dependencyManagement>
在子工程中定义依赖关系,无需声明依赖版本,版本参照父工程中依赖的版本
<dependencies>
<!--spring环境-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
</dependencies>
同样也可以在父工程中对插件的版本进行统筹管理
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
</plugins>
</pluginManagement>
继承的资源
继承与聚合
作用:
** 聚合用于快速构建项目,聚合模块统筹管理所有模块
** 继承用于快速匹配,统一依赖版本
相同点:
**聚合和继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一pom文件中
** 聚合与继承均属于设计型模块,并无实际内容
不同点:
** 聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些
** 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己
可继承的资源:
子项目必须继承的资源
dependencies
plugins
子项目可选择继承的资源
dependencyManagement : 工程中一般用于统一子项目的依赖版本
pluginManagement
不可继承的资源
artifactld
属性
版本统一的重要性
场景
1.版本更改 不全面,有遗漏,导致部分版本未能更新
2.版本配置有冲突
定义【每个项目的父工程必须导入一下三个属性】
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<属性名称>属性值</属性名称>
</properties>
属性类别
- 自定义属性
- 内置属性
- setting属性
- java系统属性
- 环境变量属性
自定义属性
作用:等同于定义变量,方便统一维护
定义格式
<!--自定义属性 -->
<properties>
<spring.version>5.1.9.RELEASE</spring.version>
<junit.version>4.12</junit.version>
</properties>
调用格式
............父工程..................................
<parent>
<!--当前工程的父工程就是ssm工程-->
<groupId>com.itheima</groupId>
<artifactId>ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 填写父工程的pom文件的相对路径 -->
<relativePath>../ssm/pom.xml</relativePath>
</parent>
...................................................
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--定义工程模块 -->
<!--添加自己的工程模块依赖-->
<dependency>
<groupId>com.itheima</groupId>
<artifactId>ssm_pojo</artifactId>
<!--这里的version是内置属性,是父工程的版本-->
<version>${version}</version>
<!--由于父工程已经定义了版本 可以直接引用 -->
</dependency>
<dependency>
<groupId>com.itheima</groupId>
<artifactId>ssm_dao</artifactId>
<version>${version}</version>
</dependency>
<dependency>
<groupId>com.itheima</groupId>
<artifactId>ssm_service</artifactId>
<version>${version}</version>
</dependency>
内置属性
作用:使用maven内置属性,快速配置
调用格式
${basedir}//项目基础名
${version}
setting属性
作用:使用Maven配置文件setting.xml中的标签属性,用于动态配置
调用格式
${settings.localRepository}
Java系统属性
作用:读取Java系统属性
调用格式
${user.home}
系统属性查询方式
mvn help:system
环境变量属性
作用:使用Maven配置文件setting.xml中的标签属性,用于动态配置
调用格式
${env.JAVA_HOME}
环境变量属性查询方式
mvn help:system
每个项目的父工程必须导入一下三个属性
<properties>
编译编码
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
使用JDK1.8版本
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
版本管理
工程版本
SNAPSHOT(快照版本)
- 项目开发过程中,为方便团队成员合作,解决模块间互相依赖和时时更新的问题
- 开发者对每个模块进行构建的时候,输出的临时性版本较快照版本(测试阶段版本)
- 快照版本会随着开发的进展不断更新
RELEASE(发布版本)
- 项目开发进入到阶段里程碑后,向外发布较为稳定的版本,这种版本对应的构建是稳定的,即便进行功能的后续开发,也不会改变当前
- 发布版本内容,这种版本称为发布版本
工程版本号约定
资源配置
资源配置多文件维护
在父工程中配置
<!--自定义属性-->
<properties>
<!--不写具体的如spring-context 则可以代替全部相关jar包版本-->
<spring.version>5.1.9.RELEASE</spring.version>
<!--比如管理dao的资源配置文件-->
<!-- 可以自定义名称,特别是多个资源文件时 多环境不配置在这个位置-->
<jdbc.url>jdbc:mysql://192.168.93.139:3306/db777</jdbc.rrl>
...
</properties>
</pluginManagement>
<!--配置资源文件对应的信息-->
<resources>
<resource>
<!--通配模式加载相关的资源配置文件-->
<!--${project.basedir}是项目基础名-->
<directory>${project.basedir}/src/mian/resources</directory>
<!--<directory>../ssm_dao/src/mian/resources</directory> 具体某一个资源配置文件-->
<!--<directory>ssm_dao/src/mian/resources</directory> 这种配置错误,会从当前目录下寻找 寻找不到-->
<!-- 开启对配置文件的资源加载过滤 -->
<filtering>true</filtering>
</resource>
</resources>
<!--配置测试资源文件对应的信息-->
<resources>
<resource>
<!--通配模式加载相关的资源配置文件-->
<directory>${project.basedir}/src/test/resources</directory>
<!-- 开启对配置文件的资源加载过滤 -->
<filtering>true</filtering>
</resource>
</resources>
</build>
配置文件引用pom属性
作用
在任意配置文件中加载pom文件中定义的属性
jadc.properties中调用格式
jdbc.url=${jdbc.url}
开启配置文件加载pom属性
<!--自定义属性-->
<properties>
<!--不写具体的如spring-context 则可以代替全部相关jar包版本-->
<spring.version>5.1.9.RELEASE</spring.version>
<!--比如管理dao的资源配置文件-->
<!-- 可以自定义名称,特别是多个资源文件时 多环境不配置在这个位置-->
<jdbc.url>jdbc:mysql://192.168.93.139:3306/db777</jdbc.rrl>
</properties>
....
<!--配置资源文件对应的信息-->
<resources>
<resource>
<!--设定配置文件对应的位置目录,支持使用属性动态设定路径-->
<directory>${project.basedir}/src/main/resources</directory>
<!--开启对配置文件的资源加载过滤-->
<filtering>true</filtering>
</resource>
</resources>
多环境开发配置
多环境兼容
多环境配置
<!--创建多环境-->
<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>dev_env</id>
……
</profile>
</profiles>
加载指定环境
作用
加载指定环境配置
调用格式
mvn 指令 –P 环境定义id
范例
在idea的窗口输入
mvn 指令 –P 环境定义id
如:
mvn install –P pro_env
注意
install 没有指定使用哪一个配置文件 查看仓库的配置文件发现没有加载,还是jdbc.url=${jdbc.url} 没有解析出来
启动install时指定用哪一个
配置启动的指令:
installl -P dep_env //指定开发环境
检查仓库的配置文件jdbc.url=的值 是否已经改变
跳过测试
使用命令跳过测试—适用所有maven项目
- mvn 指令 -D skipTests 或 -DskipTests=true
- 属性跳过 maven.test.skip
- mvn 指令 -Dmaven.test.skip=true
注意事项:
执行的指令生命周期必须包含测试环节
使用配置跳过测试
<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>
</excludes>
</configuration>
</plugin>
Maven的常用指令
mvn clean -X package 输出完整的错误信息
私服—小范围内资源共享
分模块合作开发
Nexus
Nexus是Sonatype公司的一款maven私服产品
下载地址:https://help.sonatype.com/repomanager3/download
Nexus*安装、启动与配置
启动服务器(命令行启动)
nexus /run nexus
// 或者 nexus.exe /run nexus
//后缀可以省略
访问服务器(默认端口:8081)
http://localhost:8081
修改基础配置信息
- 安装路径下etc目录中nexus-default.properties文件保存有nexus基础配置信息,例如默认访问端口
修改服务器运行配置信息
- 安装路径下bin目录中nexus.vmoptions文件保存有nexus服务器启动对应的配置信息,例如默认占用内存空间
私服资源获取
仓库分类
宿主仓库hosted
- 保存无法从中央仓库获取的资源
- 自主研发
- 第三方非开源项目
- https://www.jianshu.com/p/de9806ee4d28
代理仓库proxy
- 代理远程仓库,通过nexus访问其他公共仓库,例如中央仓库
仓库组group
- 将若干个仓库组成一个群组,简化配置
- 仓库组不能保存资源,属于设计型仓库
资源上传
直接图形化操作上传(第三方资源)
注意事项:创建的仓库是什么类型,一般要声明上传的资源的类型
如创建的是release类型仓库,则上传的文件选择SNAPSHOT会报错
如果上传的文件不声明类型,该软件则不会处理
idea环境中资源上传与下载
本地仓库访问私服
配置本地仓库访问私服的权限(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>
配置本地仓库资源来源(setting.xml)
<mirrors>
<mirror>
<id>nexus-heima</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
mirrorOf:的值代表映射哪些资源,这里默认所有资源都去私服获取,而不是中央仓库
访问私服配置( 项目工程访问私服)
配置当前项目访问私服上传资源的保存位置(pom.xml)
<distributionManagement>
<repository>
<!--通过id去找咱在setting.xml配置的用户名和密码登录私服-->
<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>
发布资源到私服命令
mvn deploy