1、Maven基本概念
Maven主要服务于Java平台,用于:
项目构建
依赖管理
项目信息管理
1.1、项目构建的过程
清理项目
编译项目
测试项目
生成测试报告
打包项目
部署项目
1.2、依赖管理
<dependencies> <!-- 使用 Maven 坐标管理 Jar --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- 以上为一个完整示例 --> </dependencies>
1.3、使用 Maven 好处
明确的目录结构
管理依赖简洁
构件项目方便
2、使用 Maven
2.1、Maven 项目目录结构
|----src
| |
| |----main
| | |
| | |----java ——存放项目的 .java 文件
| | |
| | |----resources ——存放项目资源文件,如spring, hibernate配置文件
| | |
| |----test
| | |
| | |----java ——存放测试 .java 文件
| | |
| | |----resources ——存放项目资源文件,如spring, hibernate配置文件
| | |
|----target ——文件编译后的目录
|
|----pom.xml ----Maven项目的配置文件
2.2、Maven常用命令
echo %MAVEN_HOME% 查看Maven安装目录
mvn -v 查看 Maven 版本
(以下需要切换到需要处理的项目的 pom.xml 文件目录下)
mvn clean 清理项目
mvn compile 编译项目
mvn test 测试项目
mvn package 打包:包括编译、测试、打包。
mvn install 安装:上传至本地仓库,包括编译、测试、打包、安装。
mvn site 生成测试报告
mvn deploy 上传项目至私服仓库
(手动创建 Maven,使用控制台命令测试效果)
2.3、pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>springmvc</groupId> <artifactId>springmvc</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>springmvc</finalName> </build> </project>
2.4、Maven 三大生命周期
clean 清理工作
default 构建核心部分(编译、测试、打包、部署)
site 生成项目报告、站点、发布站点
3、Maven 仓库的概念
根据Maven的坐标,定义每个构件在仓库中的位置
路径为 groupId/artifactId/version/artifactId-version.packaging
3.1、Maven 坐标
3.1.1、Maven坐标主要组成:
groupId:定义maven的项目,可以用包名
artifactId:定义项目中的一个模块,一般都是工程名
version:版本
packaging:定义打包方式
3.1.2、Maven 坐标的作用:
用来标识构件,在依赖里面根据坐标来找需要的构件。
3.2、Maven 依赖:
根据maven坐标找依赖的构件
3.2.1、依赖中scope范围
3.2.1.1、compile: 编译依赖范围(默认)。编译,测试,运行三种有效。
3.2.1.2、test:测试依赖范围。只对测试代码有效。
3.2.1.3、provided:已提供依赖范围。对于编译,测试有效,但对于运行无效,因为由容器已经提供。
3.2.1.4、runtime:运行时提供。例如:jdbc驱动
compile、runtime会打到war包里去
test、provided不会打到war包里去
重点:手动测试测试效果
3.2.2、传递性依赖原则(依赖冲突解决):
3.2.2.1、路径最近者优先 CBA,C依赖B,B依赖A,会先用B的jar包
3.2.2.2、路径相同,第一声明者优先:CB,CA,看B,A在C中哪一个先声明
3.3、Maven 继承和聚合
3.3.1、继承:jar 包的统一管理,把 jar 抽取到 parent 项目中
3.3.2、聚合:一键打包
子项目 pom.xml
省略组名和版本号
增加 parent 配置关联父项目
依赖父项目中不共享部分 jar
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 省略组名 --> <!--<groupId>org.yangfan</groupId>--> <artifactId>project2</artifactId> <!--省略版本号--> <!--<version>1.0-SNAPSHOT</version>--> <packaging>war</packaging> <!-- 关联父项目 --> <parent> <!-- 父项目-组名 --> <groupId>org.yangfan</groupId> <!-- 父项目-构件ID --> <artifactId>parent</artifactId> <!-- 父项目-版本 --> <version>1.0-SNAPSHOT</version> <!-- 父项目-路径(同级目录下可省略) --> <relativePath>../parent</relativePath> </parent> <!-- 依赖 --> <dependencies> <!-- 依赖父项目 dependencyManagement 中定义的不共享 jar --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <!--省略版本号--> <!--<version>4.11</version>--> </dependency> </dependencies> <!-- 打包后的名称 --> <build> <finalName>project2</finalName> </build> </project>
父项目 pom.xml
package 改为 pom
定义不共享 jar
定义共享 jar
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.yangfan</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> <!-- 父项目-必须改成 pom --> <packaging>pom</packaging> <!-- 聚合 --> <modules> <module>../project2</module> </modules> <!-- 不共享 jar 依赖 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.yangfan</groupId> <artifactId>maven1</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> </dependencies> </dependencyManagement> <!-- 共享 jar 依赖 --> <dependencies> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging-api</artifactId> <version>1.1</version> </dependency> </dependencies> </project>
3.4、Maven 定义变量
<!-- 定义变量 --> <properties> <org.yangfan.maven1>1.0-SNAPSHOT</org.yangfan.maven1> </properties>
<dependency> <groupId>org.yangfan</groupId> <artifactId>maven1</artifactId> <!-- 使用变量 --> <version>${org.yangfan.maven1}</version> </dependency>