Maven快速上手笔记

之前学习Maven时留下的笔记,在这里做记录以便后续查看

一 Maven仓库的基本概念

对于Maven来说,仓库只分为两类:本地仓库和远程仓库。

当第一次运行maven命令的时候,需要网络连接,因为它需要从网上下载一些文件。那么它从哪里下载呢?它是从Maven默认的远程仓库下载的。这个远程仓库有Maven的核心插件和可供下载的jar文件。

当Maven根据坐标寻找构件的时候,它会首先查看本地仓库,如果本地仓库存在,则直接使用;如果本地没有,Maven就会去远程仓库查找,发现需要的构件之后,下载到本地仓库再使用。如果本地仓库和远程仓库都没有,Maven就会报错。

远程仓库分为三种:中央仓库,私服,其它仓库。

  • 中央仓库是默认配置下,Maven下载jar包的地方。
  • 私服是另一种特殊的远程仓库,为了节省带宽时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库。内部的项目还能部署到私服上供其它项目使用。
  • 一般来说,在maven项目目录下,没有诸如lib/这样用来存放依赖文件的目录。当Maven在执行编译或测试时,如果需要使用依赖文件,它总是基于坐标使用本地仓库依赖文件。默认情况下,每个用户在自己的用户目录下都有一个路径名为.m2/repository/的仓库目录。

二 Maven仓库地址

查看依赖版本使用情况及groupId等信息 https://mvnrepository.com/

三 配置文件

  • 配置本地仓库地址
xml 复制代码
<localRepository>D:\Program Files\Maven\repository</localRepository>
  • 配置下载镜像地址
xml 复制代码
<mirrors>
    <mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
 </mirrors>

四 解读pom.xml

xml 复制代码
<!-- project 标签:根标签,表示对当前工程进行配置、管理 -->
<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">
    <!-- modelVersion 标签:从Maven2开始就固定是4.0.0 -->
    <!-- 代表当前pom.xml所采用的标签结构 -->
    <modelVersion>4.0.0</modelVersion>
    
    <!-- 坐标信息 -->
    <!-- groupId 标签:坐标向量之一;代表公司或组织开发的某一个项目 -->
    <groupId>com.atguigu.maven</groupId>
    <!-- artifactId 标签:坐标向量之一;代表项目下的某一个模块 -->
    <artifactId>demo</artifactId>
    <!-- version 标签:坐标向量之一;代表当前模块的版本 -->
    <version>0.0.1-SNAPSHOT</version>
    <!-- packaging 标签:打包方式 -->
    <!-- 取值 jar:生成jar包,说明这是一个java工程 -->
    <!--取值 war:生成war包,说明这是一个web工程 -->
    <!-- 取值pom:说明这个工程是用来管理其它工程的工程 -->
    <packaging>jar<packaging>
    <name>demo</name>
    <!-- properties 标签:在maven中定义属性值 -->
    <properties>
        <!-- 在构建过程中读取源码时使用的字符集 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <!-- dependencies 标签:配置具体依赖信息,可以包含多个dependency子标签 -->
    <dependencies>
        <!-- dependency 标签:配置一个具体的依赖信息 -->
        <dependency>
            <!-- 坐标信息:导入哪个jar包,就配置它的坐标信息即可 -->
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <!-- scope 标签:配置当前依赖的范围 -->
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

五 Maven依赖的基本概念

依赖的基本配置

根元素project下的dependencies可以包含多个dependence元素,以声明多个依赖。每个依赖都应该包含以下元素:

1、groupId,artifactId,version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖

2、Type:依赖的类型,大部分情况下不需要声明。默认值为jar

3、Scope:依赖的范围(compile,test,provided,runtime,system)

  • compile:编译依赖范围
    如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效
    通常使用的第三方框架的jar包这样在项目实际运行时真正要用到的jar包都是以compile范围进行依赖的。比如SSM框架所需jar包
  • test:测试依赖范围
    使用此依赖范围的Maven依赖,只对于测试calsspath有效,在编译主代码或者运行项目的使用时将无法使用此依赖,典型的例子就是JUnit,它只有在编译测试代码及运行测试的时候才需要
    测试过程中使用的jar包,以test范围依赖进来,比如junit
  • provide:已提供依赖范围
    使用此范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引入一遍(如:servlet-api)
    在开发过程中需要用到的"服务器上的jar包"通常以provide范围依赖进来。比如servlet-api、jsp-api。而这个范围的jar包之所有不在参与部署、不放进war包,就是避免和服务器上已有的同类jar包产生冲突,同时减轻服务器的负担。
  • runtime:运行时的依赖范围
    使用此依赖范围的Maven环境,对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现。项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动
  • system:系统依赖范围
    该依赖与三种classpath的关系。和provided依赖范围完全一致。但是,使用system范围依赖时必须通过systemPath元素显示地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此该谨慎使用

4、Optional:标记依赖是否可选

5、Exclusions:用来排除传递性依赖

其它核心概念

声明周期

1、作用:

为了让构建过程自动化完成,Maven设定了三个生命周期,声明周期中的每一个环节对应构建过程中的一个操作。

2、三个声明周期

  • clean
    • 作用:清理操作相关
    • 环节:pre-clean、clean、post-clean
  • Site
    • 作用:生成站点相关
    • 环节: pre-site、site、post-site、deploy-site
  • Default
    • 作用:主要构建过程
    • 环节: validate、generate-sources、process-sources、generate-resources、process-resources 复制并处理资源文件,至目标目录,准备打包。
      compile 编译项目main目录下的源代码
      process-classes、generate-test-sources、process-test-sources、generate-test-resources、process-test-resources 复制并处理资源文件,至目标测试目录
      test-compile 编译测试源代码
      process-test-classes、test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署
      prepare-package、package 接受编译好的代码,打包成可发布的格式,如jar
      pre-integration-test、integration-test、post-integeration-test、verify、install 将包安装至本地仓库,以其它项目依赖
      deploy将最终的包复制到远程仓库,以让其它开发人员共享;或者部署到服务器上运行

插件和目标

1、插件

Maven的核心程序仅仅负责宏观调度。不做具体工作。具体工作都是由Maven插件完成的。例如:编译就是由maven-compile-plugin-3.1.jar插件来执行的

2、目标

一个插件可以对应多个目标,而每一个目标都和生命周期中的某一个环节对应

Default生命周期中有compile和test-compile两个和编译相关的环节,这两个环节对应compile和test-compile两个目标而这两个目标都是由maven-compile-plugin-3.1.jar插件来执行的

相关推荐
能不能别报错3 小时前
K8s学习笔记(二十三) 网络策略 NetworkPolicy
笔记·学习·kubernetes
喵手3 小时前
调试技巧:从 IDE 调试到生产环境定位问题,提升调试效率的全方位指南
java·ide·调试
摇滚侠3 小时前
Spring Boot3零基础教程,定制 Health 健康端点,笔记83
spring boot·笔记·spring
ysa0510304 小时前
利用数的变形简化大规模问题#数论
c++·笔记·算法
喜欢读源码的小白4 小时前
Spring Boot+MyBatis实现无限层级组织架构设计|邻接表vs闭包表性能对比|树形结构数据存储方案
java·数据库·组织结构·树级层级·无线层级
安当加密4 小时前
基于ASP身份认证服务器实现远程办公VPN双因素认证的架构与实践
java·服务器·架构
报错小能手4 小时前
计算机网络自顶向下方法10——应用层 HTTP/2 成帧 响应报文优先次序和服务器推
笔记·计算机网络
love530love4 小时前
【笔记】Podman Desktop 部署 开源数字人 HeyGem.ai
人工智能·windows·笔记·python·容器·开源·podman
ysdysyn4 小时前
Java奇幻漂流:从Spring秘境到微服务星辰的冒险指南
java·spring·微服务