Maven
Maven 是 Apache 软件基金会组织维护的一款自动化构建工具, 专注服务于 Java 平台的项目构建和依赖管理。
为什么使用Maven
本次写作是在学习SSM框架之后。
即使不使用 Maven 我们仍然可以正常进行 B/S 结构项目的开发。从表述层、业务逻辑层到持久化层再到数据库都有成熟的解决方案,那maven的作用在哪里那?
Maven的用处
- 第三方包的管理
使用第三方包时的方法是 下载第三方jar包,再添加到运行时环境
此方式存在一些问题,首先是第三方jar包的获取,不够 规范、完整、准确
而maven调用第三方包以坐标的方式唯一定位
其次对于工作区中不同的工程即使调用相同的jar包,也需要重复的天骄到lib中,使得工作区存在大量的冗余
maven只需要在中心仓库中储存一份即可,节约空间避免混乱。
- 解决jar包的依赖关系
jar包并非孤立存在的,往往需要在其他 jar 包的支持下才能够正常工作,称之为 jar 包之间的依赖关系。
传统的导包方式需要将所有所依赖的包导入,才能正常运行。
最典型的例子是: commons-fileupload-1.3.jar 依赖于 commons-io-2.0.1.jar
如果没有 IO 包, FileUpload 包就不能正常工作。
而Maven 就可以替我们自动的将当前 jar 包所依赖的其他所有 jar 包全部导入进来。
- 便于项目的拆解
Maven的自动化构建
构建的主要过程
- 清理:删除以前的编译结果,为重新编译做好准备。
- 编译:将 Java 源程序编译为字节码文件。
- 测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
- 报告:在每一次测试后以标准的格式记录和展示测试结果。
- 打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。 Java 工程对应 jar 包,Web工程对应 war 包。
- 安装:在 Maven 环境下特指将打包的结果——jar 包或 war 包安装到本地仓库中。
- 部署:将打包的结果部署到远程仓库或将 war 包部署到服务器上运行。
Maven 的意义就体现出来了, 自动的从构建过程的起点一直执行到终点:
常用命令
mvn -v:查询Maven版本
mvn -compile:编译
mvn -test:测试项目
mvn -package:打包
mvn -clean:删除target文件夹
mvn -install:安装
Maven的核心概念
- 约定目录结构
- POM
- 坐标
- 依赖
- 生命周期
- 仓库
- 继承
- 聚合
- 插件
约定目录结构
开发中让第三方工具或框架知道我们自己创建的资源在哪,那么基本上就是两种方式:
- 通过配置的形式明确告诉它
- 基于第三方工具或框架的约定
Maven采用后者,约定 > 配置 > 编码。只有以约定目录结构进行编码Maven才能找到源文件,进而实现自动化构建
POM
Project Object Model:项目对象模型。将 Java 工程的相关信息封装为对象作为便于操作和管理的模型。Maven 工程的核心配置,Mave对其解析。类似于DOM。
POM详细配置说明
坐标
使用如下三个向量在 Maven 的仓库中唯一的确定一个 Maven 工程。
- groupid:公司或组织的域名倒序+当前项目名称
- artifactId:当前项目的模块名称
- version:当前模块的版本
<dependency>
<groupId>com.wang.maven</groupId>
<artifactId>Hello</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
</dependency>
磁盘 定位方式
com/wang/maven/Hello/0.0.1-SNAPSHOT/artifactId-version
即
com/wang/maven/Hello/0.0.1-SNAPSHOT/Hello-0.0.1-SNAPSHOT.jar
依赖
依赖范围
1. compile :默认范围,用于编译
2. provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath
3. runtime: 在执行时需要使用
4. test: 用于test任务时使用
5. system: 需要外在提供相应的元素。通过systemPath来取得
6. systemPath: 仅用于范围为system。提供相应的路径
7. optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用
常用范围:compile、 test、 provided
依赖传递
compile的依赖可传递。
依赖冲突
若项目中多个Jar同时引用了相同的Jar时,会产生依赖冲突,但Maven采用了两种避免冲突的策略,因此在Maven中是不存在依赖冲突的。
1.短路优先
本项目——>A.jar——>B.jar——>X.jar
本项目——>C.jar——>X.jar
若本项目引用了A.jar,A.jar又引用了B.jar,B.jar又引用了X.jar,并且C.jar也引用了X.jar。
Maven只会引用引用路径最短的Jar。
2.声明优先
若引用路径长度相同时,在pom.xml中谁先被声明,就使用谁。
依赖排除
需求:依赖中存在快照版本,不稳定,需要排除。
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>HelloFriend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
也可使用统一声明版本方式解决。
<properties>
<wang.spring.version>4.1.1.RELEASE</atguigu.spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${wang.spring.version}</version>“玩转” Java 系列
</dependency>
……
</dependencies>
待续…