首页 > 其他 > 详细

Maven基础学习

时间:2021-04-21 10:21:36      阅读:19      评论:0      收藏:0      [点我收藏+]

近期学习SpringBoot源码,试着搭建了一下源码工程,但老是失败,各种maven报错。所以特地来学习了maven基础知识,记录一下,好以后翻。

  • 基本概念

maven是一个强大的构建工具,能够帮助我们完成自动构建过程:清理,编译,测试,生成测试报告,打包和部署。

 

  • 基本结构

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 5     <groupId>org.springframework.boot</groupId>  <!---->
 6     <artifactId>spring-boot-cli</artifactId>  <!-- ID -->
 7     <version>${revision}</version>  <!-- 版本号 -->
 8     <package>jar</package>    <!--打包方式,默认是jar -->
 9     <name>Spring Boot CLI</name>    <!--名字,便于辨识 -->
10     <description>Spring Boot CLI</description> 
11     <dependencies>
12         <!-- 引入依赖 -->
13         <dependency>
14             <groupId>org.springframework.boot</groupId>
15             <artifactId>spring-boot-loader-tools</artifactId>
16             <version>4.7</version>           
17             <type></type> <!-- 引入的依赖类型 -->
18             <scope>test</scope>  <!-- 引入依赖 -->
19             <exclusions></exclusions> <!-- 用来排除传递性的依赖 -->
20         </dependency>
21     </dependencies>
22 </project>

  依赖范围(scope):在maven编译代码时,是需要使用一套classpath的。故,maven在编译不同的scope时,是使用不同的classpath来达到此目的的,共有编译,运行,测试三种。

scope 传递依赖 释意
compile  是   默认,范围最广
test 测试用到
provided 在compile和test scope内有效,runtime无效
runtime test和runtime 的scope有效,compile无效(目前还不太理解)
system 系统以来(目前还不太理解)

 

  • 依赖的传递性

  当A引用B,B引用来C,那么相当于A引用了C(test和provided scope内不会传递)。  传递原则:路径最近者优先,第一声明者优先。

  如: A 》B》C》D

     B》D

  A会优先引用B依赖的D

使用 mvn dependency:list / tree) 可以展示所有的依赖关系(在pom文件所在的目录执行该命令就可以)。可以利用该命令行来提供公共的jar包,提取到一个pom文件中

 

  • maven的生命周期

maven的生命周期总共有三个,类似于三个流程,但是他们都是相互独立的:clean;default;site。每个周期下都有自己的阶段。他们都是抽象的步骤(类似模板方法),具体动作都是由插件完成的。

clean:清理项目

阶段 释义
pre-clean 执行清理前要完成的工作
clean 清理上一次构建生成的文件
post-clean 执行一些清理后需要完成的动作

default:构建项目,有好多步骤

阶段 释义
validate  
initialize  
generate-source  
process-source  
generate-resource  
process-resource  
compile 编译
process-classes  
generate-test-sources  
process-test-sources  
generate-test-resource  

...

...

..

 
test-compile  
process-test-classes  
test 跑单元测试
prepare-package  
package 打包
...  
install 安装包到maven本地仓库,共本地其他的maven项目使用
deploy 将最全的包复制到远程仓库,供其他人员使用

 

site:构建项目站点

暂时不理解干嘛,也还没有用到过

  • maven命令行和生命周期

  maven的每个生命周期都是相对独立的,但每个生命周期内部的每个阶段都是由强依赖关系的,如下列例子:

命令 解释
mvn clean 调用clean生命周期中的clean阶段。实际上他执行了pre-clean,clean两个阶段
mvn test 该命令调用的是default生命周期的test阶段。实际上它执行了validate、initlize...compile...test的所有阶段
mvn clean install 该命令执行了两个生命周期中的clean和install之前的所有阶段

 

  • 聚合

 当你有A,B两个模块时。你想要同时构建打包它们,以往你需要分别到两个模块下,分别打包。maven提供的聚合功能,可以一次性打包。你可另外在创建一个模块C(空白项目),然后在C模块的POM文件中将A、B聚合。

  <modules>
        <module>A</module>   <!-- 平级目录 -->
        <module>./B</module> <!-- 上级目录 -->
  </modules>

注意点:

  1. 指定的每个module值都是当前POM文件所在目录的相对路径目录。如上述的<module>A</module>是指C模块POM文件所在的目录,平级目录下的一个文件夹。然后会A文件下找对应的POM文件。所以最好将文件夹名和pom文件中的artifactId命名都保持一致,不容易混淆。
  2. 一般来说会将A,B模块创建在C下面,比较有层次。然后三个模块也可以平级

 

  • 继承

  当一个项目有多个模块时,每个模块的项目可能会引入相同的依赖,此时就可以声明一个parent模块(空白项目),将多次引用的依赖,放在parent模块的pom中声明,由子模块来继承。子模块pom文件引入:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-parent</artifactId>
        <version>${revision}</version>
        <relativePath>../spring-boot-parent</relativePath>
    </parent>

  注意记得也要将parent模块引入聚合模块中

 

  • 依赖管理(推荐方式)

  当我们各个模块的功能越来越丰富,引入的依赖也慢慢变多,每个模块的依赖也会不尽相同。若还是简单的直接使用继承关系,会造成无差别继承(即子模块只用到父pom文件中的部分依赖)。此时我们可以在父POM文件中,引入依赖时使用<dependencyManagement>标签,在该元素下的依赖不会引入实际的依赖。

  即在使用时,在父POM文件中使用<dependencyManagement>标签声明所有模块需要的依赖、版本信息等,做一个统一管理。然后在子模块的POM文件中,只需要声明需要需要哪些依赖(不用再声明版本等信息了,在父POM文件中统一管理了)。

<!-- 父POM文件用dependencyManagement标签管理 -->
  <
dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test-support</artifactId> <version>${revision}</version> </dependency>   </dependencyManagement>
<!-- 子模块POM只需声明要那些依赖 -->
<
dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> </dependencies>

 

Maven基础学习

原文:https://www.cnblogs.com/longshun/p/14655944.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!