一、Maven是什么
简单来说Maven是一个标准化的java管理和构建工具,它提供了一系列规范,包括项目结构,构建流程(编译,测试,打包,发布……),依赖管理等。
标准化就是定下的规矩,不能变,该是什么结构就是什么结构,该怎么构建就怎么构建。
二、Maven项目的标准项目结构
- pom.xml:项目描述文件,maven项目管理的关键所在,提供项目版本,java版本管理,模块管理,依赖管理等关键信息
- src/main:存放Java源码的目录
- src/main/resources:存放资源文件的目录
- src/test:存放测试源码的目录
- target:所有编译、打包生成的文件都放在target目录里
三、pom.xml文件结构分析
文件基本结构如图
<project ...><modelVersion>4.0.0</modelVersion><groupId>com.itranswarp.learnjava</groupId><artifactId>hello</artifactId><version>1.0</version><packaging>jar</packaging><properties>...</properties><dependencies><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency></dependencies>
</project>
其中:
- modelVersion:指定POM(Project Object Model)结构版本,这个版本规定好了能够在Maven项目配置文件中使用的结构和元素
- groupId:类似于Java包名,通常是公司或者组织名称
- artifactId:java类名,通常是项目名称
- version:版本
- dependency:项目的依赖包
引用其他第三方库时,用groupId,artifactId, version确定这个库
三、依赖管理
Maven通过递归式的分析包的依赖关系,不断导入依赖的包,解决包的管理关系。
当我们声明了abc的依赖时,Maven自动把abc和xyz都加入了我们的项目依赖,不需要我们自己去研究abc是否需要依赖xyz。
因此,Maven的第一个作用就是解决依赖管理。我们声明了自己的项目需要abc,Maven会自动导入abc的jar包,再判断出abc需要xyz,又会自动导入xyz的jar包,这样,最终我们的项目会依赖abc和xyz两个jar包。
不同的依赖关系 dependence中的<scope>项目:
- compile:编译时需要用到的jar包(默认)
- test:编译Test时需要用到该jar包
- runtime:编译时不需要,运行时需要,如jdbc
- provided:编译时需要用到,但运行时由某个jdk或服务器提供
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可以简化为:
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.itranswarp.learnjava</groupId><artifactId>parent</artifactId><version>1.0</version><relativePath>../parent/pom.xml</relativePath></parent><artifactId>module-a</artifactId><packaging>jar</packaging><name>module-a</name>
</project>
即使用<parent>继承parent的内容
如果模块A依赖模块B,则模块A需要模块B的jar包才能正常编译,我们需要在模块A中引入模块B
...<dependencies><dependency><groupId>com.itranswarp.learnjava</groupId><artifactId>module-b</artifactId><version>1.0</version></dependency></dependencies>
编译时在根目录创建pom.xml统一编译,同时添加modules模块表明下属模块
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itranswarp.learnjava</groupId><artifactId>build</artifactId><version>1.0</version><packaging>pom</packaging><name>build</name><modules><module>parent</module><module>module-a</module><module>module-b</module><module>module-c</module></modules>
</project>