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包依赖等。

 

  1. groupId : 组织标识,例如:org.codehaus.mojo,生成的目录将是: org/codehaus/mojo目录。
  2. artifactId : 项目名称,例如:my-project,生成的目录将是:org/codehaus/mojo/my-project目录。
  3. version : 版本号,例如:1.0,生成的目录将是:org/codehaus/mojo/my-project/1.0目录。
  4. 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定义如下:

Xml代码  
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
  3.   <modelVersion>4.0.0</modelVersion>  
  4.   <groupId>com.tiantian.mavenTest</groupId>  
  5.   <artifactId>projectA</artifactId>  
  6.   <packaging>jar</packaging>  
  7.   <version>1.0-SNAPSHOT</version>  
  8. </project>  

 

       然后我们有另一个项目projectB,而且projectB是跟projectA的pom.xml文件处于同一个目录下,这时候如果projectB需要继承自projectA的话我们可以这样定义projectB的pom.xml文件。

Xml代码  
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
  3.   <parent>  
  4.     <groupId>com.tiantian.mavenTest</groupId>  
  5.     <artifactId>projectA</artifactId>  
  6.     <version>1.0-SNAPSHOT</version>  
  7.   </parent>  
  8.   <modelVersion>4.0.0</modelVersion>  
  9.   <groupId>com.tiantian.mavenTest</groupId>  
  10.   <artifactId>projectB</artifactId>  
  11.   <packaging>jar</packaging>  
  12.   <version>1.0-SNAPSHOT</version>  
  13. </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的定义应该如下所示:

Xml代码  
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
  3.   <parent>  
  4.     <groupId>com.tiantian.mavenTest</groupId>  
  5.     <artifactId>projectA</artifactId>  
  6.     <version>1.0-SNAPSHOT</version>  
  7.        <relativePath>../projectA/pom.xml</relativePath>  
  8.   </parent>  
  9.   <modelVersion>4.0.0</modelVersion>  
  10.   <groupId>com.tiantian.mavenTest</groupId>  
  11.   <artifactId>projectB</artifactId>  
  12.   <packaging>jar</packaging>  
  13.   <version>1.0-SNAPSHOT</version>  
  14. </project>  

 

聚合

如果projectA聚合到projectB,那么我们就可以说projectA是projectB的子模块, projectB是被聚合项目,也可以类似于继承那样称为父项目。对于聚合而言,这个主体应该是被聚合的项目。所以,我们需要在被聚合的项目中定义它的子模块,而不是像继承那样在子项目中定义父项目。具体做法是:

  • 修改被聚合项目的pom.xml中的packaging元素的值为pom
  • 在被聚合项目的pom.xml中的modules元素下指定它的子模块项目

对于聚合而言,当我们在被聚合的项目上使用Maven命令时,实际上这些命令都会在它的子模块项目上使用。

 

posted @ 2016-03-11 16:34  静静学吧  阅读(124)  评论(0编辑  收藏  举报