简单来说Maven是一个标准化的java管理和构建工具,它提供了一系列规范,包括项目结构,构建流程(编译,测试,打包,发布……),依赖管理等。
标准化就是定下的规矩,不能变,该是什么结构就是什么结构,该怎么构建就怎么构建。

文件基本结构如图
4.0.0
com.itranswarp.learnjava
hello
1.0
jar
...
commons-logging
commons-logging
1.2
其中:
引用其他第三方库时,用groupId,artifactId, version确定这个库
Maven通过递归式的分析包的依赖关系,不断导入依赖的包,解决包的管理关系。
当我们声明了abc的依赖时,Maven自动把abc和xyz都加入了我们的项目依赖,不需要我们自己去研究abc是否需要依赖xyz。
因此,Maven的第一个作用就是解决依赖管理。我们声明了自己的项目需要abc,Maven会自动导入abc的jar包,再判断出abc需要xyz,又会自动导入xyz的jar包,这样,最终我们的项目会依赖abc和xyz两个jar包。

不同的依赖关系 dependence中的
Maven通过维护一个中央仓库的信息,来维护依赖的下载信息,所有第三方库将自身的jar及相关信息上传至中央仓库,Maven就可以从中央仓库把依赖库下载到本地。一个jar包一旦被下载过,就会被Maven自动缓存在本地目录。
如果我们要引用一个第三方组件,比如okhttp,如何确切地获得它的groupId、artifactId和version?方法是通过search.maven.org搜索关键字,找到对应的组件后,直接复制
进入到pom.xml所在目录,输入
$ mvn clean package
在target目录下获得自动打包的jar
可以立即为,Maven项目下分为多个不同的模块,每个模块本质上就是一个独立的maven项目,每个项目有独立的pom.xml.这也是大型软件降低复杂度的必要方法。
如果子模块的pom.xml存在多个相同的依赖,可以在大项目下提取出一个pom.xml,这样结构为

模块a可以简化为:
4.0.0
com.itranswarp.learnjava
parent
1.0
../parent/pom.xml
module-a
jar
module-a
即使用
如果模块A依赖模块B,则模块A需要模块B的jar包才能正常编译,我们需要在模块A中引入模块B
...
com.itranswarp.learnjava
module-b
1.0
编译时在根目录创建pom.xml统一编译,同时添加modules模块表明下属模块
4.0.0
com.itranswarp.learnjava
build
1.0
pom
build
parent
module-a
module-b
module-c