为啥使用 Maven
- jar 包管理(添加、获取、自动处理 jar 包依赖关系及冲突)
手动 jar 包管理很麻烦,需要自行到网上下载 jar 包,添加到项目的 lib 目录生效(Maven 只需要添加到 pom 即可);如果一个 jar 包又依赖很多其他 jar 包,又得手动找很多个(Maven 能自动下载);如果项目 A 依赖 B,B 依赖 C,且 B 和 C 依赖同一个 xxx.jar,但版本不同,那么项目 A 依赖哪个版本呢?冲突(Maven 会自动处理冲突,最短路径者优先);如果项目 A 依赖 B 和 C,且 B 和 C 依赖同一个 xxx.jar,但版本不同,那么项目 A 依赖哪个版本呢?冲突(Maven 会自动处理冲突,先声明者优先) - 项目模块化管理
- 项目自动化构建(查看生命周期,清理-编译-打包-……)
Maven 使用
安装
下载压缩包,解压并配置环境变量即可!注意 Maven 是 Java 开发的,依赖 JDK。
配置(conf/settings.xml)
本地仓库
<localRepository>/path/to/local/repo</localRepository>
镜像仓库,把国外的仓库 jar 包复制一份到国内(提速),如下阿里云镜像仓库
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
idea 集成 Maven
Lifecycle
常见命令(可点击下面各命令,也可以在控制台执行 mvn 下面各命令)
clean:清除之前编译好的东西,target 包
validate:检验项目目录结构是否正确
compile:编译(main 目录里的)
test:编译并运行测试包下的内容
package:打包
install:安装到本地仓库
Maven 核心概念
pom
Project Object Model:项目对象模型,将 Java 工程的相关信息封装为对象作为便于操作和管理的模型。
约定的目录结构
约定 > 配置 > 编码(思想),比如 Springboot 提供大量默认配置(约定),大幅度减少配置量(配置文件报错难以定位),提高开发速度。
坐标
确定 Maven 仓库中唯一确定的 jar 包
groupId:公司域名倒序 + 项目名称
artifactId:项目的模块名称
version:模块的版本
依赖生效范围
compile:(默认)main 和 test 目录下的代码都可以使用,部署到 Tomcat 服务器上运行时该 jar 包会放在 WEB-INF 的 lib 目录下
test:仅 test 目录下的代码可以使用,部署到 Tomcat 服务器上运行时该 jar 包不会放在 WEB-INF 的 lib 目录下
provided:main 和 test 目录下的代码都可以使用,部署到 Tomcat 服务器上运行时该 jar 包不会放在 WEB-INF 的 lib 目录下(原因是,比如 Tomcat 自带的 jar 包,像 servlet)
compile:编译 classpath + 测试 classpath + 运行 classpath
test:测试 classpath
provided:编译 classpath + 测试 classpath
runtime:测试 classpath + 运行 classpath
依赖的传递
如果项目 A 依赖 B,B 依赖 C,也就是 A 间接依赖 C,A 可以访问到 C 中 compile 的依赖包,C 中 test/provided 的依赖包对 A 不可见
依赖的排除
<dependency>
<groupId>xxx.xxx.project</groupId>
<artifactId>module</artifactId>
<version>1.0-SNAPSHOT</version>
<!--依赖排除-->
<exclusions>
<exclusion>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
</exclusion>
</exclusions>
</dependency>
统一管理 jar 包版本
<properties>
<spring.version>2.0.0.RELEASE</spring.version>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
继承
父工程的打包方式为 pom,删除 src 目录
<groupId>xxx</groupId>
<artifactId>Parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
父工程统一管理 jar 包版本,子工程中也要引入相应 jar 包,不用写版本,若写版本会覆盖掉父工程对应的版本。如果不用 dependencyManagement,子工程不用引入对应的包就行!
<dependencyManagement>
<dependencies>
<dependency>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
<version>1.0</version>
<scope>xxx</scope>
</dependency>
</dependencies>
</dependencyManagement>
<modules>
<module>子工程1</module>
<module>子工程2</module>
</modules>
子工程
<parent>
<groupId>xxx</groupId>
<artifactId>Parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>