0
点赞
收藏
分享

微信扫一扫

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,就像是 写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. 说重头戏,pom 怎么理解?

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

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

跳转进去看:

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

看官网

先看官网:

​​Dependencies​​

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


原文:

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对应关系的,这个对应关系应该是有个构件处理器来决定的)

上一点聊天记录截图:

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


川哥

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

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

延申

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


你如果要分享出来,可能还需要仔细研究下,怎么自定义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>​

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


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


对这部分做一个总结!!!!!!!!!!:

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

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


3. 关于pom

可采用与上面同样的方式,即官网查或者直接跳转查看。

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


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


也可以有很多种,甚至也可以自定义。

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


这个​​<packaging>​​的自定义的情况更是不太可能有,意思已经明白了。

具体暂不深究。


举报

相关推荐

0 条评论