经过在 pom.xml 中定义 jar 包版本和依赖,可以方便的管理 jar 文件。pom做为项目对象模型。经过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者须要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其余全部的项目相关因素。
java
<?xml version="1.0" encoding="UTF-8"?> web
<project> spring
<modelVersion>4.0.0</modelVersion> sql
<groupId>...</groupId> apache
<artifactId>...</artifactId> 浏览器
<version>...</version> 服务器
<packaging>...</packaging> eclipse
<dependencies>...</dependencies> maven
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
<build>...</build>
<reporting>...</reporting>
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<license>...</license>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<preprequisites>...</preprequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
经常使用元素的说明:
modelVersion:描述这个POM文件听从哪一个版本的项目描述符
groupId:项目或者组织的惟一标志,而且配置时生成的路径也是由今生成。一般用一个彻底正确的包的名字来与其余项目的相似名字来进行区分(好比:org.apache.maven)
artifactId: 项目的通用名称
groupId 和 artifactId 合起来做为当前项目的惟一标识,maven2最终会根据这两个值,决定项目发布到 repo 上时所处的位置。
version:项目的版本号,它用来标记同一个项目发布的不一样版本。
packaging: 这个项目生产出来的artifact 类型,如 pom, jar, maven-plugin, ejb, war, ear, rar, par ,... 。
最小配置
任何项目都最少要包含如下几个标签。
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
</project>
modelVersion 这个标签必须存在,并且它的值必须是4.0.0,这标志着咱们如今使用的是maven2。
1 maven的继承定义
假设定义了一个父项目:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.taobao</groupId>
<artifactId>taobao-parent</artifactId>
<version>2.0</version>
<packaging>pom</packaging>
</project>
packaging 类型须要pom,用于parent和合成多个项目。那么在其下的子项目中加上以下设置用以继承
<parent>
<groupId>com.taobao</groupId>
<artifactId> taobao-parent </artifactId>
<version>2.0</version>
</parent>
maven继承案例 - springside sample : mini-web:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springside</groupId>
<artifactId>springside3-parent</artifactId>
<version>3.3.2</version>
</parent>
<artifactId>mini-web</artifactId>
<packaging>war</packaging>
<name>Springside3's Mini-Web Example</name>
...
</project>
2 合成(或者多个模块)
一个项目有多个模块,也叫作多重模块,或者合成项目。每个被列出来的子模块都指向包含这个模块的目录文件的相对路径。
以下定义:
<modules>
<module>tc-client</module>
<module>tc-server</module>
</modules>
3 build 设置
pom中一大部分配置都包含在build标签中,这部分是在对项目进行构建时所须要的配置,当你对项目进行编译,测试,打包,发布的时候,这部分配置就会在对应的阶段起做用了。build 主要分为两部分,基本元素和扩展元素集合,注意:包括项目build和profile build
xml 代码 :
<project>
<build>…</build>
<profiles>
<profile>
<build>…</build>
</profile>
</profiles>
</project>
build标签中能够包含不少插件,这些插件能够配置到项目的某些构建阶段,随着项目的构建进程发挥做用。
4 报表部分
咱们执行mvn site就能够为项目生成一系列能够用来描述项目信息的网页,maven2中的一大部分插件就是专门在这时候发挥效用的,它们能够根据项目的结构,源代码,测试,SCM信息等,生成各类特殊功能的报表,这要把这些插件配置在reporting标签中,它们就会在执行mvn site的同时起做用。全部的报告将会包括在浏览器的导航栏中。
xml 代码 :
<project>
<build>…</build>
<profiles>
<profile>
<build>…</build>
</profile>
</profiles>
<reporting>…</reporting>
</project>
5 插件
在build时,执行的插件,比较有用的部分,如使用jdk 5.0编译等等
xml 代码:
<project>
<build>
…
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.0</version>
<extensions>false</extensions>
<inherited>true</inherited>
<configuration>
<classifier>test</classifier>
</configuration>
<dependencies>…</dependencies>
<executions>…</executions>
</plugin>
</plugins>
</build>
</project>
extensions: true or false,是否装载插件扩展。默认false
inherited: true or false,是否此插件配置将会应用于poms,那些继承于此的项目
configuration: 指定插件配置
dependencies: 插件须要依赖的包
executions: 用于配置execution目标,一个插件能够有多个目标。
springside sample : mini-web 中插件配置的案例:
<build>
<plugins>
<!-- eclipse插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<configuration>
<wtpversion>2.0</wtpversion>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature
</projectnature>
</additionalProjectnatures>
</configuration>
</plugin>
</plugins>
</build>
6 资源(resources)你项目中须要指定的资源。如spring配置文件,log4j.properties
xml 代码:
<project>
<build>
…
<resources>
<resource>
<targetPath>META-INF/plexus</targetPath>
<filtering>false</filtering>
<directory>${basedir}/src/main/plexus</directory>
<includes>
<include>configuration.xml</include>
<includes>
<excludes>
<exclude>**/*.properties</exclude>
<excludes>
</resource>
</resources>
<testResources>
…
</testResources>
…
</build>
</project>
resources: resource的列表,用于包括全部的资源
targetPath: 指定目标路径,用于放置资源,用于build
filtering: 是否替换资源中的属性placehold
directory: 资源所在的位置
includes: 样式,包括那些资源
excludes: 排除的资源
testResources: 测试资源列表
7 依赖关系
咱们日常接触最多的就是dependencies和dependency标签了。由于既然使用了maven2,最大的得益之处仍是能够用它统一管理依赖库。dependencies和它内部的dependency标签就用来配置当前项目所依赖的第三方库的,而且每一个依赖都须要groupId,artifactId和version这些数据 。
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<type>jar</type>
<scope>test</scope>
<optional>true</optional>
</dependency>
</dependencies>
</project>
咱们能够看到dependency标签中也包含了groupId,artifactId和version信息,这三部分就是一个maven2项目所需的最小配置,也是maven2所管理的项目的惟一标识,有了这三个数据,maven2就能够在repo中查找到对应的依赖,并将其包含到咱们的项目中,从而实现对依赖库的管理。
上面的依赖中,咱们使用了groupId为junit,artifactId为junit,版本为4.0的依赖,这个依赖会在test做用域中起做用,也就是说,只有在进行单元测试的时候,才会用到这个依赖,与之对应的是,当咱们的程序正常编译,运行,打包发布时,是不会包含这个依赖的。maven2内置了多个做用域,可让咱们将不一样阶段使用的依赖库进行隔离。
8 其它标签description 当前项目的一个细节描述,当须要描述这个项目的时候被Maven所用,好比在web 站点中。 这个元素可以被指定为CDATA 类型,容许在描述器中 HTML的tags, 并不鼓励用空白文原本表示。 若是你须要去修改生成的web 站点的索引页,你可以用你本身的索引来代替自动生成的文本。
url 当前项目的主页的URL prerequisites 描述当前项目的编译环境的先决条件
issueManagement 当前项目的发布管理信息。
ciManagement 当前项目的连续集成信息。
inceptionYear 当前项目开始的年份, 用4位数字描述。 涉及到介绍状况时用做提供版权信息mailingLists 包含的信息包括邮件列表developers 描述当前的项目的开发人员的信息contributors 描述对当前项目有贡献的人员的信息,不特指开发人员licenses 这个元素描述了当前项目的全部的许可文件。每个许可文件用一个许可元素来描述,而后描述额外的元素。 一般只列出适用于这个项目的许可文件以及适用于 依赖的非licenses.若是多个licenses都列出来了,那么假设这个用户选择其中的所需的,而不是接受全部的许可文件。
scm 指定当前项目中的版本控制工具,好比CVS, Subversion, 等等。
organization 这个元素描述这个项目所属组织的各类属性的描述。这些属性应用于文档建立的时候 (版权通知和连接)。
repositories 发现依赖和扩展的远程资源库。
pluginRepositories 发现plugins 的远程资源库的列表,主要是为了编译和报告dependencies 这个元素描述了全部与当前项目相关的依赖。这些依赖被用做建立一个编译时的路径。 他们被自动的从资源库中下在下来依据当前项目的定义。如需更多信息,参看 the dependency mechanism reports Deprecated.禁止适用。如今的版本中被 Maven所忽略掉。
dependencyManagement 缺省的依赖信息将会从这个元素中继承。这些依赖在这一部分中被不马上被解决的。当一个源于这个POM的元素描述了一个依赖根据匹配的 groupId 和 artifactId,这个部分的版本和其余值用做那些尚未指定的依赖。
distributionManagement 对于一个项目分配的信息容许对于远程web服务器和资源库的site和artifacts配置。
properties 属性能够做为POM的自始自终的替换物,若是可行的话能够用做resources 的过滤器,格式是<name>value</name>.案例以下:
<!-- 项目属性 -->
<project>
<properties>
<jdbc.driver.groupId>mysql</jdbc.driver.groupId>
<jdbc.driver.artifactId>mysql-connector-java</jdbc.driver.artifactId>
<jdbc.driver.version>5.1.11</jdbc.driver.version>
</properties>
</project>
9 能够经过如下方式进行安装:
使用如下的命令安装:
mvn install:install-file –Dfile=non-maven-proj.jar –DgroupId=some.group –DartifactId=non-maven-proj –Dversion=1
建立本身的库,并配置,使用deploy:deploy-file
设置此依赖范围为system,定义一个系统路径。不提倡。
type:相应的依赖产品包形式,如jar,war
scope:用于限制相应的依赖范围,包括如下的几种变量:
compile :默认范围,用于编译
provided:相似于编译,但支持你期待jdk或者容器提供,相似于classpath
runtime:在执行时,须要使用
test:用于test任务时使用
system:须要外在提供相应得元素。经过systemPath来取得
systemPath: 仅用于范围为system。提供相应的路径
optional: 标注可选,当项目自身也是依赖时。用于连续依赖时使用