一、Maven的作用
作用一:下载对应的jar包
避免jar包重复下载配置,保证多个工程共用一份jar包。Maven有一个本地仓库,可以通过pom.xml文件来记录jar所在的位置。Maven会自动从远程仓库下载jar包,并且会下载所依赖的其他jar包,保证规范、完整、准确。
groupId
: 域名的反写artifactId
: 项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称。version
:jar的版本
作用二:处理jar之间的冲突
jar包之间的冲突处理:多个jar包之间的依赖关系也存在冲突的情况,比如jar包A和jar包B所依赖的子jar包虽然是同一个,但是依赖的版本不一致。Maven一般通过最短路径者优先和先声明者优先来解决这个问题。
- 最短路径指依赖树的深度,深度越低,优先级越高。
- 声明的优先与否通过pom.xml的顺序来决定,放在前面的优先级高。
作用三:项目的模块化管理
每个开发者一个模块
作用四:项目的分布式部署
单个计算机无法独立运行某个项目,将项目进行拆分,部署到多个计算机当中。利用多个计算机的存储资源和计算资源来处理某个项目,Maven框架就可以自动化的构建分布式项目。
二、Maven是什么
Maven是一款自动化构建工具,服务于项目构建和依赖管理。
1.构建是什么
- 纯java代码:java代码编译得到.class文件
- web工程:java代码部署到服务器
- 实际项目:java代码、框架配置文件、国际化等其他资源文件,按照正确的目录结构部署到服务器中。(构建)
2.构建的环节
- 清理:删除以前的编译结果,为重新编译做好准备
- 编译:java -> class文件
- 测试:测试关键环节,确保项目没有关键性问题
- 报告:展示测试结果
- 打包:将一堆文件打包为一个压缩文件,用于部署到其他服务器
- 安装:在Maven环境下将打包的结果(jar包或war包)安装到本地仓库
- 部署:将打包的结果部署到远程仓库或将war包部署到服务器
3. 自动化构建
将编译、打包、部署、测试这些步骤交给Maven来做,这个就是自动化构建。
三、使用Maven
- 配置maven环境变量
- 修改maven远程仓库的网址,改为国内的镜像网址
- 打开apache-maven/conf/settings.xml文件
- 创建Maven本地仓库,文件名建议为maven_rep
- 修改本地仓库的地址为你创建的仓库路径
<localReposity>
- 修改阿里云镜像地址
<mirror>
- 修改Maven编译版本,建议使用java 8
<profile>
- 在IDEA中修改maven配置 setting/build/build tools/maven
- 修改maven路径,使用自己的maven,替换idea自带的
- 修改maven配置文件settingxml路径
- 创建maven工程,不要选择空项目,使用new project
- build system: 选择maven
- groupId: 公司域名倒写
- artifactId:项目名
- 目录结构
- src/main: 主程序
- src/main/java: 源代码
- resources目录用于存放配置文件和资源文件
- test目录用于存放测试程序。
- external libraries: 已经下载的jar包
- 使用maven的lifecycle按钮来构建项目
- 添加一个打包插件,让打包后的jar包,包含我们运行代码时所用的依赖。这个配置看情况添加,如果不需要可以注释掉。
在pom.xml中加入如下内容:
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
四、核心概念
- POM:项目对象模型,将java工程的相关信息封装成对象作为便于操作和管理的模型。对应的就pom.xml文件,学习Maven就是学习pom.xml文件中的配置。
- 约定的目录结构: 约定 > 配置 > 编码, 而Maven就是约定好了特定的目录结构,注意不要轻易删除原有的目录结构。
- 坐标:(groupId, artifactId, version)-> (公司,项目模块名,模块版本),用来定位当前模块在本地仓库的位置。将gav三个向量连起来就是模块在本地仓库中的位置。注意每个点分割为一个文件夹。我们自己的maven工程必须执行install命令才会进入本地仓库。
1. 依赖管理
当前工程会到本地仓库根据坐标寻找所依赖的jar包。
- 直接依赖:Hello 依赖 junit , HelloFriend 依赖 Hello
- 间接依赖:HelloFriend 间接依赖 junit
依赖的范围
provided
: main,test目录下的代码都可以访问, 运行时无法访问compile
: main, test,运行时都可以访问test
: 只有test目录下可以访问
统一管理包的版本
Maven可以通过给包的版本号设置一个变量的形式来动态设置包的版本,便于包的升级换代。使用${变量名}
的形式来统一修改。
2. 仓库
分类
- 本地仓库:为当前本机电脑上的所有Maven工程服务
- 远程仓库
- 私服:个人搭建的
- 中央仓库:连接比较慢
- 中央仓库的镜像: 架设在各个大洲,为中央仓库分担流量
仓库中的文件
- Maven的插件
- 我们自己开发的项目的模块
- 第三方框架或工具的jar包
3.生命周期
生命周期定义各个构建环节的执行顺序,Maven靠这个自动化的执行构建命令。
- clean生命周期:清理
- site生命周期:生成站点文档
- default生命周期:
compile -> test compile -> test ->package -> install
- 运行某个阶段时,会将之前的各个阶段都执行一遍
插件
- Maven核心只是定义了抽象的生命周期,具体实现是插件实现的
- 每个插件可以实现多个功能
五、继承
由于非compile范文的依赖信息是无法在外部工程中传递的。我们可以在父工程中引入相应的依赖,比如junit。子工程中的模块会自动继承父工程的依赖关系,我们可以在父工程中管理子工程的依赖。
可以在父工程里面的版本进行修改,子工程会自动跟随父工程变化。同时也可以在父工程中修改依赖的范围(provided, compile, test),子工程也会随着变化。
注意:因此在子工程中的依赖不添加版本号信息,子工程跟随父工程变化即可。
六、聚合
可以在父工程中使用modules关键字聚合子工程,聚合后,可以在父工程中对所有子工程进行清理、编译、测试、打包等操作。
七、Maven酷站
权威网址:http://mvnrepository.com/
搜索需要的Jar包依赖信息:http://search.maven.org
八、常见问题及解决办法
问题一:如果下载过程中由于网速问题导致下载失败,会生成一个xxxx.lastupdated的文件,需要删除该文件后再重新刷新。
问题二:not found class找不到类 / not found method
jar包冲突问题,手动使用exclusion关键字排除产生冲突的包。