网站首页 > java教程 正文
解析Maven中的插件机制和插件前缀
为了方便用户使用和配置,Maven不需要用户提供完整的插件坐标信息,就可以解析得到正确的插件。
首先说明一下关于插件配置,在前面我们进行了插件配置,在POM文件的build标签中的plugins标签,配置了插件。基本的标签有groupId、artifactId和version。
插件配置
这里的插件坐标配置就和依赖坐标不同了,因为它们是可以省略的:
1.groupId,如果该插件为Maven的官方插件(为org.apache.maven.plugins),就可以省略groupId的配置,在Maven解析该插件时,就会自动用Maven的官方插件的groupId进行自动补全。
注意:不建议在POM中这样配置,也就仅仅节省了一行代码,却会让不懂这个原理的其他同事一脸懵逼。
2.version,当用户没有显式声明插件版本时,Maven也会自动解析插件版本。
首先Maven在超级POM中为所有核心插件设定了版本,超级POM就是所有Maven项目的父POM,所有项目都继承它的配置。因此,即使用户不加任何配置使用核心插件的时候,它们一样会有确定的版本。例如maven-clean-plugin、maven-compiler-plugin、maven-surefire-plugin等,所以我们经常在没有配置任何插件时,也可以正常的使用这些阶段绑定的插件目标,就是因为这个原因。
另外,如果这个插件不是核心插件,并且配置时也不指定版本的话,Maven就会自动检查所有仓库中的可用版本,然后做出选择。Maven遍历本地仓库和所有远程插件仓库,将该路径下的仓库元数据(maven-metadata.xml文件,它的路径是groupid和artifactid的结合)归并后,就能计算出latest和release的值。latest表示所有仓库中该构件的最新版本,而release则是最新的稳定版本。Maven2会自动解析latest,而Maven3调整为release,也就是它会自动解析出最新的release版本去使用。
**注意:**同样不建议在POM中这样配置,一旦不显式指定版本,就意味着存在了很大的不确定性,尽管release版本比快照版本要稳定,但是它一样会发生变化,指不定哪天好好的项目突然就有问题了,关键是还很难定位到问题。。
插件前缀
插件前缀其实也早有配置,它和groupId:artifactId是一一对应的,这种匹配关系存储在仓库元数据中,也就是那个maven-matadata.xml文件中。
但是这次的元数据层级要高一点,前面配置里的元数据是groupId/artifactId/maven-metadata.xml,是指定插件的元数据。而这里关于插件前缀的元数据是统一在groupId/maven-metadata.xml下的,因为插件前缀是和各个artifactId匹配的,所以它在groupId下。
这里我找一个Maven官方插件(org.apache.maven.plugins)路径下的元数据文件,下载下来,打开就能看到,里面有很多对应关系,prefix就是插件前缀,artifactId就是具体插件,文件内容截取部分展示一下:
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<plugins>
<plugin>
<name>Huawei Only Apache Maven EAR Plugin</name>
<prefix>ear</prefix>
<artifactId>maven-ear-plugin</artifactId>
</plugin>
<plugin>
<name>Maven Resources Plugin</name>
<prefix>resources</prefix>
<artifactId>maven-resources-plugin</artifactId>
</plugin>
<plugin>
<name>Maven JAR Plugin</name>
<prefix>jar</prefix>
<artifactId>maven-jar-plugin</artifactId>
</plugin>
<plugin>
<name>Maven Invoker Plugin</name>
<prefix>invoker</prefix>
<artifactId>maven-invoker-plugin</artifactId>
</plugin>
<plugin>
<name>Maven Clean Plugin</name>
<prefix>clean</prefix>
<artifactId>maven-clean-plugin</artifactId>
</plugin>
</plugins>
</metadata>
所以在我们使用mvn help:describe这种插件时,它会去org.apache.maven.plugins的groupid下找元数据,再里面找对应的关系,就能找到指定的插件了,至于版本,则是参考上面说的配置获取到。
所以mvn help:describe这种看起来很简洁的写法,其实它同样能获取到完整的groupId、artifactId和version坐标,只是我们不知道而已。
猜你喜欢
- 2024-11-14 这3款Chrome插件不火,天理难容(chrome插件能做什么)
- 2024-11-14 都2020年了,这些6到起飞的idea插件你还没用过?
- 2024-11-14 你还在 Java 代码中写 set/get 方法?赶快试试这款插件吧!
- 2024-11-14 限时白嫖!分享10个 解放双手的 IDEA 插件,码农:工作效率瞬间翻倍
- 2024-11-14 Logstash Java Output 插件构建与使用
- 2024-11-14 Java,Lombok插件,@Data、@EqualsAndHashCode、@Accessors注解
- 2024-11-14 IDEA java开发工具插件推荐,有它效率提升10倍
- 2024-11-14 Zephyr是一个类似OSGI的Java插件框架
- 2024-11-14 种草 Vue3 中几个好玩的插件和配置
- 2024-11-14 这款 Chrome 插件,让你的项目联调 so easy
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)