maven pom详解

一、POM含义

二、POM中的元素

(1)project下的子元素

<?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">
 
    <!-- 模型版本 -->
    <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>
    <!--打包方式,没有定义packaging时默认jar-->
    <packaging>jar</packaging>
    <!--项目构件的文件名与坐标是相对应的,一般规则:
      artifactId-version[-classfier-].packaging
      强调:packaging并非一定与构件扩展名一致,例:
      <packaging>maven-plugin</packaging>的构件扩展名为jar -->
   
    <!--项目依赖配置,可以包含一个或者多个<dependency>元素-->
    <dependencies>
        <!--每个依赖的具体配置-->
        <dependency></dependency>
    </dependencies>
</project>

(2)<dependencies>元素,依赖的配置:

<!--项目依赖配置,可以包含一个或者多个<dependency>元素-->
    <dependencies>
        <!--每个依赖的具体配置-->
        <dependency>
            <!--groupId,artifactId,version基础依赖坐标-->
            <groupId> ...</groupId>
            <artifactId> ...</artifactId>
            <version> ...</version>
            <!--依赖的类型,对应于项目坐标中的packaging,一般不需要声明,默认jar-->
            <type>jar</type>
            <!--依赖范围-->
            <scope>test</scope>
            <!--标记依赖是否可选,默认false-->
            <optional>false</optional>
            <!---->
            <systemPath>{basedir}\src\lib\</systemPath>
            <!--用于排除传递性依赖-->
            <exclusions>
                <!--要排除的具体依赖-->
                <exclusion>
                    <artifactId> ...</artifactId>
                    <groupId> ...</groupId>
                </exclusion>
                .
                .
            </exclusions>
        </dependency>
    </dependencies>

         scope(依赖的范围)解析:maven在编译项目主代码的时候需要使用一套classpath,编译和执行测试的时候会使用另一套classpath,实际运行maven项目的时候又会使用一套classpath,依赖范围就是用来控制依赖与这三种classpath(编译classpath,测试classpath和运行classpath)的关系,Maven有以下几种依赖范围:

    ① compile:编译依赖范围。如果没有指定scope默认就是此依赖范围。使用此依赖范围的maven依赖,对应编译,测试和运行三种classpath都有效。例:spring-core,在编译,测试和运行的时候都需要使用该依赖。

    ② test:测试依赖范围。使用此依赖范围的maven依赖,只对于测试classpath有效,在编译主代码或者运行项目时都无法使用此类依赖。例:Junit,它只在编译测试代码或者运行测试代码的时候才能使用该依赖。

   ③ provided:已提供依赖范围。使用此依赖范围的maven依赖,对于编译和测试classpath有效,但在运行classpath无效。典型的例子:servlet-api,编译和测试的时候需要该依赖,但是运行项目的时候,由于容器已经提供(例如Tomcat中lib下已经有servlet-api.jar包),就不需要maven再重复引入。

   ④ runtime:运行时依赖范围。使用此依赖范围的maven依赖,对于运行和测试classpath有效,但在编译classpath无效。典型例子:JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。 

   ⑤ system:系统依赖范围。该依赖与三种classpath的关系,与provided依赖范围完全一致。但是使用system范围的依赖时必须通过<systemPath>元素显式地指定依赖文件的路径。由于此类依赖不是通过maven仓库解析的,而且往往是与本机系统绑定,可能造成构件的不可移植性,所以要谨慎使用。例:

  <dependency>
      <groupId>kaptcha</groupId>
      <artifactId>kaptcha</artifactId>
      <scope>system</scope>
      <version>2.3.2</version>
      <systemPath>${basedir}\src\lib\kaptcha-2.3.2.jar</systemPath>
  </dependency>

总结关系图: 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值