1.1 Maven的pom配置文件
1.1.1 pom文件内容和作用
Pom.xml文件用来设置项目的项目依赖、插件、项目版本等信息,其中必须的是xml的根元素project 元素和三个必需字段:工程组的标识groupId,工程的名称artifactId,版本信息version三个元素。
举例:
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <!-- 模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
<groupId>com.companyname.project-group</groupId>
<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>project</artifactId>
<!-- 版本号 -->
<version>1.0</version>
</project>
1.1.2 超级Pom文件的继承关系
超级pom是项目的默认配置文件,项目中所有子模块的pom文件都会继承超级pom文件,在项目文件夹打开命令控制台,进入包含 pom.xml 文件夹,执行命令mvn help:effective-pom,maven会自动扫描工程,生成超级pom文件。
超级pom文件的内容
基础信息设置 |
包括pom三要素:<groupId> <artifactId> <version>,依赖关系。 |
构建信息 |
用来配置源代码路径、输出路径、资源路径,依赖插件信息 |
更多项目信息 |
|
环境设置 |
<project>
<modelVersion>4.0.0</modelVersion>
<!--maven2.0必须是这样写,现在是maven2唯一支持的版本-->
<!-- 基础设置 -->
<groupId>...</groupId>项目唯一标识
<artifactId>...</artifactId>项目名称
<version>...</version>项目版本
<packaging>...</packaging>打包机制,打包机制,如pom,jar,war,ear,rar,par
<name>...</name>描述项目的名称
<url>...</url>开发团队的网址
<dependencies>...</dependencies>依赖关系
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
<!--构建设置 -->
<build>
<sourceDirectory>C:\MVN\project\src\main\java</sourceDirectory>
<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>C:\MVN\project\src\test\java</testSourceDirectory>
<outputDirectory>C:\MVN\project\target\classes</outputDirectory>
<testOutputDirectory>C:\MVN\project\target\test-classes</testOutputDirectory>
<resources>
<resource>
<mergeId>resource-0</mergeId>
<directory>C:\MVN\project\src\main\resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<mergeId>resource-1</mergeId>
<directory>C:\MVN\project\src\test\resources</directory>
</testResource>
</testResources>
<directory>C:\MVN\project\target</directory>
<finalName>project-1.0</finalName>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-2</version>
</plugin>
</plugins>
</build>
<!-- 更多项目信息 -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- 环境设置-->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
1.1.3 Pom文件中的依赖dependencies
Dependencies字段用来声明项目依赖的其他项目和组件,有三要素唯一标识其他项目和组件。需要是maven中心包管理的项目或组件,否则需要自己部署,或者通过设置scope为system并指定路径,将依赖项目包含进来。有时候各个项目多层依赖,如A依赖B,B依赖C,如果在A中依赖B,默认A依赖C,如果A不想依赖C,可以用exclusions将C排除.
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<type>jar</type>//依赖项目类型
<scope>test</scope>依赖范围(作用时间和作用域):test、system等
<optional>true</optional>false,子项目默认集成,true,子项目需要显示引入
</dependency>
<dependency>
<groupId>com.alibaba.china.shared</groupId>
<artifactId>alibaba.apollo.webx</artifactId>
<version>2.5.0</version>
<exclusions>
<exclusion>从依赖的com.alibaba.china.shared排除下面的子项目
<artifactId>org.slf4j.slf4j-api</artifactId>
<groupId>com.alibaba.external</groupId>
</exclusion>
....
</exclusions>
......
</dependencies>
dependencyManagement:是用于帮助管理chidren的dependencies的。例如如果parent使用dependencyManagement定义了一个dependencyon junit:junit4.0,那么 它的children就可以只引用 groupId和artifactId,而version就可以通过parent来设置,这样的好处就是可以集中管理依赖的详情。
Ø scope:表示依赖项目的一个作用范围。scope的主要取值范围如下(还有一个是在Maven2.0.9以后版本才支持的import,关于import作用域将在后文《Dependency介绍》中做介绍):
compile:这是它的默认值,这种类型很容易让人产生误解,以为只有在编译的时候才是需要的,其实这种类型表示所有的情况都是有用的,包括编译和运行时。而且这种类型的依赖性是可以传递的。
provided:这个跟compile很类似,但是它表示你期望这个依赖项目在运行时由JDK或者容器来提供。这种类型表示该依赖只有在测试和编译的情况下才有效,在运行时将由JDK或者容器提供。这种类型的依赖性是不可传递的。
runtime:这种类型表示该依赖在编译的时候不是必须的,只有在运行的时候才是必须的。
test:这表示这种依赖只有测试的时候才需要,正常情况下是不需要的。
system:这种类型跟provided类似,唯一不同的就是这种类型的依赖我们要自己提供jar包,这需要与另一个元素systemPath来结合使用。systemPath将指向我们系统上的jar包的路径,而且必须是给定的绝对路径。
systemPath:上面已经说过了这个元素是在scope的值为system的时候用于指定依赖的jar包在系统上的位置的,而且是绝对路径。该元素必须在依赖的 jar包的scope为system时才能使用,否则Maven将报错。
1.1.4 Pom文件中的继承
父项目和子项目之间可以是继承关系,子项目pom文件中通过parent节点指定继承的父项目的三要素,不在同一路径下时还要用<relativePath>节点去指定相对路径。,子pom.xml会完全继承父pom.xml中所有的元素,而且对于相同的元素,一般子pom.xml中的会覆盖父pom.xml中的元素,但是有几个特殊的元素它们会进行合并而不是覆盖。这些特殊的元素是:dependencies、developers、contributors、plugin列表,包括plugin下面的reports、resources。
带有相对路径的子项目pom文件示例:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectA</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../projectA/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectB</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
</project>
1.1.5 Pom文件的聚合module
聚合和继承是相关的两个概念,项目A,B,C,A作为父项目,B和C作为A的子模块,继承A的pom文件。而在A的pom文件中在<modules>标识中,添加B和C,在B和C的pom文件中声明parent为A,并将A的pom.xml中的packaging元素的值为pom。当对项目A进行编译时,B,C也会同时被编译。当我们在项目A上使用Maven命令时,实际上这些命令都会在它的子模块项目B,C上使用。这样方便大型项目的统一管理。Module中填的是子项目中pom的位置相对于父项目pom文件的相对路径,就是从父项目pom所在的目录出发,进入子项目pom文件所在的文件的相对路径。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>A</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>/B</module> //B在A文件夹下面和A的pom一级,在B文件夹下可以找到B的pom
<module>../C</module> //A和C为同级目录,所以..退出A,然后在进入C,可以找到C的pom文件。
</modules>
</project>
1.1.6 Pom属性
在pom.xml文件中我们可以使用${propertyName}的形式引用属性。这个propertyName有以下几种形式:
(1)env.propertyName:这种形式表示引用的是环境变量,比如我们需要引用当前系统的环境变量PATH的时候,就可以使用${env.PATH}。
(2)project.propertyName:这种形式表示引用的是当前这个pom.xml中project根元素下面的子元素的值。比如我们需要引用当前project下面的version的时候,就可以使用${project.version}。
(3)settings.propertyName:这种形式引用的是Maven本地配置文件settings.xml或本地Maven安装目录下的settings.xml文件根元素settings下的元素。比如我们需要引用settings下的本地仓库localRepository元素的值时,我们可以用${settings.localRepository}
(4)java的系统属性,所有在java中使用java.lang.System.getProperties()能够获取到的属性都可以在pom.xml中引用,比如${java.home}。
(5)pom.xml中properties元素下面的子元素作为属性。假如在pom.xml中有如下一段代码<properties><hello.world>helloWorld</hello.world></properties>,那么我们就可以使用${hello.world}引用到对应的helloWorld。