有很多人疑惑,
java项目里,maven的pom.xml文件里,
节点里的 <type>pom/jar/...</type>
和 <scope>compile/import...</scope>
是什么意思。
一般不用专门写出来,但有时候不写又报错;不报错不知道为什么不报错,报错也不知道为什么报错。有时候非得写出来还非得写成特定的某种指定内容。
好像是乱七八糟,网上我搜到的相关内容,可以说完全没有一个能够好好地解答了这个问题的,各种一派胡言。
是在没办法了,跟川哥聊起了这个问题,经过反复的沟通,确认,总结;
以下是得出的内容:
其实这个问题由三个部分,各自都有点疑问。
Q:pom.xml
文件里,
- 顶级的,
<packaging>pom</packaging>
是什么? <dependency>
节点里,<packaging>pom</packaging>
是什么?<dependency>
节点里,<scope>import</scope>
是什么?
1. 先从最简单,没有歧义的<scope>
说起。
这个scope,就像是 写java注解时的 @Retention(xxx)
的那个感觉,大约是一种 “生命周期”的感觉。
具体见这里:
以下是一些川哥的原话留念:
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>
可采用与上面同样的方式,即官网查或者直接跳转查看。
也可以有很多种,甚至也可以自定义。
这个<packaging>
的自定义的情况更是不太可能有,意思已经明白了。
具体暂不深究。