Maven-Introduction
Maven 是一款为 Java 项目构建管理、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。
总结:Maven就是一个软件,掌握软件安装、配置、以及基本功能(项目构建、依赖管理)使用就是本课程的主要目标!
场景1:例如我们项目需要第三方库(依赖),如Druid连接池、MySQL数据库驱动和Jackson等。那么我们可以将需要的依赖项的信息编写到Maven工程的配置文件,Maven软件就会自动下载并复制这些依赖项到项目中,也会自动下载依赖需要的依赖!确保依赖版本正确无冲突和依赖完整!
场景2:项目开发完成后,想要将项目打成.war文件,并部署到服务器中运行,使用Maven软件,我们可以通过一行构建命令(mvn package)快速项目构建和打包!节省大量时间!
Maven 可以管理项目的依赖,包括自动下载所需依赖库、自动下载依赖需要的依赖并且保证版本没有冲突、依赖版本管理等。通过 Maven,我们可以方便地维护项目所依赖的外部库,而我们仅仅需要编写配置即可。
项目构建是指将源代码、配置文件、资源文件等转化为能够运行或部署的应用程序或库的过程!
Maven 可以管理项目的编译、测试、打包、部署等构建过程。通过实现标准的构建生命周期,Maven 可以确保每一个构建过程都遵循同样的规则和最佳实践。同时,Maven 的插件机制也使得开发者可以对构建过程进行扩展和定制。主动触发构建,只需要简单的命令操作即可。
Maven Releases History
选用版本:
安装条件:maven需要本机安装java环境、必需包含java_home环境变量!
软件安装:右键解压即可(绿色免安装)
软件结构:
环境变量:配置maven_home 和 path
mvn -v
# 输出版本信息即可,如果错误,请仔细检查环境变量即可!
# 友好提示,如果此处错误,绝大部分原因都是java_home变量的事,请仔细检查!!
需要需改maven/conf/settings.xml配置文件,来修改maven的一些默认配置。主要休要修改的有三个配置:
D:\repository
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central
jdk-17
true
17
17
17
17
需要将配置好的maven软件,配置到idea开发工具中即可! 注意:idea工具默认自带maven配置软件,但是因为没有修改配置,建议替换成本地配置好的maven!
依次点击:file / settings / build / build tool / maven
注意:如果本地仓库地址不变化,只有一个原因,就是maven/conf/settings.xml配置文件编写错误!仔细检查即可!
Maven工程相对之前的工程,多出一组gavp属性,gav需要我们在创建项目的时指定,p有默认值,后期通过配置文件修改。既然要填写的属性,先行了解下这组属性的含义!
Maven 中的 GAVP 是指 GroupId、ArtifactId、Version、Packaging 等四个属性的缩写,其中前三个是必要的,而 Packaging 属性为可选项。这四个属性主要为每个项目在maven仓库总做一个标识,类似人的《姓-名》。有了具体标识,方便maven软件对项目进行管理和互相引用!
com.{公司/BU }.业务线.[子业务线],最多 4 级。
说明:{公司/BU} 例如:alibaba/taobao/tmall/aliexpress 等 BU 一级;子业务线可选。
正例:com.taobao.tddl 或 com.alibaba.sourcing.multilang com.jd.java
产品线名-模块名。语义不重复不遗漏,先到仓库中心去查证一下。
正例:tc-client / uic-api / tair-tool / bookstore
1) 主版本号:当做了不兼容的 API 修改,或者增加了能改变产品方向的新功能。
2) 次版本号:当做了向下兼容的功能性新增(新增类、接口等)。
3) 修订号:修复 bug,没有修改方法签名的功能加强,保持 API 兼容性。
例如: 初始→1.0.0 修改bug → 1.0.1 功能调整 → 1.1.1等
指示将项目打包为什么类型的文件,idea根据packaging值,识别maven项目类型!
packaging 属性为 jar(默认值),代表普通的Java工程,打包以后是.jar结尾的文件。
packaging 属性为 war,代表Java的web工程,打包以后.war结尾的文件。
packaging 属性为 pom,代表不会打包,用来做继承的父工程。
注意:此处省略了version,直接给了一个默认值
自己后期可以在项目中随意修改!
注意:结构和命名固定
修改位置:项目下/pom.xml
com.test
maven_parent
1.0-SNAPSHOT
war
项目的webapp文件夹出现小蓝点,代表成功!!
file / settings / plugins / marketplace
Maven 是一个强大的构建工具,它提供一种标准化的项目结构,可以帮助开发者更容易地管理项目的依赖、构建、测试和发布等任务。以下是 Maven Web 程序的文件结构及每个文件的作用:
|-- pom.xml # Maven 项目管理文件
|-- src
|-- main # 项目主要代码
| |-- java # Java 源代码目录
| | `-- com/example/myapp # 开发者代码主目录
| | |-- controller # 存放 Controller 层代码的目录
| | |-- service # 存放 Service 层代码的目录
| | |-- dao # 存放 DAO 层代码的目录
| | `-- model # 存放数据模型的目录
| |-- resources # 资源目录,存放配置文件、静态资源等
| | |-- log4j.properties # 日志配置文件
| | |-- spring-mybatis.xml # Spring Mybatis 配置文件
| | `-- static # 存放静态资源的目录
| | |-- css # 存放 CSS 文件的目录
| | |-- js # 存放 JavaScript 文件的目录
| | `-- images # 存放图片资源的目录
| `-- webapp # 存放 WEB 相关配置和资源
| |-- WEB-INF # 存放 WEB 应用配置文件
| | |-- web.xml # Web 应用的部署描述文件
| | `-- classes # 存放编译后的 class 文件
| `-- index.html # Web 应用入口页面
`-- test # 项目测试代码
|-- java # 单元测试目录
`-- resources # 测试资源目录
Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题,使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中,避免出现版本冲突和依赖缺失等问题。
通过定义 POM 文件,Maven 能够自动解析项目的依赖关系,并通过 Maven 仓库自动下载和管理依赖,从而避免了手动下载和管理依赖的繁琐工作和可能引发的版本冲突问题。
重点: 编写pom.xml文件!
4.0.0
com.companyname.project-group
project
1.0.0
jar/pom/war
log4j
log4j
1.2.17
runtime
4.11
UTF-8
UTF-8
junit
junit
${junit.version}
依赖传递指的是当一个模块或库 A 依赖于另一个模块或库 B,而 B 又依赖于模块或库 C,那么 A 会间接依赖于 C。这种依赖传递结构可以形成一个依赖树。当引入一个库或框架时,构建工具(如 Maven、Gradle)会自动解析和加载其所有的直接和间接依赖,确保这些依赖都可用。
1.减少重复依赖:当多个项目依赖同一个库时,Maven 可以自动下载并且只下载一次该库。这样可以减少项目的构建时间和磁盘空间。
2.自动管理依赖: Maven 可以自动管理依赖项,使用依赖传递,简化了依赖项的管理,使项目构建更加可靠和一致。
3.确保依赖版本正确性:通过依赖传递的依赖,之间都不会存在版本兼容性问题,确实依赖的版本正确性!
项目中,需要导入jackson相关的依赖,通过之前导入经验,jackson需要导入三个依赖,分别为:
通过查看网站介绍的依赖传递特性:data-bind中,依赖其他两个依赖
最佳导入:直接可以导入data-bind,自动依赖传递需要的依赖
com.fasterxml.jackson.core
jackson-databind
2.15.0
当直接引用或者间接引用出现了相同的jar包! 这时呢,一个项目就会出现相同的重复jar包,这就算作冲突!依赖冲突避免出现重复依赖,并且终止依赖传递!
maven自动解决依赖冲突问题能力,会按照自己的原则,进行重复依赖选择。同时也提供了手动解决的冲突的方式,不过不推荐!
A—>B—>C—>D—>E—>X(version 0.0.1)
A—>F—>X(version 0.0.2)
则A依赖于X(version 0.0.2)。
小思考:
前提:
A 1.1 -> B 1.1 -> C 1.1
F 2.2 -> B 2.2
pom声明:
F 2.2
A 1.1
B 2.2
结果:F2.2 A1.1 B2.2会引入,不会引入C1.1,只要发生冲突了,后续的依赖传递全部终止!
在使用 Maven 构建项目时,可能会发生依赖项下载错误的情况,主要原因有以下几种:
例如: pom.xml依赖
com.alibaba
druid
1.2.8
文件:
脚本使用:
使用记事本打开
set REPOSITORY_PATH=D:\repository 改成你本地仓库地址即可!
点击运行脚本,即可自动清理本地错误缓存文件!!
项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。
语法: mvn 构建命令 构建命令....
构建生命周期可以理解成是一组固定构建命令的有序集合,触发周期后的命令,会自动触发周期前的命令!也是一种简化构建的思路!
打包: mvn clean package
本地仓库: mvn clean install
打包: mvn clean package
重新编译: mvn clean compile
本地部署: mvn clean install
周期→包含若干命令→包含若干插件!
使用周期命令构建,简化构建过程!
最终进行构建的是插件!
插件配置
org.apache.maven.plugins
maven-war-plugin
3.2.2
Maven 继承是指在 Maven 的项目中,让一个项目从另一个项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作。
作用:在父工程中统一管理项目中的依赖信息,进行统一版本管理!
它的背景是:
它背后的需求是:
通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。
com.test.maven
pro03-maven-parent
1.0-SNAPSHOT
pom
com.test.maven
pro03-maven-parent
1.0-SNAPSHOT
pro04-maven-module
org.springframework
spring-core
4.0.0.RELEASE
org.springframework
spring-beans
4.0.0.RELEASE
org.springframework
spring-context
4.0.0.RELEASE
org.springframework
spring-expression
4.0.0.RELEASE
org.springframework
spring-aop
4.0.0.RELEASE
org.springframework
spring-core
org.springframework
spring-beans
org.springframework
spring-context
org.springframework
spring-expression
org.springframework
spring-aop
Maven 聚合是指将多个项目组织到一个父级项目中,通过触发父工程的构建,统一按顺序触发子工程构建的过程!!
父项目中包含的子项目列表。
com.example
parent-project
pom
1.0.0
child-project1
child-project2
通过触发父工程构建命令、引发所有子模块构建!产生反应堆!
搭建一个电商平台项目,该平台包括用户服务、订单服务、通用工具模块等。
1.用户服务:负责处理用户相关的逻辑,例如用户信息的管理、用户注册、登录等。
2.订单服务:负责处理订单相关的逻辑,例如订单的创建、订单支付、退货、订单查看等。
3.通用模块:负责存储其他服务需要通用工具类,其他服务依赖此模块。
4.0.0
com.test
micro-shop
1.0.1
pom
6.0.6
2.15.0
1.10.1
2.11.0
8
8
UTF-8
org.springframework
spring-context
${spring.version}
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
org.apache.shiro
shiro-core
${shiro.version}
commons-io
commons-io
${commons.version}
org.apache.maven.plugins
maven-war-plugin
3.2.2
4.0.0
com.test
micro-shop
1.0.1
common-service
jar
8
8
UTF-8
commons-io
commons-io
4.0.0
com.test
micro-shop
1.0.1
user-service
war
8
8
UTF-8
org.springframework
spring-context
com.fasterxml.jackson.core
jackson-databind
4.0.0
com.test
micro-shop
1.0.1
order-service
war
8
8
UTF-8
org.springframework
spring-context
org.apache.shiro
shiro-core