POM 项目对象模型

来源:互联网 发布:如何做淘宝客 编辑:程序博客网 时间:2024/05/09 06:37

POM

Maven项目,依赖,构建配置,以及构件:所有这些都是要建模和表述的对象。这些对象通过一个名为项目对象模型(Project Object Model,POM)的XML文件描述。

POM包含四类描述和配置:

项目总体信息

它包含一个项目的名称,项目的URL,发起组织,以及项目的开发贡献者列表和许可证。

构建设置

自定义Maven构建的默认行为。可以更改源码和测试代码的位置,可以添加新的插件,可以将插件目标绑定到生命周期,还可以定义站点生成参数。

构建环境

构建环境包含了一些能在不同使用环境中,激活的profile。

POM关系

一个项目甚好孤立存在;它会以来于其他项目,可能从父项目继承POM设置,它要定义自身的坐标,可能还会包含子模块。

超级POM

所有的Maven项目的POM都扩展自超级POM。超级POM定义了一组被所有项目共享的默认设置。

在Maven 2.xxx版本中,比如maven-2.0.9-uber.jar,打开此Jar文件后,在包包org.apache.maven.project下会有pom-4.0.0.xml的文件,但是到了3.xxx版本之后在:Maven安装目录下的:/lib/maven-model-builder-version.jar中 \org\apache\maven\mode目录中的pom-4.0.0.xml

这个超级POM定义了一些由所有项目继承的标准配置变量。这些变量的简单解释:

默认的超级POM定义了一个单独的远程Maven仓库,ID为central。是所有Maven客户端默认配置的访问的中央Maven仓库。该配置可以通过一个自定义的settings.xml文件来覆盖。注意这个默认的超级POM关闭了从中央Maven仓库此案在snapshot构件的功能。如果需要使用一个snapshot仓库,你就要在你的pom.xml或者settings.xml中自定义仓库设置。

中央Maven仓库同事也包含Maven插件。默认的插件仓库就是这个中央仓库。Snapshot被关闭了,而且更新策略被设置成了“从不”,意味着Maven将永远不会自动跟新一个插件,即使新版本的插件发布了。

build元素设置Maven标准目录布局中那些目录的默认值。

从Maven2.0.9开始,超级POM为核心插件提供了默认版本。为了没有在它们POM指定插件版本的用户提供些稳定性。

POM语法

项目版本

Maven项目发布版本号用version编码,又来分组和排序发布。Maven中的版本包含以下部分:主版本,次版本,增量版本,和限定版本号。

                                <major version>.<minor version>.<incremental version>-<qualifier>

版本构建号

限定版本用来表示里程碑构建:alpha和beta发布,限定版本通过连字符与主版本,次版本或增量版本隔离。

SNAPSHOT版本

Maven版本可以包含一个字符串字面量来表示项目正处于活动的开发状态。若版本包含字符串“SNAPSHOT”,Maven会在安装或发布这个组件的时候将该符号展开为一个日期和时间值,转化为UTC(协调世界时)。

SNAPSHOT版本在项目活动的开发过程中使用。如果你的项目以来的一个组件正处于开发过程中,可以依赖于一个SNAPSHOT版本,在你运行构建的时候Maven会定期的从仓库下载最新的snapshot。

作为一个默认设置,Maven不会从远程仓库检查SNAPSHOT版本,要依赖于SNAPSHOT版本,用户必须在POM中使用repository和pluginRpository元素显示的开启下载snapshot的功能。

当发布一个项目的的时候,需要解析所有对SNAPSHOT版本的依赖至正式发布的版本。如果一个项目依赖于SNAPSHOT,那么这个依赖很不稳定,会随时可能变化。发布到非SNAPSHOT版本,因为Maven的超级POM对于中央仓库关闭了snapshot。SNAPSHOT版本只用于开发过程。

LATEST和RELEASE版本

当依赖于一个插件或一个依赖,你可以使用特殊的版本值LATEST或者RELEASE。

LATEST是指某个特定构建最新的发布版本或者快照版(snapshot),最近被部署到某个特定仓库的构件。

RELEASE是指仓库中最后一个非快照版本。

属性引用

一个POM可以通过一对大括弧和前面一个美元符号来包含对属性的引用。

Maven提供了三个隐式的变量,可以使用来访问环境变量,POM信息和Maven Settings:

env

env变量  暴露操作系统或者shell环境变量。

project

暴露POM。可以使用点标记(.)的路径来引用POM元素的值。

settings

暴露了Maven settings信息。可以用点标记(.)的路径来引用settings.xml文件中的元素的值。例如${settings.offline}会引用~/.m2/settings.xml文件中offline元素的值。

除了三个隐式变量,还可以引用系统属性,以及人任何在MavenPOM中和构建profile中的自定义属性组。

项目依赖

Maven可以管理内部和外部依赖。

依赖范围

compile(编译范围)

compile是默认的范围:如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath中可用,同时它们也会打包。

provided(已提供范围)

provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用。

runtime(运行时范围)

runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。

test(测试范围)

test范围依赖 在一般的编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。

system(系统范围)

与provided类似,必须显示的提供一个对于本地系统中JAR文件的路径。这么做是为了允许基于本地对象编译,而这些对象时系统类库的一部分。这样的构件应该是一直可用的,Maven也不会再仓库中去寻找它。如果你将一个依赖范围设置成系统范围,你必须同时提供一个systemPath元素。

依赖版本界限

指定一个满足给定依赖的版本界限。(,)不包含量词。[,]包含量词。

例如,要访问JUnit任意的大于等于3.8但小于4.0的版本

<span style="white-space:pre"></span><dependency>   <span style="white-space:pre"></span><groupId>junit</groupId>   <span style="white-space:pre"></span><artifactId>junit</artifactId><span style="white-space:pre"></span><version>[3.8,4.0)</version><span style="white-space:pre"></span><scope>test</scope><span style="white-space:pre"></span></dependency>

传递性依赖

Maven建立一个依赖图,并且处理一些可能发生的冲突和重叠。

传递性依赖和范围

那些已提供范围和测试范围的传递性依赖往往不对项目产生影响。该规则的例外是已提供范围传递性依赖到已提供范围直接依赖还是项目的一个已提供范围依赖。编译范围和运行时范围的传递性依赖通常会影响那个一个项目,无论它的直接依赖范围是什么。编译范围的传递性依赖将会和直接依赖产生与后者相同范围的的结果。运行时范围的传递性依赖也会和直接依赖产生与后者相同范围的结果,除非当直接依赖是编译范围的时候,结果是运行时范围。

冲突解决

有时候需要排除一个传递性依赖。想使用另外一个实现来替代一个传递性依赖。

<span style="white-space:pre"></span><dependencies><span style="white-space:pre"></span><dependency><span style="white-space:pre"></span><groupId>org.hibernate</groupId><span style="white-space:pre"></span><artifactId>hibernate</artifactId><span style="white-space:pre"></span><version>3.2.5.ga</version><span style="white-space:pre"></span><exclusions><span style="white-space:pre"></span><exclusion><groupId>javax.transaction</groupId><artifactId>jta</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.apache.geronimo.specs</groupId><artifactId>geronimo-jta_1.1_spec</artifactId><version>1.1</version></dependency></dependencies>


依赖管理

Maven在dependencyManagement元素中提供了一种方式来同意依赖版本号。在一个组织或者项目的最顶层的父POM中的dependencyManagement元素能让你在子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencym元素的项目,然后就会使用这个dependencyManagement元素中给指定的版本号。

只有在子项目没有直接声明一个版本的时候,dependencyManagement定义的版本才会被使用。

项目关系

项目关系不仅仅是依赖以及解决一个项目需要能构建出一个构件。Maven可以建模的关系还包括,某个项目是父项目,某个项目是子模块。

坐标详解

坐标为一个项目定义一个唯一的位置。Maven坐标组成部分:

groupId

一个groupId归类一组相关的构件。组定义符基本上类似于一个Java包名。组定义符在Maven仓库中被翻译成路径。

artifactId

是项目的主要定义符。生成一个构件,这个构件将由artifactId命名。当引用一个项目时,需要使用artifactId来引用它。artifactId和groupId的组合必须是唯一的。不能有两个不同的项目拥有同样的artifactId和groupId;在某个特定的groupId下,artifactId也必须是唯一的。

version

一个构件发布时,使用一个版本号发布的。改版本号是一个数字定义符。也可以使用快照(snapshot)版本。

classifier(最少用到的限定符)

如果发布同样的代码,但由于技术原因需要生成两个单独的构件,你就要使用一个分类器(classifier).

多模块项目

包含一系列构建模块的项目。一个多模块项目的打包类型总是pom,很少生成一个构件。一个模块项目的存在只是味儿了将很多项目归类在一起,成为一个构建。注意我们称多模块项目下的项目为“模块”而不是“子项目”。这是有目的的,是为了而不将由多模块项目归类的项目与那些从其它项目继承POM信息的项目混淆。

项目继承

当一个项目声明一个parent的时候,它从父项目的POM中继承信息。它也可以覆盖父POM中的值,或者添加一些新的值。所有的Maven POM从父POM中继承值。如果一个POM没有通过parent元素指定一个直接的父项目,那这个POM就会从超级POM继承值。

当继承一个POM,可以选择直接使用继承的POM信息,或者选择覆盖它。一下Maven从它父POM中竭诚的项目列表:

定义符(groupId和artifactId中至少有一个必须被覆盖)

依赖

开发者和贡献者

插件列表

报告列表

插件执行

插件位置

0 0
原创粉丝点击