如何理解 maven 依赖配置 <dependency> 中的 <type>pom</type>?

  maven 有 9 种依赖属性,分别为 groupId,artifactId,version,type,classifier,scope,systemPath,exclusions 和 optional。其中 groupId,artifactId,version 是三个基本的依赖属性,不可缺少。dependency 依赖属性详情如下所示。

<!-- 该元素描述了项目相关的所有依赖,这些依赖组成了项目构建过程中的一个个环节,它们自动从项目定义的仓库中下载。要获取更多信息,请看项目依赖机制-->
<dependencies>
	<dependency>
		<groupId>org.apache.maven</groupId><!-- 依赖的group ID -->
		<artifactId>maven-artifact</artifactId><!-- 依赖的artifact ID -->
		<version>3.8.1</version><!-- 依赖的版本号。在 Maven 2 里,也可以配置成版本号的范围 -->
		<type>jar</type><!-- 依赖类型,默认类型是jar.它通常表示依赖的文件扩展名 -->
		<classifier></classifier><!-- 依赖的分类器。分类器可以区分属于同一个 POM,但不同构建方式的构件,分类器名被附加到文件名的版本号后面。例如,如果你想要构建两个单独的构件成 JAR , 一个使用 Java 1.4 编译器,另一个使用 Java 6 编译器,你就可以使用分类器来生成两个单独的 JAR 构件 -->
		<scope>test</scope><!-- 依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。常用取值如下所示 
			  - compile:默认范围,用于编译
			  - provided:类似于编译,但支持你期待 jdk 或者容器提供,类似于 classpath
			  - runtime:在执行时需要使用
			  - test:用于 test 任务时使用
			  - system:需要外在提供相应的元素,通过 systemPath 来取得
			  - systemPath:仅用于范围为 system,提供相应的路径
			  - optional:当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用 -->
		<systemPath></systemPath><!-- 仅供 scope 为 system 范围使用。注意,不鼓励使用这个元素,并且在新的版本中该元素可能被覆盖掉。该元素为依赖规定了文件系统上的路径。需要绝对路径而不是相对路径。推荐使用属性匹配绝对路径,例如 ${java.home} -->
		<!-- 当计算传递依赖时,从依赖构件列表里,列出被排除的依赖构件集,即告诉 maven 你只依赖指定的项目,不依赖下面的依赖。此元素主要用于解决版本冲突问题 -->
		<exclusions>
			<exclusion>
				<artifactId>spring-core</artifactId>
				<groupId>org.springframework</groupId>
			</exclusion>
		</exclusions>
		<optional>true</optional><!-- 可选依赖,如果你在项目 B 中把 C 依赖声明为可选,你就需要在依赖于 B 的项目(例如项目 A)中显式的引用对 C 的依赖。可选依赖阻断依赖的传递性 -->
	</dependency>
</dependencies>

  当项目中使用 CXF + Spring 做 webservice 调用时,部分 dependency 的 type 属性取值为 pom,如下示例所示。

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>apache-cxf</artifactId>
    <version>2.5.3</version>
    <type>pom</type>
</dependency>

  dependency 中 type 默认为 jar,即引入一个特定的 jar 包。但是阿里云中央仓库中 central/org/apache/cxf/apache-cxf/2.5.3/ 下的文件列表中没有 jar 文件,如下图所示。
在这里插入图片描述
  此时,项目中 type 为 pom,含义是什么呢?
  当我们需要引入很多 jar 包的时候,会导致 pom.xml 过大,如使用 CXF 时,项目中可能要引入如下很多依赖包,如下所示。

		<dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-core</artifactId>
            <version>2.5.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>2.5.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>2.5.3</version>
        </dependency>
        <!-- 其他包省略 -->

  此时,依赖包很多,导致 pom.xml 文件较大。我们可以想到的一种解决方案是定义一个父项目,但是父项目只有一个,也有可能导致父项目的 pom.xml 文件过大。这个时候我们引进来一个 type 为 pom,意味着我们可以将所有的 jar 包打包成一个 pom,然后我们依赖了 pom,即可以下载下来所有依赖的 jar 包。

文章参考:
  • 25
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值