Maven项目的核心是pom.xml,POM(项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖。Maven的一个最大的功能是管理项目依赖,为了能自动解析每一个构件,Maven必须将它们唯一标识,这就涉及到了坐标的概念。关于坐标,大家最熟悉的定义就是来自平面几何中的,x,y轴,通过x,y轴可以确定平面中的一点。在Maven中有非常多的构件,也就是平时的jar,war文件等。以前在引入Maven以前,一个项目中要依赖各种jar包,必须到各个官网上去下载对应的jar包,引入到系统中。重复地搜索,浏览下载,花费了大量的时间。Maven可以解决这些问题,Maven定义了一组规则:任何一个构件都可以通过坐标唯一标识。
Maven坐标元素:groupId,artifactId,version,packaging,classifier。只要提供正确的坐标元素,Maven就能找到对应的构件。Maven究竟是从何处下载这些构件的呢?答案是Maven有一个内置的中央仓库,该仓库中包含了世界上大部分流行的开源项目构件,Maven会在需要的时候去中央仓库下载。
坐标详解
Maven坐标是通过一组元素定义的,它们是groupId,artifactId,version,packaging,classifier。如下:
<groupId>com.somnus</groupId>
<artifactId>Spring</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
- groupId
定义当前Maven项目隶属的实际项目,通常和项目所在的组织或公司存在关联。通常就是组织+项目名组成。如你的公司是mycom,项目是myapp,那么groupId为:com.mycom.myapp。 - artifactId
定义了当前Maven项目在组中唯一的ID,使用该元素定义实际项目中的一个Maven项目(模块),推荐的做法是使用项目名称作为artifactId作为前缀,这样的好处是方便寻找实际构件。在默认情况下,Maven生成的构件会以artifactId作为开头,如上面会生成Spring-0.0.1.jar,使用实际项目名称作为前缀,就能方便从一个lib文件夹中找到某个项目的一组构件。 - version
定义了Maven项目当前所处的版本。 - packaging
定义了Maven项目的打包方式。如果packaging为jar,最终会生成一个jar文件;如果是war,则最终生成.war文件。如果不指定,则默认是jar。 - classifier
该元素用来定义构件输出的一些附属构件,不能直接定义项目的classifier,附属构件不是项目直接默认生成的,而是由附加的插件帮助生成的
Maven依赖
Maven的依赖配置,也是由基本的groupId,artifactId,version等元素组成。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
根元素project下的dependencies可以包含一个或多个dependency元素,以声明一个或多个依赖。每个依赖可以包含的元素有:
1. groupId、artifactId、version:依赖的基本坐标,通过坐标可以找到唯一的构件。
2. type: 依赖的类型,对应与项目坐标定义的packaging,大部分情况下,该元素不需要定义,默认值为jar。
3. scope: 依赖范围。依赖范围是用来控制依赖与编译classpath,测试classpath,运行classpath的关系,有以下几种依赖范围:
1) compile: 编译依赖范围,如果没有指定,就会默认使用该依赖范围。对于编译,测试,运行都有效。
2) test: 测试依赖范围,只对测试classpath有效。
3) provided: 已提供依赖范围。对于编译和测试的classpath有效,运行时无效。
4) runtime: 运行时依赖范围。对于测试和运行时classpath有效,编译主代码时无效。