maven依赖中如何理解<type>pom/jar/..</type>、<scope>compile/import...</scope>等?

有很多人疑惑,
java项目里,maven的pom.xml文件里,
节点里的 <type>pom/jar/...</type><scope>compile/import...</scope>是什么意思。
一般不用专门写出来,但有时候不写又报错;不报错不知道为什么不报错,报错也不知道为什么报错。有时候非得写出来还非得写成特定的某种指定内容。
好像是乱七八糟,网上我搜到的相关内容,可以说完全没有一个能够好好地解答了这个问题的,各种一派胡言。
是在没办法了,跟川哥聊起了这个问题,经过反复的沟通,确认,总结;

以下是得出的内容


其实这个问题由三个部分,各自都有点疑问。
Q:pom.xml文件里,

  1. 顶级的, <packaging>pom</packaging>是什么?
  2. <dependency>节点里,<packaging>pom</packaging>是什么?
  3. <dependency>节点里, <scope>import</scope>是什么?

1. 先从最简单,没有歧义的<scope>说起。

这个scope,就像是 写java注解时的 @Retention(xxx) 的那个感觉,大约是一种 “生命周期”的感觉。
具体见这里:

<scope>import</scope>怎么理解

以下是一些川哥的原话留念:

scope 有 test, compile, runtime

  • test在本地会引入,不过打包的时候不会被引入,用于maven test结构中代码的正常执行,但不打入包中,以减小线上部署包的尺寸。

  • compile为正常引入模式,表示编译会用它,那么大概率情况,执行也会用它,package会打包进去,至少会把依赖的class打包进去。

  • runtime的作用,是为了本地编译不出错,但package时不打包进去,但按照字面理解,这个玩意儿是要运行时用的啊,那怎么办呢?
    那就在运行环境中,必须有这个包。
    比如tomcat中,会有servlet/jsp api,这种api是在运行时使用的,tomcat中自带;
    但你项目中编译也会用到,为了本地编译不报错,就要引入,但为了不和线上tomcat发生版本冲突,就要标记为runtime,这样本地编译可用,但打包不引入。

2. 说重头戏,<type>pom</type> 怎么理解?

看IDE里面节点的提示内容,或者跳转进去看xsd文档。

在这里插入图片描述

跳转进去看:

在这里插入图片描述

看官网

先看官网:
Dependencies
在这里插入图片描述
原文:
type:

Corresponds to the chosen dependency type.

This defaults to jar.
While it usually represents the extension on the filename of the dependency, that is not always the case: a type can be mapped to a different extension and a classifier.

The type often corresponds to the packaging used, though this is also not always the case. Some examples are jar, ejb-client and test-jar:
see default artifact handlers for a list.
New types can be defined by plugins that set extensions to true, so this is not a complete list.

川哥的翻译:
type,和被选择依赖的类型相对应。默认为jar。
通常它和依赖模块的扩展名一致,不过也不一定,因为一个模块的类型,可以被映射为不同的扩展名或分类上。
通常type和依赖模块的packaging对应,尽管并不总是这样。
比如 的值 ejb-client, test-jar,具体可以看看默认的构件处理器。
(这里是说,大多数的module,其实是有个默认的packaging与被依赖时候的type对应关系的,这个对应关系应该是有个构件处理器来决定的)

上一点聊天记录截图:
在这里插入图片描述
川哥

比如我现在写个模块,提供给你使用,如果我不指定,就只有一个jar那么,你完全无需指定type,直接就是默认的jar,但如果我傻逼,非要指定我的类型为 dll 呢,那你在依赖我的时候,不把你的type指定为dll,你就用不了

要是真有神经病写个dll类型的东西我还非依赖不可,我就得写 <type>dll</type>

延申

在这里插入图片描述

你如果要分享出来,可能还需要仔细研究下,怎么自定义type
这里有说到一个type-handler,https://maven.apache.org/ref/3.8.1/maven-core/artifact-handlers.html
https://maven.apache.org/guides/mini/guide-creating-archetypes.html

这个延申部分有些过于“屠龙之技”,可能永远都用不着,暂时不深究了。

再追加一点聊天记录,关于<dependency>里的<type>xxx</type>
在这里插入图片描述
在这里插入图片描述
对这部分做一个总结!!!!!!!!!!:
在这里插入图片描述

上图一红一绿两条线,说了两件事。
红线的可以解释<type>里的值是什么意思。
绿线里的可以解释为什么有些时候<dependency>里面的<type>有时候不用加,有时候不加却报错加了就不报错(即通常为了获取继承来的pom.xml里面的<properties>里的各种包的版本号之类的信息,没有的话就不能确定版本,当然报错)。





3. 关于<packaging>pom</packaging>

可采用与上面同样的方式,即官网查或者直接跳转查看。
xxx
在这里插入图片描述
也可以有很多种,甚至也可以自定义。
在这里插入图片描述
这个<packaging>的自定义的情况更是不太可能有,意思已经明白了。
具体暂不深究。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值