SpringBoot入门-(1) Maven
动机
对于企业级大项目而言,需要手动导入很大Jar包,费时费力,且Jar包之间也可能存在依赖和冲突,这些关系导致Jar包之间想毛线团一样缠在一起,因此我们需要一个包管理系统帮我们自动下载导入Jar包并且管理好他们之间的依赖和避免冲突,由此Maven诞生。
-
Maven是一款自动化构建工具,专注服务于Java平台的项目构建和依赖管理
安装与配置
-
下载Maven压缩包解压
-
打开MAVEN安装目录\settings.xml文件,修改<localRepository>标签,设置为新建的本地仓库地址
-
修改镜像,<mirror>标签添加阿里镜像,下载相关依赖包速度快
自动导包原理
从maven中获取Jar包时,maven先从本地仓库中查找,若存在则返回,若不存在从中央仓库(镜像)取包并保存到本地。
IDEA中配置
在IDEA中配置好相关路径后新建项目即可,如下
新建Maven项目:
创建后,项目目录树如下:
main:存放主程序
test:存放测试代码,单元测试等
java:存放源代码
resource:存放配置文件和资源文件
pom.xml文件:管理依赖,标识项目
pom.xml
pom文件中包含我们刚刚新建项目设置的项目坐标,jdk版本等相关信息:
我们可以在pom.xml文件中添加依赖,右侧刷新更新依赖即可(自动下载所需依赖包):
Project Object Model:项目对象模型。将Java工程的相关信息封装为对象作为便于操作和管理的模型。Maven工程的核心配置。
MAVEN构建工具可以让对象(项目)和对象之间产生关系
相关概念
坐标
-
使用GAV在Maven仓库中唯一确定一个Maven工程
-
groupId:公司或组织的域名倒序+当前项目名称
-
artifactId:当前项目的模块名称
-
version:当前模块的版本信息
<groupId>com.wzu.maven</groupId><artifactId>Example</artifactId><version>0.0.1-SNAPSHOT</version>
-
-
通过坐标在仓库中查找jar包
-
将GAV三个向量连起来即可
-
com/wzu/maven/Example/0.0.1-SNAPSHOT/Example-0.0.1-SNAPSHOT.jar(相对路径,前面是本地仓库路径)
-
自己的maven工程要生成jar包供其他项目依赖和使用,执行
mvn install
命令后在对应路径下出现本项目的jar包(已进入仓库)
-
maven自动化部署
maven可以自动执行项目构建全流程:清理 -> 编译 -> 测试 -> 报告 -> 打包 -> 部署
项目关系
-
依赖关系:标签<dependency>把另一个项目的 jar 引入到当前项目,则maven会自动下载另一个项目的 jar 所依赖的其他项目,不会出现手动导入jar缺失依赖的问题。
-
聚合关系:
-
大项目一般分为模块项目,子项目用<parent>标签继承父项目(pom类型,可删除父工程的src等文件夹),此时父项目起到的作用是统一版本等相关信息。
-
New -> Module 创建子模块,也会生成子模块对应的pom.xml。
-
父项目的packing类型为pom,子项目一般为jar或war
-
父项目统一管理子项目的依赖包版本,不真正引入JAR包,依赖放在
<dependencyManagement>
标签中 -
子项目真正引入JAR包,而不用指定版本号,确保各个模块之间版本统一,修改方便
-
如果子项目和
<groupId>
和<version>
与父项目相同,在子项目中可以不配置<groupId>
和<version>
依赖范围
<dependency><groupId>...</groupId?<artifactId>...</artifactId><scope>...</scope></dependency>
注意到<scope>
标签用于控制依赖的范围
-
compile (默认)
-
main目录下的Java代码可以访问这个范围的依赖
-
test目录下的Java代码可以访问这个范围的依赖
-
部署到Tomcat服务器上运行时要放在WEB-INF的lib目录下
-
-
test
-
main目录下的Java代码不能访问这个范围的依赖
-
test目录下的Java代码可以访问这个范围的依赖
-
部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下
-
例如:对junit的依赖。仅仅是测试程序部分需要。
-
-
provided
-
main目录下的Java代码可以访问这个范围的依赖
-
test目录下的Java代码可以访问这个范围的依赖
-
部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下
-
例如:servlet-api在服务器上运行时,Servlet容器会提供相关API,所以部署的时候不需要
-