Maven
Maven详解
什么是Maven
maven就是一个构建工具、依赖管理工具、项目信息聚合工具,把一个项目抽象成一个POM(项目对象模型),Maven的核心就是POM,其中包含了项目的基本信息
为什么使用Maven
Maven可以脱离传统的eclipse、idea等开发软件对项目进行编译、测试、安装、部署等相关流程。
Maven 的作用如下:
- Maven 统一集中管理好所有的依赖包,不需要程序员再去寻找。
- 对应第三方组件用到的共同 jar,Maven 自动解决重复和冲突问题。
- Maven 作为一个开放的架构,提供了公共接口,方便同第三方插件集成。程序员可以将自己需要的插件,动态地集成到Maven,从而扩展新的管理功能。
- Maven 可以统一每个项目的构建过程,实现不同项目的兼容性管理。
Maven的目录结构
javaweb项目的目录结构
src(源码)
main
java
包名
resources 资源:配置文件
test
java
包名
target (通常导出的war包、jar包等存放在这里)
pom.xml (maven的配置文件)
Maven的生命周期
maven主要有三个生命周期:
clean:项目清理
default(build):项目部署(主要用于构建应用)
site:项目站点文档创建(一般用来创建新的文档报告、部署站点等)
maven 构建(build)生命周期定义了一个项目构建和发布的过程。
构建(build)一个完整的项目过程包括:
验证–>初始化–>生成源码–>处理源码–>生成资源–>处理资源–>编译–>处理类–>生成测试源码–>处理测试源码–>生成测试资源–>处理测试资源–>测试编译–>处理测试代码–>测试–>打包前准备–>打包–>前集成测试–>集成测试–>后集成测试–>检验–>安装–>部署
Maven的坐标
用户完成一个项目的构建,所使用的一些构件都被Maven仓库管理好了。
用户想要找到想要的构件,就必须通过坐标去唯一定位查找,在Maven仓库中,就是用坐标来管理每一个构件的。
一个完整的坐标,由groupId、artifactId、version、packaging、classifier 组成
groupId:表示项目的唯一标识符,通常使用公司域名反写
artifactId:构件的唯一标识,一般为项目名
version:项目的当前版本
packaging:项目产生的构件类型(打包的方式),一般是jar、war、pom等
classifier:定义构件输出的附属构件。
依赖传递
什么是依赖?比如A项目开发时使用到了B库,而B库依赖于C库,那么使用B库时就必须将B库的依赖库C库一起下载,这就是传递依赖。而Maven可以帮我们解决传递依赖的问题,不需要使用传统的方式去一个个下载。
Maven在查找项目需要的依赖的顺序是:先在本地仓库中查找,如果没有找到,再找远程仓库,如果远程仓库没有,再去Maven的*仓库查找。
在 Maven 项目的 pom.xml 中配置所需要构件的坐标,也就是配置依赖。
依赖的配置
pom.xml中的依赖配置
<project>
...
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>
...
</artifactId>
<version>...</version>
<type>...</type>
<scope>...</scope>
<optional>...</optional>
<exclusions>
<exclusion>...</exclusion>
</exclusions>
</dependency>
...
</dependencies>
...
</project>
(1)groupId、artifactId 和 version:依赖的基本坐标。 Maven 是根据坐标找依赖的。
(2)type:依赖的类型,同项目中的 packaging 对应。大部分情况不需要声明,默认是 jar。
(3)scope:依赖的范围
(4)optional:标记依赖是否可选
(5)exclusions:排除传递性依赖
依赖的范围
Java 中有个环境变量叫 classpath。JVM 运行代码的时候,需要基于 classpath 查找需要的类文件,才能加载到内存执行。
(1)compile
编译依赖范围。如果在配置的时候没有指定,就默认使用这个范围。使用该范围的依赖,对编译、测试、运行三种 classpath 都有效。
(2)test
测试依赖范围。使用该范围的依赖只对测试 classpath 有效,在编译主代码或运行项目的时候,这种依赖是无效的。
(3)provided
已提供依赖范围。使用此范围的依赖,只在编译和测试 classpath 的时候有效,运行项目的时候是无效的。比如 Web 应用中的 servlet-api.
(4)runtime
运行时依赖范围。使用该范围的依赖,只对测试和运行的 classpath 有效,但在编译主代码时是无效的。比如 JDBC 驱动实现类,就需要在运行测试和运行主代码时候使用,编译的时候,只需 JDBC 接口就行。
(5)system
系统依赖范围。该范围与 classpath 的关系,同 provided 一样。但是,使用 system 访问时,必须通过 systemPath 元素指定依赖文件的路径。
仓库
Maven 统一存储了所有 Maven 项目用到的构件,这些构件都是共享的,而统一存储的位置就叫仓库。Maven 的仓库,实际上就是 Maven 构件的公共仓库。在实际的 Maven 项目中,只需指明这些依赖的坐标,需要的时候(编译、测试、运行),由 Maven 自动根据坐标找到对应的构件后使用。
Maven 存放构件的仓库分两种:本地仓库和远程仓库。Maven 寻找构件的时候,先查看本地仓库,如果本地仓库存在坐标对应的构件,就直接使用。
如果本地仓库不存在所需要的构件,或者需要查看是否有更新的构件版本,Maven 就会去远程仓库查找,发现需要的构件后,下载到本地仓库后使用。如果本地仓库和远程仓库都没有找到需要的构件,Maven 就报错。
远程仓库又可以分为三种:
*仓库;
私服;
其他公共仓库;
一个简单基础的配置文件如下:
<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>com.javaxx.build</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 打包类型 -->
<packaging>jar</packaging>
<!-- 项目名 -->
<name>demo</name>
<!-- 官方网站 -->
<url>http://maven.apache.org</url>
<!-- 项目属性 -->
<properties>
<!-- 项目构建时的字符编码集 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 依赖: druid gson -->
<dependencies>
<!-- 单元测试工具包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
常用命令
mvn package 构建项目
mvn clean 清空以前编译安装过的历史记录
mvn test 执行单元测试
mvn install 打包和部署项目到本地资源库
mvn site 为项目生成信息文档站点
mvn site-deploy 通过WebDAV部署自动生成的文档站点到服务器
mvn tomcat:deploy 以 WAR 文件部署到 Tomcat
mvn compile:编译源代码
mvn javadoc:javadoc 生成APIDoc文档
本文地址:https://blog.csdn.net/WenCH_java/article/details/107881345