简介
Maven 翻译为”专家”、”内行”,是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。
Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。
注:摘自[菜鸟教程]:https://www.runoob.com/maven/maven-tutorial.html
使用原因
减少冗余
在项目开发中,我们常常需要引入第三方的框架和工具包来提高开发速度,以前要使用这些 jar 包就是复制粘贴到 WEB-INF/lib 目录下。当你建了多个项目时有项目都需要引入同一jar包,需要将 jar 包重复复制到 lib 目录下,从而造成工作区中存在大量重复的文件,使工程显得很臃肿。
使用maven后会在本地建一个统一的仓库,用于存放所有jar包、源文件等,当项目需要引入某个jar包时,只需复制其依赖坐标至pom文件中,maven就会自动帮我们导入到项目中。每个jar包本地只保存一份,不仅极大的节约了存储空间,让项目更轻巧,更避免了重复文件太多而造成的混乱。
解决jar包依赖
jar包往往不是孤立存在的,很多 jar 包都需要在其他 jar 包的支持下才能够正常工作,我们称之为 jar 包之间的依赖关系。Maven 就可以替我们自动的将当前 jar 包所依赖的其他所有 jar 包全部导入进来, 无需人工参与,节约了我们大量的时间和精力。
统一下载
我们通常在查找第三方jar包,选择版本上花费很多时间,maven提供个中央仓库,只需你依赖坐标填对,就会自动去 [中央仓库]:https://mvnrepository.com/ 下载。
插件
maven有很多插件,便于功能扩展,比如生产站点,自动发布版本,打包项目等。
Maven生命周期
Maven有三套相互独立的生命周期,分别是 Clean、Default 和 Site。每个生命周期包含一些阶段,阶段是有顺序的,后面的阶段依赖于前面的阶段。不管用户要求执行的命令对应生命周期中的哪一个阶段,Maven都会自动从当前生命周期的最初位置开始执行,直到完成用户下达的指令。
Clean 生命周期:清理项目,包含三个 phase(阶段) :
pre-clean:执行清理前需要完成的工作。
clean:清理上一次构建生成的文件。
post-clean:执行清理后需要完成的工作。
Default 生命周期:构建项目,重要的 phase 如下:
- validate:验证工程是否正确,所有需要的资源是否可用。
- compile:编译项目的源代码。
- test:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。
- package:把已编译的代码打包成可发布的格式,比如 jar、war 等。
- integration-test:如有需要,将包处理和发布到一个能够进行集成测试的环境。
- verify:运行所有检查,验证包是否有效且达到质量标准。
- install:把包安装到maven本地仓库,可以被其他工程作为依赖来使用。
- deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。
Site 生命周期:建立和发布项目站点,phase 如下:
- pre-site:生成项目站点之前需要完成的工作。
- site:生成项目站点文档。
- post-site:生成项目站点之后需要完成的工作。
- site-deploy:将项目站点发布到服务器。
pom文件常用标签介绍
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| <?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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version>
<relativePath/> </parent>
<groupId>com.czm</groupId> <artifactId>back</artifactId> <version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR8</spring-cloud.version> <mysql.version>8.0.12</mysql.version> <spring.boot.version>2.3.4.RELEASE</spring.boot.version> </properties> <description>just a demo</description> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>${spring.boot.version}</version> <type>jar</type>
<scope>test</scope>
<exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <build> <resources> <resource> <targetPath> </targetPath> <filtering>true</filtering> <directory> </directory> <includes> <include>configuration.xml</include> </includes> <excludes> <exclude>**/*.properties</exclude> </excludes> </resource> </resources> <testResources> ... </testResources> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
父项目pom常用坐标
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> <relativePath/> </parent>
<modules> <module>model1</module> <module>model2</module> …… </modules>
<properties> <java.version>1.8</java.version> <spring.boot.version>2.3.4.RELEASE</spring.boot.version> <spring-boot-maven-plugin>2.3.4.RELEASE</spring-boot-maven-plugin> </properties>
<dependencyManagement> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> <version>${spring.boot.version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type>
<scope>import</scope> </dependency> </dependencyManagement>
<build> <pluginManagement> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot-maven-plugin}</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> </plugins> </pluginManagement> </build>
|
Maven中的SNAPSHOT版本和RELEASE版本
在一个Nexus仓库中,一个仓库一般分为Release(public)仓和SNAPSHOT仓,前者存放发布版本(正式版),后者存放快照版本。若pom.xml中指定版本带有”-SNAPSHOT”后缀,则打包出来的就是快照版。
区别
快照版本和正式版本的主要区别在于,本地获取这些依赖的机制有所不同。假设你依赖一个库的正式版本,构建的时候构建工具会先在本次仓库中查找是否已经有了这个依赖库,如果没有的话才会去远程仓库中去拉取。(若远程仓库已经更新新的软件包{如只修改一点代码,没更新版本号},则本地不会更新至最新版)。
快照版不管本地是否已有此jar包,都会去远程仓库查看是否有最新版发布。为充分利用本地缓存机制,采用四种请求策略,分别是:
- always是每次都去远程仓库查看是否有更新。
- daily是只在第一次的时候查看是否有更新,当天的其它时候则不会查看。
- interval允许设置一个分钟为单位的间隔时间,在这个间隔时间内只会去远程仓库中查找一次。
- never是不会去远程仓库中查找(这种就和正式版本的行为一样了)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <repositories> <repository> <id>仓库唯一标识</id> <name>仓库名</name> <url>仓库路径</url> <snapshots> <enabled>true</enabled> <updatePolicy>interval:XX</updatePolicy>
<checksumPolicy>warn</checksumPolicy> </snapshots> </repository> </repositories>
|
参考链接
END