1. pom文件的基本构成
<?xml version="1.0" encoding="UTF-8"?>
<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">
// 声明项目描述符遵循哪一个POM模型版本。maven2.0唯一支持的就是这个版本
// 模型本身的版本很少改变,但它仍然是必不可少的,这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。
<modelVersion>4.0.0</modelVersion>
// 父项目的坐标(子项目中才会有这个部分),如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值
<parent>
<artifactId>mobfin</artifactId>
<groupId>com.mob</groupId>
<version>v0.4.0</version>
// 父项目的pom.xml文件的相对路径
<relativePath>../pom.xml</relativePath>
</parent>
// 公司或者组织的唯一标志
<groupId>com.chinqf</groupId>
// 本项目的唯一id
<artifactId>streaming</artifactId>
// 打包机制,如pom、jar、maven-plugin、war......
<packaging>pom</packaging>
// 本项目目前所处的版本号
<version>1.0.0</version>
// 项目的名称,Maven产生的文档用
<name>...</name>
// 项目主页的url,Maven产生的文档用
<url>...</url>
// 项目的详细描述,Maven产生的文档用
<description>...</description>
// 描述这个项目构建环境中的前提条件
<prerequisites>
// 构建该项目或使用该插件所需要的Maven的最低版本
<maven></maven>
</prerequisites>
// 项目的问题管理系统
<issueManaagement>
// 问题管理系统的名字
<system>jira</system>
// 该项目使用的问题管理系统的url
<url>......</url>
</issueManagement>
// 项目持续集成信息
<cliManagement>
......
</cliManagement>
// 项目创建年份,4位数字,当产生版权信息时需要使用这个值
<inceptionYear />
// 项目相关邮件列表信息
<mailingLists>
<mailingList>
// 邮件名称
<name>Demo</name>
// 发送邮件的地址或连接
<post></post>
// 订阅邮件的地址或连接
<subscribe></subscribe>
// 取消订阅邮件的地址或链接
<unsubscribe></unsubscribe>
// 你可以浏览邮件信息的url
<archive></archive>
</mailingList>
</mailingLists>
// 项目开发者列表
<developers>
.........
</developers>
// 项目的其他贡献者列表
<contributors>
......
</contributors>
// 帮助定义构建输出的一些附属构件
<classifier>...</classifier>
// 模块(有时称为子项目,父级pom才会有这块)
<modules>
<module>SparkStreaming</module>
</modules>
// 为pom定义一些常量,在pom中的其他地方可以直接引用, 如${java.version}
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spark.version>2.1.0</spark.version>
</properties>
// 发现依赖和扩展的远程仓库列表
<repositories>
<repository>
<id>cloudera</id>
<url>http://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
<repository>
<id>public</id>
<url>http://central.maven.org/maven2/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
// 定义本项目的依赖关系(如果是顶层的pom文件,外套一层<dependencyManagement>主要用来统一管理项目依赖的版本号)
<dependencies>
// 每个dependency都对应这个jar包。一般情况下maven通过groupId,artifactId,version来检索该构件
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
// 如果不设置version,就会在父级pom中的dependencyManagement找,继承父级的version
<version>2.4.4</version>
// maven认为程序对外部的依赖会随着程序所处阶段和应用场景变化,maven中的依赖关系有作用域的限制。
// scope包含如下的取值:compile、provided、runtime、test、system......
<scope>test</scope>
// 依赖是否可选,默认false。false则子项目默认都继承、true则子项目必须显示地引入
<optional>false</optional>
// 屏蔽依赖关系
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.12</artifactId>
<version>2.4.4</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.12</artifactId>
<version>2.4.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
// 构建配置
<build>
// 使用的插件列表
<plugins>
// 指定maven编译的jdk版本,如果不指定,maven3默认用jdk1.5,maven2默认用jdk1.3
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<maxmem>1024m</maxmem>
<fork>true</fork>
</configuration>
</plugin>
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.scalastyle</groupId>
<artifactId>scalastyle-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.3</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
// 描述了项目相关或测试相关的所有资源路径
<resource>
// 描述存放资源的目录,该路径相对pom路径
<directory>src/main/resources/</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resource</directory>
</testResource>
</testResources>
</build>
// profile可以让我们定义一系列的配置信息,然后指定其激活条件。指定activeByDefault为true的时候表示该状态默认激活
// 通常用profile来动态地选择配置文件,即多个部署环境
<profiles>
<!--测试环境-->
<profile>
<id>dev</id>
<properties>
<env>dev</env>
<scope.value>provided</scope.value>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!--本地环境-->
<profile>
<id>local</id>
<properties>
<scope.value>compile</scope.value>
</properties>
</profile>
<!--预发布环境-->
<profile>
<id>pre</id>
<properties>
<env>pre</env>
<scope.value>provided</scope.value>
</properties>
</profile>
<!--线上正式环境-->
<profile>
<id>prod</id>
<properties>
<env>prod</env>
<scope.value>provided</scope.value>
</properties>
</profile>
</profiles>
</project>
(1) classifier属性
- 属性说明
这个元素主要用来帮助定义构建输出的一些附属构件,附属构件与主构件对应,比如主构件是kimi-app-2.0.0.jar,该项目可能还会通过使用一些插件生成如 kimi-app-2.0.0-javadoc.jar(Java文档)、kimi-app-2.0.0-sources.jar(Java源代码)这样两个附属构件,这时候,javadoc、sources就是这两个附属构件的classifier,这样附属构件也就拥有了自己唯一的坐标。 - 属性作用
- maven下载javadoc、sources jar包的时候,需要借助classifier指明要下载哪个附属构件
- 引入依赖的时候,有时候仅凭groupId、artifactId、version无法唯一确定某个构件,需要借助classifier来进一步明确目标。例如JSON-lib,同一版本会提供多个jar包,在JDK1.5下一套,JDK1.3环境下一套。
(2) 打包方式
- jar
默认的打包方式,打包成jar用作jar包使用。 - war
将会打包成war,发布在服务器上,如网站或服务。 - pom
用在父级工程或聚合工程中,用来做jar包的版本控制,必须指明这个聚合工程的打包方式为pom
2. 部分元素说明
2.1 dependencyManagement
Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式。在dependencyManagement元素中声明所依赖的jar包的版本号等信息,那么所有子项目再次引入此依赖jar包时则无需显式的列出版本号。Maven会沿着父子层级向上寻找拥有dependencyManagement 元素的项目,然后使用它指定的版本号。
如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号。当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要逐个修改子项目;另外如果某个子项目需要另外的一个版本,只需要声明version即可。
2.2 Scope
1.compile:默认值 他表示被依赖项目需要参与当前项目的编译,还有后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去,也就是整个周期都会参与
2.test:依赖项目仅仅参与测试相关的工作,包括测试代码的编译和执行,不会被打包,例如:junit
3.runtime:表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过了编译而已。例如JDBC驱动,适用运行和测试阶段
4.provided:打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude操作
5.system:从参与度来说,和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径