maven基础知识
maven是什么
maven是一个项目管理工具。
-
依赖管理:maven对项目中jar包的管理过程。传统项目中我们直接会将jar包放在项目里。而maven工程中,真正的jar包是放置在仓库中,项目中只放置jar包的坐标。
-
一键构建:maven自身集成了tomcat插件,可以对项目进行编译,测试,打包,安装,发布等操作。
仓库的种类
仓库有本地仓库,远程仓库(私服),中央仓库。
- 本地仓库:maven 在根据坐标查找依赖的构件时,先是在本地仓库中查找。默认情况下,不管是 Windows 操作系统还是 Linux 操作系统,每个用户在自己的用户目录下都有一个路径名为 .m2/repository/ 的目录,这个目录就是 maven 的本地仓库目录。
- 远程仓库:私服是一种特殊的远程仓库。为了节省带宽,节约下载构件的时间,在局域网内架设一个私有的仓库服务器用来代理所有的外部远程仓库。
- 中央仓库:中央仓库是 maven 自带的远程仓库,它包含了绝大部分开源的构件。在默认配置下,当本地仓库没有 maven 需要的构件的时候,都会尝试先从中央仓库下载。
对于本地仓库的位置是可以修改的。可以编辑 ~/.m2/settings.xml 文件,设置其中的 localRepository 元素的值,就可以改变 maven 本地仓库的默认位置。
<settings>
...
<localRepository>
目录位置
</localRepository>
...
</settings>
仓库之间的关系
当启动一个maven工程时,maven工程会通过pom文件中jar包的坐标,去本地仓库找对应jar包。默认情况下,如果本地仓库中没有对应jar包,maven工程会自动去中央仓库下载jar包到本地仓库。
如果在公司中,本地仓库没有对应jar包,会先从私服下载jar包。如果私服中也没有对应jar包,可以从中央仓库下载,或者从本地上传。
maven常用命令
- clean:清洗
- compile:编译
- test:测试
- package:打包,打包在本地编译目录下
- install:安装,安装到本地仓库
- deploy:本地项目打包到私服
maven生命周期
- 清理生命周期:clean.
- 默认生命周期:compile,test,package,install,deploy.
- 站点生命周期(暂时不涉及)
maven项目导入jar包的版本冲突
第一声明优先原则
哪个jar包坐标靠上的位置,这个jar包就是先声明的。先声明的jar包坐标下的依赖包,可以优先进入项目中。
路径近者优先原则
直接依赖路径比传递依赖路径近,那么最终项目里的jar包会是路径近的直接依赖包。
- 直接依赖:项目中直接导入的jar包,就是项目的直接依赖包。
- 传递依赖:项目中没有直接导入的jar包,可以通过项目直接依赖jar包传递到项目中。
直接排除法
当需要排除某jar包的依赖包时,在该依赖下添加exclusions标签,在配置exclusions标签的时候,内部可以不写版本号。
maven工程拆分聚合思想
说到maven的拆分聚合思想,就需要先了解一下代码可重用的优势。
- 代码可重用:维护代码的话,只需要修改一份。
- 代码复制粘贴到别的地方:粘贴到几个地方就需要维护几个地方。
而maven解决代码可重用和便于维护问题上是这样解决的。
maven把一个完整的项目分成不同的独立模块,这些模块都有各自独立的坐标,哪个地方需要哪个模块,就直接引用该模块的坐标即可。
如果我们在公司中要开发一个新的项目,我们首先要考虑的不是dao,service,utils,domain等模块如何编写,而是考虑这些模块是否存在,如果存在,可以直接引用。
这就是maven拆分思想。
把拆分零散的模块聚合在一起编写成一个完整的项目,就是maven聚合思想。
工程和模块的区别
工程它不是一个完整的项目,而模块也不等同于一个完整的项目。项目是否完整取决于代码,代码完整,就是一个完整的项目,和此项目是工程还是模块没有关系。
- 工程:只能使用自己内部的资源,它是独立存在的。但后天也可以和其他工程建立关系。
- 模块:天生是不独立的,属于父工程的。模块一旦建立,所有父工程的资源都可以使用。
在父子工程之间,子模块天生继承父工程,可以使用父工程所有资源,而子模块之间是没有任何关系的。子模块之间互相引用需要建立依赖。