pom.xml文件详解

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的属性来定义路径

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值