Maven_01:Maven的具体介绍与使用
Posted ABin-阿斌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Maven_01:Maven的具体介绍与使用相关的知识,希望对你有一定的参考价值。
我是 ABin-阿斌:写一生代码,创一世佳话,筑一揽芳华。 如果小伙伴们觉得我的文章有点 feel ,那就点个赞再走哦。
文章目录
一、Maven
Maven概述
- Maven 是跨平台的项目管理工具。作为 Apache 组织提供的一个颇为成功的开源项目,Maven 主要服务于基于 Java 平台的项目构建,依赖管理和项目信息管理。
- 无论是小型的开源类库项目,还是大型的企业级应用;无论是传统的瀑布式开发,还是流行的敏捷模式,Maven 都能大显身手。
Maven能干什么
主要有两个作用:
- maven 工程对 jar 包的管理过程
- 项目的一键构建
1. maven工程对jar包的管理过程:
2. 项目的一键构建
- 先来说说什么是构建?指的是项目从编译、测试、运行、打包、安装 ,部署整个过程都交给 maven 进行管理,这个过程称为构建
- 一键构建指的是整个构建过程,使用 maven 一个命令可以轻松完成整个工作
Maven的核心概念
Maven目录结构
maven中约定的目录结构图解:
各个目录结构详解:
Maven工程的目录结构
- src/main/java: 存放项目的 .java 文件
- src/main/resources:存放项目资源文件,如 spring,hibernate 配置文件
- src/test/java: 存放所有单元测试 .java 文件,如 JUnit 测试类
- src/test/resources:测试资源文件
- target:项目输出位置,编译后的 class 文件会输出到此目录
- pom.xml: maven 项目核心配置文件
注意事项:
- 如果是普通的 java 项目,那么就没有 webapp 目录
关于 pom.xml 文件的内容:
1. Maven 坐标
- 使用 x、y 坐标,可以在平面上定位任意一个点。
- 使用 x、y、z 坐标可以在空间中定位任意一个点。
- 使用 Maven 坐标可以在 Maven 的世界中唯一的定位一个构建,这个构建可以是一个 Maven 的插件,也可以是第三方 JAR 包,还可以开发人员自己编写的模块。
2. Maven坐标包含三个向量
-
groupId: 定义当前 Maven 项目所隶属的项目,通常为公司或组织的域名的倒序+项目名。例如:org.apache.commons
-
artifactId: 定义实际项目中的一个模块
-
version: 定义当前项目的当前版本。如果项目还在开发中是不稳定版本,通常在版本后带 -SNAPSHOT。version使用三位数字标识。例如:1.1.0
-
name: 项目的名称
-
packaging: 项目打包的类型,可以使 jar、war、rar、ear、pom,默认是 jar(一般父工程设置为pom,子工程设置为jar),web项目是 war 包。
-
dependencies | dependency: Maven 的一个重要作用就是管理 jar 包,为了一个项目可以构建或运行,项目中不可避免的,会依赖很多其他的 jar 包。在 Maven 中,这些 jar 就被称为依赖。使用标签 dependency 来配置。而这种依赖的配置正是通过坐标来定位的,由此我们也不难看出 maven 把所有的 jar 包也都视为项目存在了。
-
properties: 是用来定义一些配置属性的,例如 project.build.sourceEncoding(项目构建源码编码方式),可以设置为 UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级(配置属性)。
<properties>
<!--源码编译jdk版本-->
<maven.compiler.source>1.8</maven.compiler.source>
<!--运行代码的jdk版本-->
<maven.compiler.target>1.8</maven.compiler.target>
<!--项目构建使用的编码,避免中文乱码-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--生成报告的编码-->
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
-
build: 表示与构建相关的配置,例如设置编译插件的 jdk 版本(构建)
-
parent: 在 Maven 中,如果多个模块都需要声明相同的配置。例如:groupId、version、有相同的依赖、或者相同的组件配置等。也有类似 Java 的继承机制,用 parent 声明要继承的父工程的 pom 配置(继承)。
-
modules: 在 Maven 的多模块开发中,为了统一构建整个项目的所有模块,可以提供一个额外的模块,该模块打包方式为 pom,并且在其中使用 modules 聚合的其它模块。这样通过本模块就可以一键自动识别模块间的依赖关系来构建所有模块,叫 Maven 的聚合。
-
description:描述信息
relativePath 相对路径
- 父项目的 pom.xml 文件的相对路径。默认值为 …/pom.xml 。maven 首先从当前构建项目开始查找父项目的 pom 文件,然后从本地仓库,最后从远程仓库。RelativePath 允许你选择一个不同的位置。
- 如果默认 …/pom.xml 没找到父元素的 pom,不配置 relativePath 指向父项目的 pom 则会报错
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--Maven模型的版本,对于Maven2和Maven3来说,它只能是4.0.0-->
<modelVersion>4.0.0</modelVersion>
<!--groupId、artifactId、version三个元素生成了一个Maven项目的基本坐标,
在众多的maven项目中可以唯一定位到某一个项目。
坐标也决定着将来项目在仓库中的路径及名称 -->
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--名称-->
<name>gulimall</name>
<!--描述-->
<description>聚合</description>
<!--打包-->
<packaging>pom</packaging>
<!--模块-->
<modules>
<module>gulimall-member</module>
<module>gulimall-order</module>
<module>gulimall-coupon</module>
<module>gulimall-ware</module>
<module>gulimall-product</module>
<module>renren-fast</module>
<module>renren-generator</module>
<module>gulimall-common</module>
<module>gulimall-gateway</module>
</modules>
<!--插件-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--Maven模型的版本,对于Maven2和Maven3来说,它只能是4.0.0-->
<modelVersion>4.0.0</modelVersion>
<!--父工程的坐标-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!--公司名或组织名的域名倒序-->
<groupId>com.atguigu.gulimall</groupId>
<!--模块名-->
<artifactId>gulimall-order</artifactId>
<!--版本号-->
<version>0.0.1-SNAPSHOT</version>
<!--名称-->
<name>gulimall-order</name>
<!--描述-->
<description>谷粒商城-订单服务</description>
<!--配置信息-->
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR3</spring-cloud.version>
</properties>
<!--依赖-->
<dependencies>
<dependency>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
仓库管理 repository
仓库的分类:
1. 本地仓库 :
- 用来存储从远程仓库或中央仓库下载的插件和 jar 包,项目使用一些插件或 jar 包,优先从本地仓库查找。
注意事项:
- 默认本地仓库位置在 u s e r . d i r / . m 2 / r e p o s i t o r y , {user.dir}/.m2/repository, user.dir/.m2/repository,{user.dir}表示 windows 用户目录。
2. 远程仓库
中央仓库:
- 在maven软件中内置一个远程仓库地址 http://repo1.maven.org/maven2,它是中央仓库,服务于整个互联网。它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包含了世界上大部分流行的开源项目构件。
私服:
- 在局域网环境中部署的服务器,为当前局域网范围内的所有 Maven 工程服务,实际开发中公司用的就是这种。
中央仓库的镜像:
- 假设在不同位置,欧洲、美洲、亚洲等每个洲都有若干的服务器,为中央仓库分担流量。减轻中央仓库的访问,下载的压力。所在洲的用户首先访问的是本洲的镜像服务器。
Maven的生命周期
什么是 Maven 的生命周期
- Maven 生命周期就是为了对所有的构建过程进行抽象和统一。包括项目清理,初始化,编译,打包,测试,部署等所有的构建步骤。
三套相互独立的生命周期
- Maven 对项目构建过程分为三套相互独立的生命周期,请注意这里说的是【三套】,而且【相互独立】。
三套生命周期的分类:
- Clean Lifecycle: 在进行真正的构建之前进行一些清理工作
- Default Lifecycle: 构建的核心部分,编译,测试,打包,部署等等
- Site Lifecycle: 生成项目报告,站点,发布站点
注意事项:
- 再次强调一下它们是相互独立的,你可以仅仅调用 clean 来清理工作目录,仅仅调用 site 来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。
clean生命周期
-
每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行 mvn clean,这个 clean是 Clean 生命周期的一个阶段。有 Clean 生命周期,也有 clean 阶段。
-
Clean生命周期一共包含了三个阶段:
- pre-clean: 执行一些需要在 clean之前完成的工作
- clean: 移除所有上一次构建生成的文件
- post-clean: 执行一些需要在 clean之后立刻完成的工作
-
注意事项:
- mvn clean 中的 clean 就是上面的 clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行。
- 也就是说,mvn clean 等同于 mvn pre-clean clean,如果我们运行 mvn post-clean,那么 pre-clean,clean 都会被运行。
- 这是 Maven 很重要的一个规则,可以大大简化命令行的输入。
-
Site生命周期:
- pre-site: 执行一些需要在生成站点文档之前完成的工作
- site: 生成项目的站点文档
- post-site: 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy: 将生成的站点文档部署到特定的服务器上
注意事项:
- 这里经常用到的是 site 阶段和 site-deploy 阶段,用以生成和发布 Maven 站点,这可是 Maven 相当强大的功能,Manager 比较喜欢,文档及统计数据自动生成,很好看。
Default 生命周期
- Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。
这里,只解释一些比较重要和常用的阶段:
- validate、generate-sources、process-sources、generate-resources
- process-resources: 复制并处理资源文件,至目标目录,准备打包。
- compile: 编译项目的源代码。
- process-classes、generate-test-sources、process-test-sources、generate-test-resources
- process-test-resources: 复制并处理资源文件,至目标测试目录。
- test-compile: 编译测试源代码。
- process-test-classes
- test: 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
- prepare-package
- package: 接受编译好的代码,打包成可发布的格式,如 JAR。
- pre-integration-test、integration-test、post-integration-test、verify
- install: 将包安装至本地仓库,以让其它项目依赖。
- deploy: 将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。
- 运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行 mvn install 的时候,代码会被编译,测试,打包。此外,Maven 的插件机制是完全依赖 Maven 的生命周期的,因此理解生命周期至关重要。
Maven常用命令
-
mvn clean: 将 target 目录删除,但是已经 install 到仓库里的包不会删除
-
mvn compile: 编译(执行的是主程序下的代码)
-
mvn test: 测试(不仅仅编译了src/main/java下的代码,也编译了 java/test/java 下的代码)
-
mvn package: 打包(执行的时候回打成 war 包,编译了 src/main/java下的代码,也编译了 java/test/java 下的代码)
-
mvn install: 安装(执行的时候回打成war包,编译了src/main/java下的代码,也编译了 java/test/java 下的代码,将这个包安装到了本地仓库中)
-
mvn deploy: 部署(需要配置才能执行)
Maven 插件 plugings
作用:
- maven 提供的功能,用来执行清理、编译、测试、报告、打包的程序
分类:
clean插件:
- clean阶段是独立的一个阶段,功能就是清除工程目前下的target目录
resources插件:
- resource 插件的功能就是把项目需要的配置文件拷贝到指定的目当,默认是拷贝 src\\main\\resources 目录下的件到classes目录下。
compile插件:
- compile 插件执行时先调用 resouces 插件,功能就是把 src\\mainjava 源码编译成字节码生成 class 文件,并把编译好的 class 文件输出到target\\classes 目录下
test测试插件:
- 单元测试所用的 compile 和 resources 插件和主代码是相同的,但执行的目标不行。目标 testCompile和testResources 是把 src\\test\\java 下的代码编译成字节码输出到 target\\test-classes,同时把 src\\test\\resources 下的配置文件拷贝到 target\\test-classes。
package打包插件:
- 这个插件是把 class 文件、配置文件打成一个 jar(war或其它格式)包。
deploy发布插件:
- 发布插件的功能就是把构建好的 artifact 部署到本地仓库,还有一个 deploy 插件是将构建好的 artifact 部署到远程仓库。
依赖dependency
-
一个 Maven 项目正常运行需要其它项目的支持,Maven会根据坐标自动到本地仓库中进行查找。对于程序员自己的 Maven 项目需要进行安装,才能保存到仓库中
-
不用 Maven 的时候所有的 ja r都不是你的,需要去各个地方下载拷贝。用了 Maven 所有的 jar 包都是你的,想要谁,叫什么都可以,Maven 将会辅助你。
maven概念模型图
以上是关于Maven_01:Maven的具体介绍与使用的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot MAVEN编译报错Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:(代码片
04_项目一众筹00_01_Maven_项目管理工具whywhathow介绍安装Maven生成项目的时候改build目录修改Maven的仓库路径
Maven:Maven_02:依赖管理与冲突解决及项目继承聚合