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官方使用的仓库地址
  • 私仓为自行搭建的服务器仓库。

执行构建时,会先从本地仓库中查找依赖,然后在远程仓库中查找依赖,如果均不存在,提示错误信息。

依赖

  1. maven解析依赖信息时会到本地仓库中取查找被依赖的jar包
  • 对于本地仓库中没有的会去中央仓库去查找maven坐标来获取jar包,获取到jar之后会下载到本地仓库
  • 对于中央仓库也找不到依赖的jar包的时候,就会编译失败了
  1. 如果依赖的是自己或者团队开发的maven工程,需要先使用install命令把被依赖的maven工程的jar包导入到本地仓库中
  2. 依赖范围

    1. ![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就是依赖的范围
    1. compile: 默认值,适用于所有阶段(开发、测试、部署、运行),本jar会一直存在所有阶段。
    2. provided: 只在开发、测试阶段使用,目的是不让Servlet容器和你本地仓库的jar包冲突 。如servlet.jar。
    3. runtime: 只在运行时使用,如JDBC驱动,适用运行和测试阶段。
    4. test: 只在测试时使用,用于编译和运行测试代码。不会随项目发布。
    5. system: 类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。

依赖高级特性

依赖的传递性

image.png

  • WebMavenDemo项目依赖JavaMavenService1
  • JavaMavenService1项目依赖JavaMavenService2

pom.xml文件配置好依赖关系后,必须首先mvn install后,依赖的jar包才能使用。

  • WebMavenDemo的pom.xml文件想能编译通过,JavaMavenService1必须mvn install
  • JavaMavenService的pom.xml文件想能编译通过,JavaMavenService2必须mvn install

image.png

注意:非compile范围的依赖是不能传递的。

依赖版本的原则

  1. 路径最短者优先原则

image.png
Service2的log4j的版本是1.2.7版本,Service1排除了此包的依赖,自己加了一个Log4j的1.2.9的版本,那么WebMavenDemo项目遵守路径最短优先原则,Log4j的版本和Sercive1的版本一致。

  1. 路径相同先声明优先原则

image.png
这种场景依赖关系发生了变化,WebMavenDemo项目依赖Sercive1和Service2,它俩是同一个路径,那么谁在WebMavenDemo的pom.xml中先声明的依赖就用谁的版本。

统一管理依赖的版本
image.png
为了统一管理版本号,可以使用properties标签,里面可以自定义版本的标签名。在使用的地方使用${自定义标签名}

build配置

  1. <build>
  2. <!-- 项目的名字 -->
  3. <finalName>WebMavenDemo</finalName>
  4. <!-- 描述项目中资源的位置 -->
  5. <resources>
  6. <!-- 自定义资源1 -->
  7. <resource>
  8. <!-- 资源目录 -->
  9. <directory>src/main/java</directory>
  10. <!-- 包括哪些文件参与打包 -->
  11. <includes>
  12. <include>**/*.xml</include>
  13. </includes>
  14. <!-- 排除哪些文件不参与打包 -->
  15. <excludes>
  16. <exclude>**/*.txt</exclude>
  17. <exclude>**/*.doc</exclude>
  18. </excludes>
  19. </resource>
  20. </resources>
  21. <!-- 设置构建时候的插件 -->
  22. <plugins>
  23. <plugin>
  24. <groupId>org.apache.maven.plugins</groupId>
  25. <artifactId>maven-compiler-plugin</artifactId>
  26. <version>2.1</version>
  27. <configuration>
  28. <!-- 源代码编译版本 -->
  29. <source>1.8</source>
  30. <!-- 目标平台编译版本 -->
  31. <target>1.8</target>
  32. </configuration>
  33. </plugin>
  34. <!-- 资源插件(资源的插件) -->
  35. <plugin>
  36. <groupId>org.apache.maven.plugins</groupId>
  37. <artifactId>maven-resources-plugin</artifactId>
  38. <version>2.1</version>
  39. <executions>
  40. <execution>
  41. <phase>compile</phase>
  42. </execution>
  43. </executions>
  44. <configuration>
  45. <encoding>UTF-8</encoding>
  46. </configuration>
  47. </plugin>
  48. <!-- war插件(将项目打成war包) -->
  49. <plugin>
  50. <groupId>org.apache.maven.plugins</groupId>
  51. <artifactId>maven-war-plugin</artifactId>
  52. <version>2.1</version>
  53. <configuration>
  54. <!-- war包名字 -->
  55. <warName>WebMavenDemo1</warName>
  56. </configuration>
  57. </plugin>
  58. </plugins>
  59. </build>

Spring Boot项目使用maven打jar包以后,包路径变化,多了一层BOOT-INF
在pom.xml配置文件里面添加<configuration><skip>true</skip></configuration>

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-maven-plugin</artifactId>
  6. <configuration>
  7. <skip>true</skip>
  8. </configuration>
  9. </plugin>
  10. </plugins>
  11. </build>