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的架构,用法介绍