maven很久之前学过,但后面没搞java就基本忘了,基本的打包命令都忘得一干二净。最近准备深入学习下java,头一个要学的便是maven。在此记录下maven的学习笔记。
1. maven介绍
maven主要用作java程序的打包,专门为java项目设计的管理和构建工具。
通过maven创建的项目结构大致如下:
1 | ➜ maventest tree |
pom.xml
文件就是maven的描述文件,里面存放了对应的依赖包名及对应的版本。
src
目录存放代码,下面的子目录java文件夹存放java代码,resource文件主要存放资源文件。
pom.xml文件的基本结构如下:
1 |
|
groupId
类似于java的包名,一般是公司或者组织名称。
artifactId
通常是项目的名称
version
就是项目的版本
通常由这三个元素作为了项目的唯一标识。
dependencies
则是当前maven项目所要依赖的包。包的标识也由上面三个因素所确定。当写好依赖后,maven会自动的将依赖包下载到classpath当中。
注:只有以-SNAPSHOT结尾的版本号会被Maven视为开发版本,开发版本每次都会重复下载依赖,这种SNAPSHOT版本只能用于内部私有的Maven repo,公开发布的版本不允许出现SNAPSHOT。
2. maven配置
maven有仓库的概念,所有的依赖都是从仓库中下载的。
仓库的类型有如下几种:
- 本地仓库:电脑上的仓库,默认路径在:
~/.m2/repository
- 私服仓库:一般公司内部自己搭建的仓库
- 中央仓库:apache团队维护的仓库
仓库的查找顺序如下:
中央仓库的优先级最低,一般是从本地开始查找,没有就找私服仓库,再没有就找中央仓库。一般国内的情况访问中央仓库都比较慢,所以一般在使用仓库的时候都要配置仓库镜像。
配置仓库镜像:
配置文件的位置在:~/.m2/settings.xml
在里面添加如下的配置即可:
1 | <mirrors> |
该处最好不要使用阿里云的maven仓库,默认是不带索引的,所以添加到idea中,会无法更新maven索引,也就没法使用dependency自动添加的插件。
maven依赖查询的网站在:https://search.maven.org/搜索关键字即可找到对应的包
3. maven常用命令
maven中有几个常用的命令,在IDEA中直接做成了按钮,可以点击实现,但也要学一下命令是怎么回事。
mvn clean
:清理编译好的文件
mvn compile
:将java代码编译成class文件
mvn test
:项目测试
mvn package
:根据配置将项目打包成jar或者war
mvn install
:将生成的jar包复制到本地的maven仓库中,其他项目就可以使用这个jar包了
mvn deploy
:将生成的jar包复制到私有的仓库中,供其他开发者使用
生命周期Lifecycle
生命周期包含一系列的阶段(phase),下面是default
的声明周期:
- validate
- initialize
- generate-sources
- process-sources
- generate-resources
- process-resources
- compile
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources
- test-compile
- process-test-classes
- test
- prepare-package
- package
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install
- deploy
当我们运行mvn pachage
时,maven就会执行声明周期,运行到package的phase为止。
第二个clean
的声明周期,由三个phase组成:
- pre-clean
- Clean
- post-clean
当我们使用mvn
命令时,后面跟上的参数就是phase,maven根据生命周期运行到指定的phase。
例如执行命令mvn clean test
,则是先执行clean生命周期到clean,然后再执行default生命周期到test,执行的phase如下:
- Pre-clean
- clean
- validate
- …
- Package
Goal
执行一个phase又会触发多个goal,相当于goal是组成phase的一部分,phase又是组成lifecycle的一部分。
执行compile,对应的goal:compiler:compile
执行test,对应的goal:compiler:testCompile surefire:test
大多数情况,我们只要指定phase,就默认执行这些phase默认绑定的goal,只有少数情况,我们可以直接指定运行一个goal,例如,启动Tomcat服务器:
1 | mvn tomcat:run |
IDEA中配置自动加载dependency
maven的中央仓库镜像设置为谷歌的镜像后,通过idea可以自动更新仓库索引,如下图
更新完了后,在pom.xml的dependencies中就可以进行模糊查找依赖包了。
4. 依赖管理
通常的依赖的配置文件如下:
1 | <dependency> |
组成依赖的元素有四个:groupId
、artifactId
、version
、scope
。
其中scope表示了依赖的范围,主要的值如下所示:
依赖还有模块的继承使用方法,具体可以查看https://www.liaoxuefeng.com/wiki/1252599548343744/1309301243117601。
5. Archetype
顾名思义就是模板,maven项目的模板工具包。能够通过这些模板快速创建一些工程。在使用IDEA创建maven工程时,内置了许多模板。
一般我们很少去研究所有的模板,一般常用的模板就那么几个,一般最常用的就是下面这个,拿来创建web站点:
org.apache.maven.archetypes:maven-archtype-webapp
还有其他很多模板,就不再去深究了