文章目录
Maven基础
1 Maven简介
- 1提供了一套标准化的项目结构(解决了不同IDE不互通的问题)
每一个开发工具(IDE)都有自己不同的项目结构,它们互相之间不通用。
而Maven提供了一套标准化的项目结构,所有的IDE使用Maven构建的项目完全一样,所以IDE创建的Maven项目可以通用。
-
2提供了一套标准化的构建流程(编译,测试,打包,发布……)
(有自己的插件来实现功能)
- 3提供了一套依赖管理机制
Maven使用标准的坐标配置来管理各种依赖, 只需要简单的配置就可以完成依赖管理:
Maven模型
项目对象模型pom (Project Object Model)
依赖管理模型(Dependency)
插件(Plugin)
项目对象模型pom就是将我们自己抽象成一个对象模型,有自己专属的坐标,是唯一标识。
项目对象模型pom通过xml格式保存的pom.xml文件。该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。
流程
构建生命周期和插件部分用来完成 标准化构建流程 。
如我们需要编译,Maven提供了一个编译插件供我们使用。我们需要打包,Maven就提供了一个打包插件提供我们使用等。
仓库
Maven用坐标配置管理依赖。
依赖jar包则其实存储在本地仓库中,项目运行时从本地仓库中拿需要的依赖jar包。
-
本地仓库:自己电脑上存储资源的仓库(是个目录),连接远程仓库获取资源
-
中央仓库:由Maven团队维护的全球唯一的仓库,Maven团队维护,存储所有资源的仓库
-
远程仓库(私服):一般由公司团队搭建的私有仓库。部门/公司范围内存储资源的仓库,从中央仓库获取资源
私服的作用:
- 保存具有版权的资源,包含购买或自主研发的jar。中央仓库中的jar都是开源的,不能存储具有版权的资源
一定范围内共享资源,仅对内部开放,不对外共享
当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应的jar包:
- 如果有,则在项目直接引用;
- 如果没有,则去中央仓库中下载对应的jar包到本地仓库。
如果搭建了远程仓库,将来jar包的查找顺序则变为:
本地仓库 --> 远程仓库–> 中央仓库
Maven 坐标
Maven中的坐标使用三个『向量』在『Maven的仓库』中唯一的定位到一个『jar』包。
- group Id:公司或组织的 id,即公司或组织域名的倒序,通常也会加上项目名称
例如:group Id :com. javatv. maven
- artifact Id:一个项目或者是项目中的一个模块的 id,即模块的名称,将来作为 Maven 工程的工程名
例如:artifact Id :auth
- version:版本号
例如:version:1.0.0
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!--
此处为什么需要添加该标签?
provided指的是在编译和测试过程中有效,在运行时无效,最后生成的war包时不会加入
因为Tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和Tomcat中的jar包冲突,导致报错
-->
<scope>provided</scope>
</dependency>
注意:
上面所说的资源可以是插件、依赖、当前项目。
我们的项目如果被其他的项目依赖时,也是需要坐标来引入的。
配置
根据黑马程序员java Web课程配置
已完成:
- 本地仓库配置
- 环境变量配置
- 阿里云私服连接
2 Maven基本使用
Maven常用命令
- compile :编译,生成target目录
- clean:清理,删除target目录
- test:测试,执行test文件下测试代码
- package:打包,将当前项目打包成的jar包
- install:安装,将当前项目打成jar包,并安装到本地仓库
编译命令演示:
shell运行
mvn compile
首次编译会先从阿里云(之前conf/settings.xml配置了阿里云私服)下载编译需要插件的jar包,在本地仓库(之前conf/settings.xml配置了本地仓库位置)也能看到下载好的插件。
清理命令演示:
mvn clean
执行上述命令可以看到
- 从阿里云下载清理需要的插件jar包
- 删除项目下的
target
目录
生命周期
Maven 构建项目生命周期描述的是一次构建过程经历经历了多少个事件
Maven 对项目构建的生命周期划分为3套:
- clean :项目清理的处理,移除所有上一次构建生成的文件。
- default(或 build) :核心工作,例如编译,测试,打包,安装等。
- site : 产生报告,发布站点等。这套生命周期一般不会使用。
Clean 生命周期
当我们执行 mvn post-clean 命令时,Maven 调用 clean 生命周期,它包含以下阶段:
- pre-clean:执行一些需要在clean之前完成的工作
clean:移除所有上一次构建生成的文件
post-clean:执行一些需要在clean之后立刻完成的工作
default生命周期
- 验证 validate 验证项目 验证项目是否正确且所有必须信息是可用的
编译 compile 执行编译 源代码编译在此阶段完成
测试 Test 测试 使用适当的单元测试框架(例如JUnit)运行测试。
包装 package 打包 创建JAR/WAR包如在 pom.xml 中定义提及的包
检查 verify 检查 对集成测试的结果进行检查,以保证质量达标
安装 install 安装 安装打包的项目到本地仓库,以供其他项目使用
部署 deploy 部署 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程
注意:
打包前先clean是好习惯,能够保证上一次构建的输出不会影响到本次构建。
同一套生命周期内,执行后边的命令,前面的所有命令会自动执行。例如执行安装会先执行打包。
3 IDEA使用Maven
IDEA配置Maven环境
注意:一定要先file-close project关闭项目, 然后再设置,就是全局设置,否则仅本项目内生效。
IDEA 创建 Maven项目
file-new module-选择构建Maven
也可以先创建空项目,在项目内创建Maven模块。
下面生成器Maven archetype(原型)是创建Maven web的
填写模块名称,坐标信息,点击finish,创建完成
创建好的项目目录结构如下:
然后在java文件夹下建包,创建类
导入Maven项目:open-双击项目的pom.xml文件即可
pom.xml解释
此阶段packaging不用设置,默认是打包成jar包,以后创建Maven web时候要配置成war。
配置 Maven-Helper 插件
Maven-Helper可以右键Maven项目,直接run Maven和调试。
File --> Settings–Plugins–搜索 Maven,选择第一个 Maven Helper,点击Install安装,弹出面板中点击Accept–重启
4 依赖管理
当 A jar 包用到了 B jar 包中的某些类时,A 就对 B 产生了依赖,那么我们就可以说 A 依赖 B。
依赖管理中要解决的具体问题:
- jar 包的下载:使用 Maven 之后,jar 包会从规范的远程仓库下载到本地
- jar 包之间的依赖:通过依赖的传递性自动完成
- jar 包之间的冲突:通过对依赖的配置进行调整,让某些 jar 包不会被导入
jar包的导入(pom.xml中修改)
依赖指当前项目运行所需的jar,一个项目可以设置多个依赖。
- group Id:依赖所属群组id。
- artifact Id:依赖所属项目id。
- version:依赖版本号。
- scope:依赖生效范围。(也可以不写,问题不大)
- optional:为true时是可选依赖,指对外隐藏当前所依赖的资源——不透明。设置后其他依赖引用本项目时候将无法看到这个依赖。控制别人能不能看到你用到你。
- exclusions-exclusion:排除依赖指主动断开依赖的资源,被排除的资源无需指定版本。控制你引用的项目中需要排除的依赖。
依赖具有传递性
直接依赖:在当前项目中通过依赖配置建立的依赖关系
间接依赖:被资源的资源如果依赖其他资源,当前项目间接依赖其他资源
依赖传递冲突问题
- 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
- 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
- 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的
依赖jar包引用,设置自动刷新
使用坐标引入依赖的jar包
1.在项目的 pom.xml 中编写 标签
2.在 标签中 使用 引入坐标
3.定义坐标的 groupId,artifactId,version
groupId:定义当前Maven项目隶属的实际项目。
例如org.sonatype.nexus,此id前半部分org.sonatype代表此项目隶属的组织或公司,后部分代表项目的名称。
如果此项目多模块话开发的话就子模块可以分为org.sonatype.nexus.plugins和org. sonatype. nexus. utils等。特别注意的是 group Id 不应该对应项目隶属的组织或公司,也就是说group Id不能只有org. sonatype 而没有nexus。
artifact Id:构件ID。该元素定义实际项目中的一个Maven项目或者是子模块,如上面官方约定中所说,构建名称必须小写字母,没有其他的特殊字符,推荐使用“实际项目名称-模块名称”的方式定义,例如:spirng-mvn、spring-core等。