Maven架构与用法详解

本文详细介绍了Maven作为项目管理工具的作用,包括其仓库种类、默认配置、项目结构、命令使用、pom.xml和scope的解析,以及settings.xml的配置,旨在帮助读者理解和掌握Maven的基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0. 前言

maven是一个项目管理工具,更细致的说应该是一个包管理工具,那么其出现的契机是什么呐?

回想以前没有maven的日子。

  • 当开发一个项目的时候,有时候需要用到别人已经实现好的jar包,我们需要将这些jar包下载下来添加到项目的lib目录下,并把这个目录添加到classpath中告诉Java执行环境,在哪些目录下可以找到这些jar包;
  • 下载的jar包之间可能会存在依赖关系,所以当我们下载a.jar的时候很可能需要再下载b.jar,这种依赖关系是普遍存在的,且很复杂;
  • 下载完之后jar包还可能会存在版本问题,所以需要保证下载的版本是正确的。等这些都完成之后,项目才有可能运行。
  • 之后我们需要将项目上传到GitHub上,这些lib也需要上传上去,导致项目比较大,别人下载使用也很不方便。
  • 基于这样的前提,才出现了maven,有了maven我们不需要像以前那样自己去下载包,而是在POM中写好所需要的依赖,其会自动去maven仓库下载包,很方便。
  • 下文主要对maven的主要组成部分以及基本的使用操作进行详细说明。

1. maven仓库的种类

maven仓库其实就是存放我们需要的jar包的地方,maven找jar包的过程是这样的,先在本地仓库找,找不到去私服找,然后才去中央仓库找(这种设计哲学与DNS等非常相似),通过这样的方式来节省时间。此外从中央仓库找到的包会在私服和本地都放一份,从私服找到的包也在本地放置一份,因为本地加载包的开销要比其他两个小。

当安装好maven后,在conf/settings.xml文件中可以配置本地仓库的位置,默认是~/.m2/repository,里面存放了一些包。

2. maven一些默认配置

在这里插入图片描述
maven项目结构如上图所示,/src/main/java下面是项目源代码目录;/src/main/test是项目测试代码目录;/target是项目编译输出目录;pom.xml中配置项目所需要的依赖。这样的设计主要的设计哲学是约定由于配置。

3. maven项目详解

安装好的maven目录下包含bin,boot,conf,lib等目录。

  • bin目录:该目录包含了mvn运行的脚本,这些脚本用来配置java命令,准备好classpath和相关的Java系统属性,然后执行Java命令。
  • boot目录:该目录只包含一个文件,该文件为plexus-classworlds-2.5.2.jar。plexus-classworlds是一个类加载器框架,相对于默认的java类加载器,它提供了更加丰富的语法以方便配置,Maven使用该框架加载自己的类库。
  • conf目录:该目录包含了一个非常重要的文件settings.xml。直接修改该文件,就能在机器上全局地定制maven的行为,即对所有用户都生效。一般情况下,我们更偏向于复制该文件至/.m2/目录下(表示用户家目录,windows下~就是C:\Users\Peng,Peng是小编的用户名),然后修改该文件,在用户级别定制Maven的行为。
  • lib目录:该目录包含了所有Maven运行时需要的Java类库,Maven本身是分模块开发的,因此用户能看到诸如maven-core-3.0.jar、maven-model-3.0.jar之类的文件,此外这里还包含一些Maven用到的第三方依赖如commons-cli-1.2.jar、commons-lang-2.6.jar等等。

4. settings.xml配置

settings.xml可以定制Maven的行为,上面已经说到settings.xml可以放在2个位置,~/.m2/setting.xml(默认没有,需要我们自己复制)和${maven.home}/conf/setting.xml

这2个配置文件的加载顺序为~/.m2/setting.xml>${maven.home}/conf/setting.xml,为了不影响他人,所以我们将conf下的settings.xml复制到家目录,在用户级别定制Maven的行为。

比较关键的设置镜像仓库,一般设置为阿里云的。

5. maven常用命令

命令 描述
mvn -version 显示版本信息
mvn clean 删除target目录
mvn compile 编译src/main/java下的源代码
mvn package 打包,在target下生成jar包或者war包
mvn test 执行src/test/java下以Test开头或者以Test结尾的类的测试用例
mvn install 打包,并把jar包或者war包复制到本地仓库,供其他模块使用
mvn deploy 将打包的文件发布到私服
mvn dependency:tree 打印出项目的整个依赖树
当然也可以连着使用
mvn clean package 清理打包
mvn clean package -DskipTests=true 清理打包,并跳过测试用例
mvn clean install 清理打包,并将jar包或者war包复制到本地仓库

运行单测的时候也没必要一个一个点测试方法,mvn test 一个命令跑完所有测试用例,
要注意的是只会执行以Test开头或者结尾的测试类,也没必要自己写测试类,可以自动生成测试类。

mvn dependency:tree > show.txt 将依赖输出重定向到文件中,方便查看

6. pom.xml详解

在这里插入图片描述
groupId 公司域名倒过来
artifactId 功能命名
version 版本号
这三个维度确定一个jar包,就像用(x,y,z)坐标在三维空间中唯一确定一个点。

7. scope详解

这个属性主要为了标识包的使用范围。

参数解释是否会被打入最终的jar包
compile默认的scope
test测试使用
provided编译需要
runtime编译不需要,运行时需要(接口与实现分离)
system加载本地jar

对于system需要说明:
system,本地加载jar,当你和第三方公司合作,他们只是给了你一个jar包时,你可以有三种选择

  • mvn install到本地仓库
  • mvn deploy到私服
  • 指定jar包路径,从本地加载

参考自:Maven的架构,用法介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值