Maven是什么
Maven 翻译为"专家"、“内行”,是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。
Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。
Maven的优势
- 项目设置遵循统一的规则。
- 任意工程中共享。
- 依赖管理包括自动更新。
- 一个庞大且不断增长的库。
- 可扩展,能够轻松编写 Java 或脚本语言的插件。
- 只需很少或不需要额外配置即可即时访问新功能。
- 基于模型的构建
- 项目信息的一致性
- 发布管理和发布单独的输出
- 向后兼容
- 并行构建
- 更好的错误报告
目录结构
└─src 源码
├─main 主要
│ ├─java java源码
│ │ └─com
│ │ └─build 包名
│ └─resources 资源: 配置文件
└─test 测试相关
└─java
└─com
└─build
pom.xml
生命周期
- validate 校验
验证项目是否正确且所有必须信息是可用的 - initialize 初始化
执行构建生命周期的主任务之前进行初始化 - compile 编译
源代码编译在此阶段完成 - test 测试
使用适当的单元测试框架(例如JUnit)运行测试。 - package 打包
创建JAR/WAR包如在 pom.xml 中定义提及的包 - integrationTest 集成测试
执行真正的集成测试 - install 安装
安装打包的项目到本地仓库,以供其他项目使用 - deploy 部署
- 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程
坐标
- gourpId
组织名,公司网址的反写 + 项目名称 - artifactId
项目名-模块名 - version
版本 - scope
依赖范围 - classifier
标识符 - type
类型
依赖管理
依赖传递
功能 | 功能描述 |
---|---|
依赖调节 | 决定当多个手动创建的版本同时出现时,哪个依赖版本将会被使用。 如果两个依赖版本在依赖树里的深度是一样的时候,第一个被声明的依赖将会被使用。 |
依赖管理 | 直接的指定手动创建的某个版本被使用。例如当一个工程 C 在自己的依赖管理模块包含工程 B,即 B 依赖于 A, 那么 A 即可指定在 B 被引用时所使用的版本。 |
依赖范围 | 包含在构建过程每个阶段的依赖。 |
依赖排除 | 任何可传递的依赖都可以通过 “exclusion” 元素被排除在外。举例说明,A 依赖 B, B 依赖 C,因此 A 可以标记 C 为 “被排除的”。 |
依赖可选 | 任何可传递的依赖可以被标记为可选的,通过使用 “optional” 元素。例如:A 依赖 B, B 依赖 C。因此,B 可以标记 C 为可选的, 这样 A 就可以不再使用 C。 |
依赖范围
传递依赖发现可以通过使用如下的依赖范围来得到限制:
依赖范围**(scope)** | 编译时依赖 | 测试时依赖 | 运行时依赖 | 是否打入包 | 例子 |
---|---|---|---|---|---|
compile | Y | Y | Y | Y | SLF4J |
provided | Y | Y | Y | N | SERVLET-API |
test | N | Y | N | N | JUNIT |
runtime | N | Y | Y | Y | MYSQL JDBC DRIVER |
system | Y | Y | Y | Y | 有nexus后,不用system |
仓库
Maven仓库
在 Maven 的术语中,仓库是一个位置(place)。
Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。
在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。
Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。
Maven 仓库有三种类型:
- 本地(local)
- 中央(central)
- 远程(remote)
Maven 阿里云(Aliyun)仓库
Maven 仓库默认在国外, 国内使用难免很慢,我们可以更换为阿里云的仓库。
常用命令
- 创建名为myweb的web项目
mvn archetype:generate -DgroupId=com.woniuxy.cq -DartifactId=myweb -Dversion=1.0
- 修改web.xml的头部,升级为3.0
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.0">
- 加一个java目录
D:\>cd D:\maven\pmt\myweb\src\main
D:\maven\pmt\myweb\src\main>mkdir java
- 给pom.xml添加了祖传的Servlet依赖
<!--▽Servlet规范相关▽-->
<!-- servlet API支持 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!-- jstl支持 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.1.2</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
<type>jar</type>
</dependency>
<!--△Servlet规范相关△-->