Maven构建环节
- 清理clean:将以前编译得到的旧文件class字节码文件删除
- 编译compile:将java源程序编译成class字节码文件
- 测试test:自动测试,自动调用junit程序
- 报告report:测试程序执行的结果
- 打包package:动态Web工程打War包,java打jar包(不会把jar包部署到本地仓和远程仓)
- 安装install:会把打好的jar包部署到本地maven仓,但不会部署到远程maven私仓
- 部署deploy:将动态Web工程生成的war包复制到Servlet容器下,使其可以运行。会把打好的jar包部署到本地maven仓和远程maven私仓
常用maven命令
- mvn clean:清理
- mvn compile:编译主程序
- mvn test-compile:编译测试程序
- mvn test:执行测试
- mvn package:打包
- mvn install:安装
仓库
maven本地仓库和远程仓库的区别是:1.运行Maven的时候,Maven所需要的任何构件都是直接从本地仓库获取的;2. 当Maven在本地仓库找不到需要的jar文件时,它会查找远程仓库,而一个原始的Maven安装就自带了一个远程仓库——Maven中央仓库。本地仓库
运行Maven的时候,Maven所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
缺省路径~/.m2/repository,可通过settings.xml配置
远程仓库
包含中央仓库和私服仓库
- 中央仓库为maven官方使用的仓库地址
- 私仓为自行搭建的服务器仓库。
执行构建时,会先从本地仓库中查找依赖,然后在远程仓库中查找依赖,如果均不存在,提示错误信息。
依赖
- maven解析依赖信息时会到本地仓库中取查找被依赖的jar包
- 对于本地仓库中没有的会去中央仓库去查找maven坐标来获取jar包,获取到jar之后会下载到本地仓库
- 对于中央仓库也找不到依赖的jar包的时候,就会编译失败了
- 如果依赖的是自己或者团队开发的maven工程,需要先使用install命令把被依赖的maven工程的jar包导入到本地仓库中
依赖范围
![image.png](https://cdn.nlark.com/yuque/0/2022/png/1416299/1653890639050-ebbf2432-6b43-457c-99ce-e929528b4477.png#clientId=u597b40e7-c5f0-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=100&id=u05d308f4&margin=%5Bobject%20Object%5D&name=image.png&originHeight=100&originWidth=487&originalType=binary&ratio=1&rotation=0&showTitle=false&size=84721&status=done&style=none&taskId=ucbb16371-37c6-4d65-800d-91ec8ca8f8b&title=&width=487)<br />scope就是依赖的范围
- compile: 默认值,适用于所有阶段(开发、测试、部署、运行),本jar会一直存在所有阶段。
- provided: 只在开发、测试阶段使用,目的是不让Servlet容器和你本地仓库的jar包冲突 。如servlet.jar。
- runtime: 只在运行时使用,如JDBC驱动,适用运行和测试阶段。
- test: 只在测试时使用,用于编译和运行测试代码。不会随项目发布。
- system: 类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
依赖高级特性
依赖的传递性
- WebMavenDemo项目依赖JavaMavenService1
- JavaMavenService1项目依赖JavaMavenService2
pom.xml文件配置好依赖关系后,必须首先mvn install后,依赖的jar包才能使用。
- WebMavenDemo的pom.xml文件想能编译通过,JavaMavenService1必须mvn install
- JavaMavenService的pom.xml文件想能编译通过,JavaMavenService2必须mvn install
注意:非compile范围的依赖是不能传递的。
依赖版本的原则
- 路径最短者优先原则
Service2的log4j的版本是1.2.7版本,Service1排除了此包的依赖,自己加了一个Log4j的1.2.9的版本,那么WebMavenDemo项目遵守路径最短优先原则,Log4j的版本和Sercive1的版本一致。
- 路径相同先声明优先原则
这种场景依赖关系发生了变化,WebMavenDemo项目依赖Sercive1和Service2,它俩是同一个路径,那么谁在WebMavenDemo的pom.xml中先声明的依赖就用谁的版本。
统一管理依赖的版本
为了统一管理版本号,可以使用properties标签,里面可以自定义版本的标签名。在使用的地方使用${自定义标签名}
build配置
<build>
<!-- 项目的名字 -->
<finalName>WebMavenDemo</finalName>
<!-- 描述项目中资源的位置 -->
<resources>
<!-- 自定义资源1 -->
<resource>
<!-- 资源目录 -->
<directory>src/main/java</directory>
<!-- 包括哪些文件参与打包 -->
<includes>
<include>**/*.xml</include>
</includes>
<!-- 排除哪些文件不参与打包 -->
<excludes>
<exclude>**/*.txt</exclude>
<exclude>**/*.doc</exclude>
</excludes>
</resource>
</resources>
<!-- 设置构建时候的插件 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.1</version>
<configuration>
<!-- 源代码编译版本 -->
<source>1.8</source>
<!-- 目标平台编译版本 -->
<target>1.8</target>
</configuration>
</plugin>
<!-- 资源插件(资源的插件) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<phase>compile</phase>
</execution>
</executions>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- war插件(将项目打成war包) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1</version>
<configuration>
<!-- war包名字 -->
<warName>WebMavenDemo1</warName>
</configuration>
</plugin>
</plugins>
</build>
Spring Boot项目使用maven打jar包以后,包路径变化,多了一层BOOT-INF
在pom.xml配置文件里面添加<configuration><skip>true</skip></configuration>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>