Maven知识点的查缺补漏

朱雀 2023-01-14 11:59 217阅读 0赞

文章目录

    1. dependency、scope、option、relativePath标签元素
    • 1.1 dependency元素
    • 1.2 scope
      • 1.2.1 针对依赖的可见性/可用性
      • 1.2.2 针对依赖的传递性
    • 1.3 optional标签
    • 1.4 relativePath标签
    1. maven包依赖原则
    1. maven私服
    1. maven生命周期
    • 4.1 Clean 生命周期
    • 4.2 Default 生命周期
    • 4.3 Site 生命周期
    1. Maven插件和目标
    1. idea中依赖树查询
    • 命令
    • 插件方式
    1. 父子工程

1. dependency、scope、option、relativePath标签元素

1.1 dependency元素

  1. <dependency>
  2. <groupId></groupId>
  3. <artifactId></artifactId>
  4. <version>版本</version>
  5. <type>依赖的类型,对应于项目的packing,默认是jar</type>
  6. <scope>依赖范围</scope>
  7. <systemPath>配合 scope=system时使用</systemPath>
  8. <optional>标记是否为可选依赖</optional>
  9. <exclusions>
  10. 用来排除传递性依赖
  11. <exclusion>
  12. </exclusion>
  13. </exclusions>
  14. </dependency>

1.2 scope

(1)compile:这是依赖项的默认作用范围,即当没有指定依赖项的scope时默认使用compile。compile范围内的依赖项在所有情况下都是有效的,包括运行、测试和编译时;
(2)runtime:表示该依赖项只有在运行时才是需要的,在编译的时候不需要。这种类型的依赖项将在运行和test的类路径下可以访问;
(3)test:表示该依赖项只对测试时有用,包括测试代码的编译和运行,对于正常的项目运行是没有影响的;
(4)provided:表示该依赖项将由JDK或者运行容器在运行时提供,也就是说由Maven提供的该依赖项我们只有在编译和测试时才会用到,而在运行时将由JDK或者运行容器提供;
(5)system:当scope为system时,表示该依赖项是我们自己提供的,不需要Maven到仓库里面去找。指定scope为system需要与另一个属性元素systemPath一起使用,它表示该依赖项在当前系统的位置,使用的是绝对路径;
(6)import:只能用在dependencyManagement里面,且仅用于type=pom的dependency。主要作用: 1. 是将dependency分类;2. 每一类建立单独的pom文件,在需要使用到这些依赖的子model中,使用dependencyManagement管理依赖,并import scope依赖【示例见父子工程】

1.2.1 针对依赖的可见性/可用性






























complie test provided
src->main(主程序) Y N Y
src->test(测试程序) Y Y Y
mvn package后(部署) Y N N

说明:当scope为complile时(默认)则说明(其它同理):
(1)依赖在src->main->java的主程序包下是可以使用的
(2)依赖在src->test->java的测试程序包下是可以使用的
(3)依赖在mvn package打包后,是可以使用的

【todo】注意:在将依赖的scope设置为provided时,我windows本地是打包成功并且测试接口通过了,目前原因未知,请明白的网友告知!!!

1.2.2 针对依赖的传递性

如果A->B->C(A依赖B,B依赖C),那么A能否使用C呢?那要看B依赖C的范围是不是compile,如果是,则可以;如果不是,则不可用
在这里插入图片描述

1.3 optional标签

作用:用来控制该依赖是否可以被传递

1.4 relativePath标签

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.2.4.RELEASE</version>
  5. <relativePath/> <!-- lookup parent from repository -->
  6. </parent>

设定一个空值将始终从仓库中获取,不从本地路径获取,如

默认值为…/pom.xml

查找顺序:relativePath元素中的地址 – 本地仓库 – 远程仓库

2. maven包依赖原则

常遇到的问题是,有不同版本的包,他们都存在传递性依赖,如下
a->b->c->x(1.0)
a->b->x(2.0)
所以为了解决jar包冲突,有以下依赖原则:

  1. 路径最短者优先
  2. 路径相同时,先声明者优先(即dependency标签配置的顺序)

假设有 a->b,b->x和 b->y的 optional值都是true,那么a对于x和y的依赖不会被传递,如果a想要使用x或y的包,那么需要在a中重新进行依赖

3. maven私服

可以使用nexus搭建maven私服,更多信息可自行查阅资料
在这里插入图片描述

4. maven生命周期

Maven 的插件机制是完全依赖 Maven 的生命周期的,因此理解生命周期至关重要。

  1. clean:项目清理的处理
  2. default(或 build):项目部署的处理
  3. site:项目站点文档创建的处理

每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行 mvn clean,这个 clean 是 Clean 生命周期的一个阶段。有 Clean 生命周期,也有 clean 阶段

运行任何一个阶段的时候,它前面的所有阶段都会被运行

4.1 Clean 生命周期

Clean 生命周期一共包含了三个阶段:

  1. pre-clean 执行一些需要在 clean 之前完成的工作
  2. clean 移除所有上一次构建生成的文件
  3. post-clean 执行一些需要在 clean 之后立刻完成的工作

4.2 Default 生命周期

是 Maven 生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里只简单列举几个:






















































生命周期阶段 描述
validate(校验) 校验项目是否正确并且所有必要的信息可以完成项目的构建过程。
compile(编译) 编译项目的源代码
test(测试) 使用合适的单元测试框架运行测试(Juint是其中之一)
package(打包) 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件
verify (验证) 运行任意的检查来验证项目包有效且达到质量标准
install(安装) 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖
deploy(部署) 将最终的项目包复制到远程仓库中与其他开发者和项目共享

4.3 Site 生命周期

Maven Site 插件一般用来创建新的报告文档、部署站点等

5. Maven插件和目标

  1. Maven 的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的
  2. 每个插件都能实现多个功能,每个功能就是一个插件目标
  3. Maven 的生命周期与插件目标相互绑定,以完成某个具体的构建任务

例如:compile 就是插件 maven-compiler-plugin 的一个目标;pre-clean 是插件 maven-clean-plugin 的一个目标

6. idea中依赖树查询

命令

  1. mvn dependency:tree

插件方式

安装maven helper插件,使用其查看pom jar包依赖更加方便快捷

在这里插入图片描述

7. 父子工程

父pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.example</groupId>
  5. <artifactId>parent</artifactId>
  6. <version>1.0.0</version>
  7. <packaging>pom</packaging>
  8. <name>父项目</name>
  9. <modules>
  10. <module>子项目</module>
  11. </modules>
  12. <properties>
  13. <java.version>1.8</java.version>
  14. <java.encoding>UTF-8</java.encoding>
  15. </properties>
  16. <dependencyManagement>
  17. <dependencies>
  18. <!--SpringBoot-->
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-dependencies</artifactId>
  22. <version>${springboot.version}</version>
  23. <type>pom</type>
  24. <scope>import</scope>
  25. </dependency>
  26. <!--SpringCloud-->
  27. <dependency>
  28. <groupId>org.springframework.cloud</groupId>
  29. <artifactId>spring-cloud-dependencies</artifactId>
  30. <version>${spring-cloud.version}</version>
  31. <type>pom</type>
  32. <scope>import</scope>
  33. </dependency>
  34. </dependencies>
  35. </dependencyManagement>
  36. <build>
  37. <plugins>
  38. <plugin>
  39. <groupId>org.apache.maven.plugins</groupId>
  40. <artifactId>maven-compiler-plugin</artifactId>
  41. <version>3.8.1</version>
  42. <configuration>
  43. <source>${java.version}</source>
  44. <target>${java.version}</target>
  45. <encoding>${java.encoding}</encoding>
  46. </configuration>
  47. </plugin>
  48. </plugins>
  49. </build>
  50. </project>

子项目:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <modelVersion>4.0.0</modelVersion>
  4. <parent>
  5. <!-- 父项目的GAV -->
  6. </parent>
  7. <!-- 子项目的GAV -->
  8. <groupId></groupId>
  9. <artifactId></artifactId>
  10. <version></version>
  11. <name></name>
  12. <properties>
  13. <java.version>1.8</java.version>
  14. </properties>
  15. <dependencies>
  16. <!-- 子项目引入的实际依赖,版本号自动从父项目继承 -->
  17. </dependencies>
  18. <build>
  19. <plugins>
  20. <!-- 该插件的主要功能是进行项目的打包发布处理 -->
  21. <plugin>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-maven-plugin</artifactId>
  24. <version>${springboot.version}</version>
  25. <executions>
  26. <execution>
  27. <goals>
  28. <goal>repackage</goal>
  29. </goals>
  30. </execution>
  31. </executions>
  32. </plugin>
  33. </plugins>
  34. </build>
  35. </project>

发表评论

表情:
评论列表 (有 0 条评论,217人围观)

还没有评论,来说两句吧...

相关阅读

    相关 TechBits | HTTP

    前言 对于 HTTP 协议的了解,一直停留在它是一种通信协议,用于帮助客户端和服务端之间的传送多种类型的数据,并在客户端上进行展示。但是对于其中有些字段倒是没有过多理解,

    相关 java

    最近有个需求要把项目发布在weblogic12c服务器中,按照网上的教程对springboot项目进行改造后,陆续遇到了几个问题: 1.weblogic报错:afu.com