专业的JAVA编程教程与资源

网站首页 > java教程 正文

解析Maven中的插件机制和插件前缀

temp10 2024-11-14 17:50:52 java教程 9 ℃ 0 评论

解析Maven中的插件机制和插件前缀

为了方便用户使用和配置,Maven不需要用户提供完整的插件坐标信息,就可以解析得到正确的插件。

首先说明一下关于插件配置,在前面我们进行了插件配置,在POM文件的build标签中的plugins标签,配置了插件。基本的标签有groupId、artifactId和version

解析Maven中的插件机制和插件前缀

插件配置

这里的插件坐标配置就和依赖坐标不同了,因为它们是可以省略的:

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坐标,只是我们不知道而已。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表