maven笔记
今天面试,主要面试的是我简历上的内容,却发现招聘者问我的问题,我虽然都做过,却基本忘光了,这不得不让我深思,要对以前学习的知识进行总结。
下面是我对学习maven的总结:
maven:项目管理工具,主要服务于基于java平台的项目构建,依赖管理和项目信息管理,是跨平台的
maven项目构建是指:可自动化实现项目清理,编译,运行测试,生成文档,打包和部署等
依赖管理:依赖是指jar包间的相互依赖,使用maven管理项目中的jar包,管理方式是自动下载项目所需的jar包(可从本地仓库或远程仓库中下载),统一管理jar包之间的依赖关系。
maven好处:
1.maven使用约定,约定项目的源代码、测试代码、编译好的代码的存放目录。
2.maven可实现自动化项目构建。
3.依赖管理和仓库管理
maven使用:
(1)下载并解压maven压缩包
(2)设置系统环境变量:MAVEN_HOME和Path(前提是安装配置JDK)
其目录约定如下:
MavenProjectRoot(项目根目录)
|----src
| |----main
| | |----java ——存放项目的.java文件
| | |----resources ——存放项目资源文件,如spring, hibernate配置文件
| |----test
| | |----java ——存放所有测试.java文件,如JUnit测试类
| | |----resources ——存放项目资源文件,如spring, hibernate配置文件
|----target ——项目输出位置
|----pom.xml ----用于标识该项目是一个Maven项目
pom(项目对象模型):pom.xml是maven的配置文件,可配置maven项目的groupId,artifactId,version等元素,配置远程仓库,定义项目打包类型,定义jar包依赖等。
- groupId : 组织标识,例如:org.codehaus.mojo,生成的目录将是: org/codehaus/mojo目录。
- artifactId : 项目名称,例如:my-project,生成的目录将是:org/codehaus/mojo/my-project目录。
- version : 版本号,例如:1.0,生成的目录将是:org/codehaus/mojo/my-project/1.0目录。
- packaging : 打包的格式,可以为:pom , jar , maven-plugin , ejb , war , ear , rar , par
groupId:artifactId:version唯一确定了一个artifact
artifact是指一个项目将要产生的文件,可以是jar文件,源文件,二进制文件,war文件,甚至是pom文件。每个artifact都由groupId:artifactId:version组成的标识符唯一识别。需要被使用(依赖)的artifact都要放在仓库(Repository)中
Repositories是用来存储Artifact的。如果说我们的项目产生的Artifact是一个个小工具,那么Repositories就是一个仓库,里面有我们自己创建的工具,也可以储存别人造的工具,我们在项目中需要使用某种工具时,在pom中声明dependency,编译代码时就会根据dependency去下载工具(Artifact),供自己使用。
对于自己的项目完成后可以通过mvn install命令将项目放到仓库(Repositories)中
仓库分为本地仓库和远程仓库,远程仓库是指远程服务器上用于存储Artifact的仓库,本地仓库是指本机存储Artifact的仓库,对于windows机器本地仓库地址为系统用户的.m2/repository下面。
依赖关系:依赖关系列表(dependency list)
依赖关系也由groupId,artifactId,version基本构成
pom继承
被继承项目与继承项目是父子目录关系
现在假设我们有一个项目projectA,它的pom.xml定义如下:
- <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.tiantian.mavenTest</groupId>
- <artifactId>projectA</artifactId>
- <packaging>jar</packaging>
- <version>1.0-SNAPSHOT</version>
- </project>
然后我们有另一个项目projectB,而且projectB是跟projectA的pom.xml文件处于同一个目录下,这时候如果projectB需要继承自projectA的话我们可以这样定义projectB的pom.xml文件。
- <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">
- <parent>
- <groupId>com.tiantian.mavenTest</groupId>
- <artifactId>projectA</artifactId>
- <version>1.0-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.tiantian.mavenTest</groupId>
- <artifactId>projectB</artifactId>
- <packaging>jar</packaging>
- <version>1.0-SNAPSHOT</version>
- </project>
由projectB的pom.xml文件的定义我们可以知道,当需要继承指定的一个Maven项目时,我们需要在自己的pom.xml中定义一个parent元素,在这个元素中指明需要继承项目的groupId、artifactId和version。
被继承项目与继承项目的目录结构不是父子关系
当被继承项目与继承项目的目录结构不是父子关系的时候,我们再利用上面的配置是不能实现Maven项目的继承关系的,这个时候我们就需要在子项目的pom.xml文件定义中的parent元素下再加上一个relativePath元素的定义,用以描述父项目的pom.xml文件相对于子项目的pom.xml文件的位置。
假设我们现在还是有上面两个项目,projectA和projectB,projectB还是继承自projectA,但是现在projectB不在projectA的子目录中,而是与projectA处于同一目录中。这个时候projectA和projectB的目录结构如下:
------projectA
------pom.xml
------projectB
------pom.xml
这个时候我们可以看出projectA的pom.xml相对于projectB的pom.xml的位置是“../projectA/pom.xml”,所以这个时候projectB的pom.xml的定义应该如下所示:
- <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">
- <parent>
- <groupId>com.tiantian.mavenTest</groupId>
- <artifactId>projectA</artifactId>
- <version>1.0-SNAPSHOT</version>
- <relativePath>../projectA/pom.xml</relativePath>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.tiantian.mavenTest</groupId>
- <artifactId>projectB</artifactId>
- <packaging>jar</packaging>
- <version>1.0-SNAPSHOT</version>
- </project>
聚合
如果projectA聚合到projectB,那么我们就可以说projectA是projectB的子模块, projectB是被聚合项目,也可以类似于继承那样称为父项目。对于聚合而言,这个主体应该是被聚合的项目。所以,我们需要在被聚合的项目中定义它的子模块,而不是像继承那样在子项目中定义父项目。具体做法是:
- 修改被聚合项目的pom.xml中的packaging元素的值为pom
- 在被聚合项目的pom.xml中的modules元素下指定它的子模块项目
对于聚合而言,当我们在被聚合的项目上使用Maven命令时,实际上这些命令都会在它的子模块项目上使用。