maven【maven】技术详解
Maven
-
Maven的本质是项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
-
Project Object Model:项目对象管理模型
-
作用:
- 项目构建:提供标准的、跨平台的自动化项目构建方式
- 依赖管理:方便快捷的管理项目依赖的资源(jarbao),避免资源间的版本冲突问题
1.下载与安装
- 1.下载:在官网中找到对应版本的maven进行下载,解压到需要安装的目录下即完成了安装
- 2.配置:添加环境变量:
MAVEN_HOME
,以及在path中添加:%MAVEN_HOME%\bin
- 3.本地仓库配置:在maven文件下找到conf文件夹,打开里面的
setting.xml
- 5.仓库控制:
2.仓库
- 用于存储资源,包含各种jar包
3.坐标
- 用于描述仓库中资源的位置
4.Maven工程制作
1)手动制作
1.Maven项目构建命令
- 项目结构:
5.Maven的IDEA生成
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"><!--指定pom的模型版本--><modelVersion>4.0.0</modelVersion><!--打包方式,web工程打包为war,java工程打包为jar--><packaging>war</packaging><!--组织id--><groupId>com.itheima</groupId><!--项目id--><artifactId>web01</artifactId><!--版本号:release,snapshot--><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>
6.依赖
1)依赖
- 指当前项目运行需要用到的jar包(指别人开发的资源模块)
2)依赖传递
- 依赖具有传递性:
- 直接依赖:在当前项目中通过配置建立的依赖关系
- 间接依赖:被依赖的资源如果依赖其他资源,则当前项目是间接依赖其他资源的
1.依赖传递冲突
- 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
- 声明优先:当资源在相同层级被依赖时,配置顺序靠前的资源覆盖配置顺序靠后的
- 特殊优先:当同级配置了相同资源的不同版本,则后配置的覆盖先配置的
2.可选依赖
- 可选依赖指对外隐藏当前所依赖的资源–不透明
- 在配置资源时,添加:
<optional>true<optional>
在project03中对外隐藏对junit资源的依赖,在project02中能看到priject03依赖的其他资源,而无法看到project03对junit的依赖
3.排除依赖
- 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本
在project02中引入project03的依赖时,不需要用到project03的log4j资源时,在project02配置project03时添加需要排除的依赖名称:这样在project02中就不会传递project03中的log4j资源
4.依赖范围
- 依赖的jar默认情况都可以使用,可以通过scope标签设定作用范围
- 作用范围:
- 主程序范围有效(main文件夹范围内)
- 测试程序范围有效(test文件夹范围内)
- 是否参与打包(package指令范围内)
依赖范围传递
7.生命周期与插件
1)项目构建生命周期
-
生命周期:由项目编译到安装到maven库中的一次构建过程
-
Maven对项目构建的生命周期分为三阶段:
-
clean:
-
default:
-
site:
-
2)插件
- 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
- 默认maven在各个生命周期上绑定有预设的功能
- 通过插件可以自定义其他功能
在project03中配置插件,插件执行的阶段为generate-test-resource,当运行test阶段时,由于test在generate-test-resource阶段后面,所以依然会执行插件的功能。
Maven高级
1.分模块开发与设计
- 把一个大的项目,根据功能划分为多个小的模块
- 模块中只包含当前模块对应的功能类与配置文件
- spring核心配置根据模块功能不同进行独立制作
- 当前模块所依赖的模块通过导入坐标的形式加入当前模块之后,并且安装到本地maven仓库中才可以使用
- web.xml需要加载所有的spring核心配置文件
-
1.ssm_pojo的拆分:
- 拷贝原始项目对应的相关内容到ssm_pojo模块中
- 实体类
- 配置文件(无)
- 拷贝原始项目对应的相关内容到ssm_pojo模块中
-
2.ssm_dao模块的拆分:
- 拷贝项目中dao文件下的所有内容
- 对原始项目中其他bean的使用,比如使用到了ssm_pojo中的user类:
- 将ssm_pojo的坐标直接导入到pom.xml文件中,将ssm_pojo作为一个资源导入到ssm_dao模块中
- 需要将ssm_pojo安装到本地仓库中 (install)
- 配置文件中需要使用到的依赖复制到ssm_dao的pom.xml文件
-
3.ssm_service模块的拆分:
- 将service相关的文件从原始项目中复制下来
- 使用到了dao中的bean,于是将ssm_dao的模块坐标导入到当前项目中:
- 将ssm_dao的坐标直接导入到pom.xml文件中,将ssm_dao作为一个资源导入到ssm_service模块中
- 需要将ssm_dao安装到本地仓库中 (install)
- 配置文件中需要使用到的依赖复制到ssm_service的pom.xml文件
-
4.controller模块拆分:
-
1.将模块设置为web-app模板
2.聚合
- 当前项目结构中,所有模块是层层嵌套的,如果中间某个模块进行了更新,其他模块如何将他们所依赖的模块同步更新?
- 创建一个管理工程,只用作模块的管理:操作当前模块就能打包或者编译它管理的所有模块
- 在pom.xml中添加
<packaging>pom</packaging>
:定义该工程用于构建管理 - 再添加:
<modules></modules>
里面则放入需要管理的工程模块名称 - 相当于管理层,里面不包含任何代码,只负责所有模块的统一更新和版本升级
3.继承
- 模块依赖关系维护:多个模块依赖的资源版本可能会有冲突
- 使用一个总的依赖版本管理:在总的管理中列举所有依赖以及统一的版本,然后各个子模块只用对应用到的模块
<dependencyManagement></dependencyManagement>
- 在子模块中,定义父工程的坐标:指定哪个是总的依赖项:
<parent></parent>
- 子模块中去掉每个依赖的版本,全部是从父工程的依赖中获取版本号,groupId也可以省略,与父工程是用一个group
4.继承与聚合的对比
- 聚合:在父工程中可以明确知道有哪些模块
- 继承:父工程模块无法找到哪些子模块是继承了自己,通常都是在子模块中配置父工程坐标
5.属性
- 我们定义一个自定义属性
<properties></properties>
来统一版本名称,统一管理依赖的版本
工程版本
资源配置
- 在对应模块的pom.xml文件中定义对应的属性,在
<build></build>
中配置文件对应信息,然后使用${}
获取该属性:在模块配置文件中读取核心配置中的属性值(这样就把所有配置属性集中到核心配置中管理)
多环境开发配置
多环境兼容
当开发和生成时需要在不同的环境下进行时,可以在pom.xml中定义多环境:
比如在开发中是在自己的服务器上运行,而生成时则是在总的服务器上运行,就可以通过多环境设置不同环境下的属性:
<!-- 创建多环境--><profiles>
<!-- 定义具体的环境:生成环境--><profile>
<!-- 定义环境对应的唯一名称--><id>pro_env</id>
<!-- 定义环境中换用的属性--><properties><jdbc.url>jdbc:mysql://120.55.43.71:3306/ssm_db</jdbc.url></properties></profile>
<!-- 定义具体的环境:开发环境--><profile><id>dep_env</id><properties><jdbc.url>jdbc:mysql://localhost:3306/ssm_db</jdbc.url></properties></profile></profiles>
- 在运行程序的打包时,就可以指定对应的环境从而完成在不同属性环境下的打包:
跳过测试
6.私服
- 在公共服务器、中央服务器与本地仓库中建立一种关系,使得多个开发人员能够访问到各自上传的资源。
1.私服服务器
- 1.安装:
- 2.运行:
- 复制到需要安装的路径下,解压出来重命名为nexus:进入到
D:\nexus\nexus-3.20.1-01\bin
目录下执行cmd,输入nexus /run nexus
:启动私服服务器
- 复制到需要安装的路径下,解压出来重命名为nexus:进入到
- 3.访问私服服务器:
localhost:8081
2.私服资源获取
- 宿主仓库:hosted
- 保存无法从中央仓库获取的资源
- 自主研发
- 第三方非开源项目
- 保存无法从中央仓库获取的资源
- 代理仓库:proxy
- 代理远程仓库,通过nexus访问其他公共仓库,例如中央仓库
- 仓库组:group
- 将若干个仓库组成一个群众,简化配置
- 仓库组不能保存资源,属于设计型仓库
3.登录私服服务器
-
1.创建hosted仓库:
-
2.将当前hosted仓库添加:
-
3.组件资源上传:
4.ideal环境的资源上传与下载
-
配置本地仓库访问私服的权限:用户名+密码配置
-
配置本地仓库资源的来源:
-
也就是当需要用到资源时,从私服服务器的哪个地方下载:先是从中央仓库找,如果中央仓库找不到再从其他剩余仓库找:
-
在IDEA中配置需要将对应的版本发布配置:
<distributionManagement><repository><id>heima-release</id><url>http://localhost:8081/repository/hiema-release/</url></repository><snapshotRepository><id>heima-snapshots</id><url>http://localhost:8081/repository/heima-snapshots/</url></snapshotRepository></distributionManagement>
-
其中:对应版本需要通过仓库url发布到对应的仓库上:
-
发布资源到私服命令:
mvn deploy
资源发布的流程
- 1.在IDEA中配置了对应资源发布仓库的url:
- 如果是release的版本就会找到
<repository></repository>
中的url去访问该仓库地址 - 如果是snapshot的版本就会找到
<snapshotRepository> </snapshotRepository>
中的仓库url访问
- 如果是release的版本就会找到
- 2.由于有权限限制,于是会根据
id
去本地仓库中配置的xml文件中找到对应id的<server></server>
然后根据配置的用户名和密码去访问私服服务器 - 3.将资源发布到对应的仓库里面
通过这样的资源发布,可以将该私服服务器挂到一个云服务器上,然后在任何地方,任何一个人都可以将自己开发好的资源发布到该私服上,而其他人也可以在任意地方访问该私服服务器,去下载同一个项目组中发布的资源,从而实现项目资源管理。
*注:上述内容来自黑马程序员的视频学习,仅用作学习交流,不用作商业用途,如有侵权,联系删除。