概述
pom 是 project model object
<?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>
</project>
project 标签里可以写的标签
项目描述
<!-- 项目组 -->
<groupId>com.baidu.lego</groupId>
<!-- 项目名 -->
<artifactId>admin-service</artifactId>
<!-- 项目版本 -->
<version>1.2.2</version>
<!-- 项目类型,可选 jar,war,pom。默认是 jar -->
<packaging>jar</packaging>
版本管理
<dependencyManagement>
<dependencies>
<!--spring boot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
1:子模块会自动引入父模块的dependencies依赖,而不会自动引入dependencyManagement的依赖
2:dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖,而且不需要指定version、scope,系统会自动用父模块的version、scope
项目所需依赖
<dependencies>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
生命周期
scope
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
scope | 编译阶段 | 测试阶段 | 运行阶段 | 发布阶段 | 备注 |
---|---|---|---|---|---|
compile | yes | yes | yes | yes | 默认scope |
provided | yes | yes | yes | - | |
system | yes | yes | yes | - | @Deprecated;类似provided; 需指定systemPath属性,从本地仓库下载依赖; |
runtime | - | yes | yes | yes | |
test | - | test | - | - | 举例:junit |
import | ~ | ~ | ~ | ~ | 只用于 dependencyManagement 中type=pom的dependency 举例:spring-cloud-dependencies |
作用域
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 防止将devtools依赖传递到其他模块中 -->
</dependency>
Project A 是 Project B 的 parent
Project A 使用<optional>true</optional>
,Project B 里不会传进这个 dependency
自定义变量
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>12</maven.compiler.source>
</properties>
然后可以在别的地方这么使用:${maven.compiler.source}
Maven 生命周期指令
- clean,清理,在进行真正的构建之前进行一些清理工作,移除所有上一次构建生成的文件。执行该命令会删除项目路径下的target文件,但是不会删除本地的maven仓库已经生成的jar文件。
- validate,验证,验证工程是否正确,所需的信息是否完整。
- compile,编译源码,编译生成class文件,编译命令,只编译选定的目标,不管之前是否已经编译过,会在你的项目路径下生成一个target目录,在该目录中包含一个classes文件夹,里面全是生成的class文件及字节码文件。
- test,单元测试,测试。
- package,打包,将工程文件打包为指定的格式,例如JAR,WAR等。这个命令会在你的项目路径下一个target目录,并且拥有compile命令的功能进行编译,同时会在target目录下生成项目的jar/war文件。如果a项目依赖于b项目,打包b项目时,只会打包到b项目下target下,编译a项目时就会报错,因为找不到所依赖的b项目,说明a项目在本地仓库是没有找到它所依赖的b项目,这时就用到install命令了
- verify,核实,检查package是否有效、符合标准。
- install,安装至本地仓库,将包安装至本地仓库,以让其它项目依赖。该命令包含了package命令功能,不但会在项目路径下生成class文件和jar包,同时会在你的本地maven仓库生成jar文件,供其他项目使用(如果没有设置过maven本地仓库,一般在用户/.m2目录下。如果a项目依赖于b项目,那么install b项目时,会在本地仓库同时生成pom文件和jar文件,解决了上面打包package出错的问题)
- site,站点,生成项目的站点文档
- deploy,复制到远程仓库