暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

Maven必知必会与实践

一叶扁舟 2022-10-26
1077

一、理解什么是Maven

1.1、简介

1.1.1、何为maven

Maven就是是专门为Java项目打造的管理和构建工具

它的主要功能有:

  • 提供了一套标准化的项目结构
  • 提供了一套标准化的构建流程(编译,测试,打包,发布……)
  • 提供了一套依赖管理机制

1.1.2、为何引入Maven

【总结】

1、方便项目的构建(支持多种任务,比如校验、编译、测试、打包、部署、发布…)

2、方便依赖管理(直接在pom.xml文件下配置即可,很方便排查依赖冲突问题,并且提供了Maven仓库,让依赖获取非常方便快捷)

3、项目信息管理(开发者信息,版本等等均可在pom.xml中配置)

如果没有Maven,你可能不得不经历下面的过程:

1、如果使用了spring,去spring的官网下载jar包;如果使用hibernate,去hibernate的官网下载Jar包;如果使用Log4j,去log4j的官网 下载jar包…

2、当某些jar包有依赖的时候,还要去下载对应的依赖jar包

3、当jar包依赖有冲突时,不得不一个一个的排查

4、执行构建时,需要使用ant写出很多重复的任务代码

5、当新人加入开发时,需要拷贝大量的jar包,然后重复进行构建

6、当进行测试时,需要一个一个的运行…检查

有了Maven,它提供了三种功能:

1、依赖的管理:仅仅通过jar包的几个属性,就能确定唯一的jar包,在指定的文件pom.xml中,只要写入这些依赖属性,就会自动下载并管理jar包。

2、项目的构建:内置很多的插件与生命周期,支持多种任务,比如校验、编译、测试、打包、部署、发布…

3、项目的知识管理:管理项目相关的其他内容,比如开发者信息,版本等等

1.1.3、Maven项目

  • Maven项目层级

    一个使用Maven管理的普通的Java项目,它的目录结构默认如下:

    a-maven-project ├── pom.xml # 依赖、项目信息配置 ├── src │ ├── main │ │ ├── java # Java源码的目录 │ │ └── resources # 存放资源文件的目录 │ └── test │ ├── java │ └── resources └── target # 存放所有编译、打包生成的文件
    复制
  • pom.xml文件

    【groupId、artifactId、version】

    groupId类似于Java的包名,通常是公司或组织名称

    artifactId类似于Java的类名,通常是项目名称,再加上version

    一个Maven工程就是由groupIdartifactIdversion作为唯一标识。我们在引用其他第三方库的时候,也是通过这3个变量确定。比如下面的commons-logging

    【dependency、properties】

    使用<dependency>声明一个依赖后,Maven就会自动下载这个依赖包并把它放到classpath中。

    <properties>可以全局配置依赖的版本号

    <project ...> <modelVersion>4.0.0</modelVersion> <groupId>com.itranswarp.learnjava</groupId> <artifactId>hello</artifactId> <version>1.0</version> <packaging>jar</packaging> <properties> <mybatis-plus-generator.version>3.5.3</mybatis-plus-generator.version> </properties> <dependencies> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> </dependencies> </project>
    复制

1.2、仓库

存储依赖jar包的仓库

1.2.1、仓库分类

image.png

Maven仓库分为:本地仓库、远程仓库

当我们拉取依赖时,会先去本地仓库寻找,没有再去远程仓库寻找

  • 本地仓库

    本地仓库主要起缓存作用,默认在~/.m2/repository

    可以通过~/.m2/settings.xml中的<localRepository>修改。

  • 远程仓库

    远程仓库包括:Maven的中央仓库、公共仓库、个人搭建的私有仓库

1.2.2、快照版本

  • 什么是快照版本?

    我们在发布版本时会标识版本比如:2.1、2.2

    但是,如果依赖A、B同时迭代,B需要依赖A,那么A需要及时的给出最新给B使用。

    而A如果每次迭代的非正式版本都是2.1,那么,因为版本号没变,B的开发者的A依赖一直从本地仓库拉取(不变),想要最新版的,每次要清空本地仓库

    A如果每次迭代的非正式版本都用一个新的,比如2.1、2.2…这样会有很多版本,不利于维护

    因此,可以使用快照版本,比如2.1-SNAPSHOT,Maven会自动的打上时间戳,比如2.1-20221019,所以即使每次提交都是2.1-SNAPSHOT版本,B在使用A时,刷新一下本地仓库就能获得A的最新依赖。

  • 快照版本作用?

    用于非正式版本的发布

  • 什么样的是快照版本?

    快照版本使用SNAPSHOT标识,比如:2.1-SNAPSHOT

1.2.3、镜像

  • 什么是镜像?

    如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像

  • 有什么作用

    有些仓库在国内访问速度较慢,因此会出现一些镜像仓库,如阿里云

    <!-- 修改maven的settings.xml 文件 --> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
    复制

1.3、生命周期

1.3.1、生命周期

Maven 构建生命周期就是 Maven 将一个整体任务划分为一个个的阶段,类似于流程图,按顺序依次执行。也可以指定该任务执行到中间的某个阶段结束。

Maven 有以下三个标准的生命周期:

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

其中 default 生命周期的核心阶段如下所示:

image.png

阶段 处理 描述
验证 validate 验证项目 验证项目是否正确且所有必须信息是可用的
编译 compile 执行编译 源代码编译在此阶段完成
测试 Test 测试 使用适当的单元测试框架(例如JUnit)运行测试。
包装 package 打包 创建JAR/WAR包如在 pom.xml 中定义提及的包
检查 verify 检查 对集成测试的结果进行检查,以保证质量达标
安装 install 安装 安装打包的项目到本地仓库,以供其他项目使用
部署 deploy 部署 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程

1.3.2、生命周期的应用

  • 可以指定某个生命周期的阶段

执行 mvn install 命令,将完成 validate, compile, test, package, verify, install 阶段,并将 package 生成的包发布到本地仓库中。其中某些带有连字符的阶段不能通过 shell 命令单独指定。

mvn install
复制
  • 可以指定多个不同构建生命周期的阶段

执行 mvn clean deploy 命令,首先完成的 clean lifecycle,将以前构建的文件清理,然后再执行 default lifecycle 的 validate, compile, test, package, verify, insstall, deploy 阶段,将 package 阶段创建的包发布到远程仓库中。

mvn clean deploy
复制

二、使用Maven

2.1、安装maven

2.1.1、安装maven

由于 JDK 是 Maven 安装的前置条件,所以请使用 java -version 确认是否已经安装了 JDK

  • brew一键安装

    # 安装 brew install maven # 查看版本、安装位置 mvn -v Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: /Users/xxx/maven/apache-maven-3.6.3 Java version: 1.8.0_261, vendor: Oracle Corporation, runtime: /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home Default locale: zh_CN, platform encoding: UTF-8 OS name: "mac os x", version: "10.16", arch: "x86_64", family: "mac"
    复制

2.1.2、IDEA配置Maven

image.png

【User settings file】:Maven配置文件

【Local repository】:Maven本地仓库

默认会放在~/.m2/repository目录下 ("~"代表用户的目录)

可以在自己的maven目录下新建repo目录,然后指定该目录,当maven compiler时,maven依赖的jar包会放到该目录下

2.2、实践

2.2.1、如何找到maven的setting.xml文件

  • 位置1:用户家目录(默认生效位置)

    maven默认会在(用户家目录)/.m2/settings.xml放置,IDEA没有自定义的话,默认是使用这个位置的配置

    mac下可以vi ~/.m2/settings.xml修改

  • 位置2:maven安装目录

    maven安装目录也有:(maven安装目录)/.m2/settings.xml,想要使用这个位置的配置文件需要去IDEA中配置

    maven安装目录可以通过mvn -v命令查看

2.2.2、配置镜像加速

有些仓库在国内访问速度较慢,因此会出现一些镜像仓库,如阿里云

  • 配置当前项目镜像加速

    只需要在当前项目的pom.xml里配置即可

    <repositories> <repository> <id>ali-maven</id> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </repository> </repositories>
    复制
  • 配置全局生效

    修改maven的配置文件setting.xml

    <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
    复制

2.2.3、排除依赖

当我们引入第三方jar包的时候,难免会引入传递性依赖,有些时候这是好事,然而有些时候我们不需要其中的一些传递性依赖

比如,我们不需要spring-core中的commons-logging

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>2.5.6</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency>
复制

2.2.4、依赖版本全局管理

在使用maven构建项目时,相同系列依赖往往需要使用相同的版本号。我们把版本号全局管理,更容易管理

<?xml version="1.0" encoding="UTF-8"?> <project .....> <!-- 全局管理版本号 --> <properties> <okhttp.version>4.9.0</okhttp.version> </properties> <dependencies> <!-- 通过${}引用版本号变量 --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>${okhttp.version}</version> </dependency> </dependencies> </project>
复制

2.2.5、私有仓库配置

  • Nexus搭建配置

    过程略,参考Maven私有仓库搭建以及使用

  • Maven配置

    在maven的settings.xml文件中配置

    <profiles> <profile> <id>MyProfile</id> <repositories> <repository> <id>maven-releases</id> <url>http://192.168.2.132:8081/repository/maven-releases/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>maven-snapshots</id> <url>http://192.168.2.132:8081/repository/maven-snapshots/</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> </profile> </profiles>
    复制
  • 项目配置

    在maven项目的pom.xml中配置

    <!--构件部署至私有仓库--> <distributionManagement> <repository> <id>maven-releases</id><!--此处的id要和settings.xml中repository的id保持一致--> <name>Nexus Release Repository</name> <url>http://192.168.2.132:8081/repository/maven-releases/</url> </repository> <snapshotRepository> <id>maven-snapshots</id><!--此处的id要和settings.xml中repository的id保持一致--> <name>Nexus Snapshot Repository</name> <url>http://192.168.2.132:8081/repository/maven-snapshots/</url> </snapshotRepository> </distributionManagement>
    复制
  • 发布到私有库

    若项目版本号末尾带有 -SNAPSHOT,则会发布到snapshots快照版本仓库

    若项目版本号末尾带有 -RELEASES 或什么都不带,则会发布到releases正式版本仓库

    mvn clean deploy
    复制
最后修改时间:2022-12-09 09:57:58
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

暂无图片
获得了663次点赞
暂无图片
内容获得192次评论
暂无图片
获得了192次收藏
TA的专栏
Java中间件
收录0篇内容
目录
  • 一、理解什么是Maven
    • 1.1、简介
      • 1.1.1、何为maven
      • 1.1.2、为何引入Maven
      • 1.1.3、Maven项目
    • 1.2、仓库
      • 1.2.1、仓库分类
      • 1.2.2、快照版本
      • 1.2.3、镜像
    • 1.3、生命周期
      • 1.3.1、生命周期
      • 1.3.2、生命周期的应用
  • 二、使用Maven
    • 2.1、安装maven
      • 2.1.1、安装maven
      • 2.1.2、IDEA配置Maven
    • 2.2、实践
      • 2.2.1、如何找到maven的setting.xml文件
      • 2.2.2、配置镜像加速
      • 2.2.3、排除依赖
      • 2.2.4、依赖版本全局管理
      • 2.2.5、私有仓库配置