maven理论学习
上一篇 / 下一篇 2012-02-23 10:41:47 / 个人分类:java编程
1、什么是Maven
Apache Maven是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),一个标准几何,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
2、什么是pom?
pom作为项目对象模型。
基本内容:
POM包括了所有的项目信息。
POM定义了最小的maven2元素,允许groupId,artifactId,version等所有需要的元素;groupId,,artifactId, version:描述了依赖的项目唯一标志
- groupId:项目或者组织的唯一标志,并且配置时生成的路径也是由此生成,如com.taobao.cmp生成的相对路径为:/com/taobao/cmp
- artifactId:groupId下的表示一个单独项目的唯一标识符,默认为jar
- version:项目的版本
- packaging:打包的机制,如pom, jar, maven-plugin, ejb, war, ear, rar, par
<groupId>com.taobao.XXXtest</groupId>
<artifactId>XXX-qatest</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
3、POM中的关系:
主要为依赖,合成,继承
3.1依赖关系(dependencies相关):
Maven提供传递依赖:
A->B B->C C->D 则 A依赖D;
A->B->D1.0 A->D2.0 则 A依赖D2.0
A->E1.0 A->E2.0 则 A依赖E1.0
这种依赖方式遵循的原则:最近原则、最先原则(since maven 2.0.9)。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>
3.1.1依赖的范围(scope)
compile(缺省值 ),test,runtime,provided;
依赖范围(scope) | 主源码classpath可用 | 测试源码classpath可用 | 会被打包 |
compile 缺省值 | TRUE | TRUE | TRUE |
test | FALSE | TRUE | FALSE |
runtime | FALSE | TRUE | TRUE |
provided | TRUE | TRUE | FALSE |
Junit包一般来说只有在运行测试的时候需要它,对上一个例子进行改进:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
再举个例子,在开发javaee应用的时候一定会用到servlet-api,它对于主源码和测试源码都是必要的,因为我们的代码中会引入servlet-api的包。但是,在打包的时候,将其放入WAR包就会有问题,因为web容器会提供servlet-api,如果我们再将其打包就会造成依赖冲突,解决方案如下:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
3.1.2依赖归类
随着项目的增大,依赖越来越多。例如依赖了很多spring的jar:org.springframework:spring;org.springframework:spring-mock;org.springframework: spring-aspects,它们的groupId是相同的,artifactId不同,为了管理其版本,可以采用下面这种方式
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-mock</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
<properties>
<spring.version>2.0.7</spring.version>
</properties>
TAG: