51Testing软件测试论坛

标题: Maven插件 [打印本页]

作者: 阿蛮的开心姐    时间: 2019-3-7 15:57
标题: Maven插件
Maven的插件

    我们知道mvn 只是抽象了项目构建的生命周期,生命周期本身是不做任何工作的,具体的工作都是由插件来完成。每个个插件都有一个或多个目标(goal),我们通常执行的mvn命令就是去调用mvn的插件,

如:mvn dependency:list , dependency 是插件前缀,list是插件的目标,denpendency插件还有其他的目标比如说:tree,analyze等。

插件绑定

    我们在执行mvn clean ,mvn install ,mvn compile的时候为什么不像上面介绍的那样使用 mvn plugin:goal这种方式呢? 应为maven 为各个生命周期的主要阶段都绑定了默认的插件,所以我们执行这些命令的时候是调用了默认的插件和目标。何为插件绑定?把一个生命周期的某个阶段和具体插件的某个目标关联起来,这就是插件绑定。

为了减少用户的配置,做到开箱即用,maven为我们内置了一些默认的插件绑定:

clean:

[attach]122664[/attach]

default:

[attach]122665[/attach]

site:

[attach]122666[/attach]

自定义插件的绑定

用户可以根据需要将某个插件的指定目标绑定到生命周期的某个阶段上。

方法:

  1. <build>
  2.   <plugins>
  3.     <plugin>
  4.        <groupId>XXXX</groupId>
  5.        <artifactId>XXXX</artifactId>
  6.        <version>XXX</version>
  7.        <excutions>
  8.          <excution>
  9.            <id>attach-source</id>
  10.            <phase>verify</phase>
  11.            <goals>
  12.              <goal>jar-no-fork</goal>
  13.            </goals>
  14.          </excution>
  15.        </excutions>
  16.     <plugin>
  17.   </plugins>
  18. </build>
复制代码

注意:

插件配置

  1. mvn install -Dmaven.test.skip=true
复制代码

通过-D加入参数,实现插件配置

  1. <build>
  2.   <plugins>
  3.     <plugin>
  4.        <groupId>XXXX</groupId>
  5.        <artifactId>XXXX</artifactId>
  6.        <version>XXX</version>
  7.        <configuration>
  8.          <source>1.5</source>
  9.          <target>1.5</target>
  10.        </configuration>
  11.     <plugin>
  12.   </plugins>
  13. </build>
复制代码

      为插件任务配置特定的参数,如下例:

  1. <build>
  2.   <plugins>
  3.     <plugin>
  4.        <groupId>XXXX</groupId>
  5.        <artifactId>XXXX</artifactId>
  6.        <version>XXX</version>
  7.        <excutions>
  8.          <excution>
  9.            <id>attach-source</id>
  10.            <phase>verify</phase>
  11.            <goals>
  12.              <goal>jar-no-fork</goal>
  13.            </goals>
  14.            <configuration>
  15.               <tasks>
  16.                  <echo> validate phase </echo>
  17.               </tasks>
  18.            </configuration>
  19.          </excution>
  20.        </excutions>
  21.     <plugin>
  22.   </plugins>
  23. </build>
复制代码
获取插件信息

        基本上maven所有的插件都来自apache和codehaus:

        http://maven.apache.org/plugins/index.html

        http://www.mojohaus.org/plugins.html

      下面的例子是描述maven-compile-plugin插件:

  1. mvn help:describe -Dplugin=compiler
复制代码

上面命令里使用到了目标前缀(goal prefix),help 是maven-help-plugin的目标前缀,compiler是maven-compile-plugin的目标前缀。使用目标前缀可以简化我们使用插件的方式,不用使用maven的坐标来调用插件。如果不使用前缀,上面的命令将变成:

  1. mvn org.apache.maven.plugins:maven-help-plugin:2.1:describe -Dplugin=org.apache.maven.plugins:maven-compile-plugin:2.1
复制代码

若只想查看关于插件目标的描述,可以在maven命令后加上-Dgoal=xxx,输出更详细的信息可以加上-Ddetail

插件解析机制

   我们在命令行调用mvn 插件时,插件的名字是什么,gorupid,artifactid,version分别是什么,插件从哪里获得的?

        maven有单独的插件仓库,配置方式与普通构建的远程仓库不同,如下:

  1. <pluginRepositories>
  2.                 <pluginRepository>
  3.                     <snapshots>
  4.                         <enabled>false</enabled>
  5.                     </snapshots>
  6.                     <id>central</id>
  7.                     <name>repo</name>
  8.                     <url>http://maven:8081/artifactory/repo</url>
  9.                 </pluginRepository>
  10.                 <pluginRepository>
  11.                     <snapshots>
  12.                                                 <updatePolicy>always</updatePolicy>
  13.                                     </snapshots>
  14.                     <id>snapshots</id>
  15.                     <name>repo</name>
  16.                     <url>http://maven:8081/artifactory/repo</url>
  17.                 </pluginRepository>
  18.             </pluginRepositories>
复制代码

id、name 、url等的含义与普通仓库一致,一般来说中央仓库的所包含的插件已经能够满足我们日常所需了,所以一般配置一个中央仓库的地址就可以,但是有点需要注意 插件的snapshot 一般都配置为 false,使用稳定版的插件。

​​​​​​​在配置pom的时候如果是官方的插件,就可以省略goupid(org.apache.maven.plugins)。但是不推荐使用这种方式,省略的代码不多,但是会对不熟悉maven的同事造成费解。

        ​​​​​​​maven在超级pom中为核心插件设置了版本,超级pom 是所有pom的父pom,所以即使我们不配置核心插件的版本,这些核心插件仍然能通过父pom的配置找到版本。

         如果没有指定版本,且使用的插件也不是核心插件,那么maven就会遍历远程仓库的元数据(groupid/)和本地仓库的元数据合并,得出latest和release,maven3中若没有指定版本号,则默认解析为release。保证插件的稳定。依赖maven解析插件版本是不可取的,即时解析的是非快照版,但是也不能保证新版本的逻辑不会改变,所以建议是显示的指定maven插件的版本。

​​​​​​​        maven插件前缀与groupid和artifactid 一一对应,这种匹配关系保存在 groupid/maven-metadata.xml中,如果不做任何配置,maven会默认使用org.apache.maven.plugins 和 org.codehaus.mojo这两个groupid解析仓库元数据。当然也可以在settings.xml中配置:

[attach]122667[/attach]

这样maven出了会从上述两个默认的goupid里去解析元数据之外,也会从配置的这个com.your.plugins下元数据的内容。

            maven 解析插件的过成如下:







欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2