《Maven官方文档》插件程序配置引导

原文地址      译者:carvendy

插件程序配置引导

1.通用配置

1.帮助目标

2.配置参数

1.匹配简单对象

2.匹配复杂对象

3.匹配集合对象

1.匹配Lists

2.匹配Maps

3.匹配Poperties

2.配置构建插件

1.使用 <executions>标签

2.使用 <dependencies>标签

3.使用 <inherited>标签

 

3.配置报表插件

1.使用 <reporting>标签 对比 <build>标签

2.使用 <reportSets>标签

3.使用 <inherited>标签

介绍

在Maven,有构建和报表插件:

  • 构建插件:在构建的时候执行,应该配置在<build/>标签里。
  • 报表插件:在生成网站时候执行,应该配置在<reporting/>标签里。

所有插件至少需要的信息: groupId ,artifactId 和 verion。

重要笔记:推荐定义每个版本插件,来确保构建过程中可重用性。好的实践就是在构建过程中指定它们到<build><pluginManagement/></build>节点内(通常,你会定义一个<pluginManagement/>的节点在父级的pom中)。对于报表插件,你应该指定每个版本插件到<reporting><plugins/></reporting>节点 (当然在<build><pluginManagement/></build>节点也是可以的)。

通用配置

maven插件(构建和报表)配置在指定的<configuration>节点,<configuration>的子节点映射到了字段,设置项,包括小咒语(记住一个插件程序包括一个或多个Mojo,每个Mojo匹配一个目标)。举个例子,我们有一个执行查询特定URL、指定超时时间和一些选项的Mojo。这个Mojo看起来会像这样:
/**
 * @goal query
 */
public class MyQueryMojo extends AbstractMojo {
 /**
 * @parameter expression="${query.url}"
 */
 private String url;

 /**
 * @parameter default-value="60"
 */
 private int timeout;

 /**
 * @parameter
 */
 private String[] options;

 public void execute() throws MojoExecutionException {
 }
}
在pom中配置Mojo的期望URL,超时时间和选项,如下:
<project>...
 <build>
 <plugins>
 <plugin>
 <artifactId>maven-myquery-plugin</artifactId>
 <version>1.0</version>
 <configuration>
 <url>http://www.foobar.com/query</url>
 <timeout>10</timeout>
<options>
<option>one</option>
<option>two</option>
<option>three</option>
 </options>
 </configuration>
 </plugin>
 </plugins>
 </build> ...
</project>
 
当你看到这些节点配置与Mojo的字段相匹配。配置机制中采取了类似于XStream的工作方式来匹配对象。所以从例子上你可以看到直接匹配的url节点和url字段,timeout节点和字段,options节点和字段。这个匹配机制可以通过字段的类型检查来处理阵列,和确定是否合适匹配。

对于mojos预期被执行可以直接通过命令行,他们的参数提供配置的方式来替换pom中<configuration>的项目。这些插件文档为了参数可以列到配置文件的表达式中。在mojo之上,参数url与表达式${query.url}关联起来了,意味着可以通过化工系统属性指定query.url的值,如下:

mvn myquery:query -Dquery.url=http://maven.apache.org
注意,系统属性的名称不一定参数的名称匹配的mojo。虽然这是一个相当常见的做法,你会经常注意到插件,采用了一些前缀的系统属性,以避免与其他系统属性的名称冲突。虽然很少,也有插件参数,(如历史原因)采用的系统属性,这是完全无关的参数名。所以一定要仔细看看插件文档。

帮助指令

最新的maven插件通常有帮助目标在命令行中描述插件,有参数类型和类型。例如,理解一下javadoc 目标,你就需要执行:
你可以通过 javadoc:javadoc 指令看到所有参数,类似于这页

配置参数

匹配简单对象

匹配简单类型,例如Boolean 或 Integer 这很简单。在<configuration> 节点里看是这样的:
<configuration>
 <myString>a string</myString>
 <myBoolean>true</myBoolean>
 <myInteger>10</myInteger>
 <myDouble>1.0</myDouble>
 <myFile>c:/temp</myFile>
 <myURL>http://maven.apache.org</myURL>
</configuration>

配置复杂对象

匹配复杂类型在Maven当中也是相当直接的,让我们,看一下小例子设置一个Person对象,在<configuration> 节点里看是这样的:
<configuration>
 <myString>a string</myString>
 <myBoolean>true</myBoolean>
 <myInteger>10</myInteger>
 <myDouble>1.0</myDouble>
 <myFile>c:/temp</myFile>
 <myURL>http://maven.apache.org</myURL>
</configuration>
匹配复杂对象的规则如下:
一定要有私有字段与节点对应。所以在我们的案例中,在mojo里person节点一定匹配person对象的字段。
对象实例化对象一定要和mojo在同一个包下。所以你的mojo在com.mycompany.mojo.query包中 匹配机制在包中找一个名叫person的对象。正如你是看到的机制 首字母为大写的节点名字,然后去找这个对象实例化。
如果你希望实例化的这个对象在不同的包里,有复杂的名字和你必须指定用implementation属性,如下:
<configuration>
 <person>
 <firstName>Jason</firstName>
 <lastName>van Zyl</lastName>
 </person>
</configuration></pre>
</div>
<div>

匹配集合类型

配置匹配机制很容易处理很多集合,现在就让我们来看看例子吧:

匹配Lists

匹配lists的工作就像匹配数组一样,你有一个list的节点就会匹配一个List。你需要的配置如下:
public class MyAnimalMojo extends AbstractMojo{
/**
* @parameter
*/
   private  List animals;
   public void execute() throws MojoExecutionException{
      ...
   }
}
当你定义了一个animals的字段,你的插件程序配置如下:
<project>...
 <build>
 <plugins>
 <plugin>
 <artifactId>maven-myanimal-plugin</artifactId>
 <version>1.0</version>
 <configuration>
 <animals>
 <animal>cat</animal>
 <animal>dog</animal>
 <animal>aardvark</animal>
 </animals>
 </configuration>
 </plugin>
 </plugins>
 </build> ...
</project>
在每一个animals列出相应的字段。不像数组,集合不是指定成分类型。为了得到list各个项目的类型,策略使用如下:
1. 如果xml节点包含 implementation属性,已经在使用了。
2.如果xml节点包含 一个”.”,试着用一个有资格的类名。
3.试着xml标签(首字母大写)作为一个类,配置一个相同包下面的对象。
4.如果节点没有子节点,假定它是String类型。否则,配置失败。

Mapping Maps

在相同的方式下,你可以定义map如下:
/**
* My Map.
*
* @parameter
*/
private Map myMap;
<configuration>
<myMap>
<key1>value1</key1>
<key2>value2</key2>
</myMap>
</configuration>

Mapping Properties

Properties配置如下:
/**
* My Properties.
*
* @parameter
*/
private Properties myProperties;

<configuration>
     <myProperties>
         <property>
               <name>propertyName1</name>
                <value>propertyValue1</value>
          <property>
         <property>
                <name>propertyName2</name>
                 <value>propertyValue2</value>
          <property>
      </myProperties>
</configuration>

配置构建插件

配置构建插件只能在<build>节点

使用<executions>标签

你可以使用<executions>标签配置一个mojo。mojos 在构建周期实践中最常用到。使用MyQueryMojo作为一个例子,你可以看到一些如下:
<project>...
<build>
<plugins>
<plugin>
<artifactId>maven-myquery-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<id>execution1</id>
<phase>test</phase>
<configuration>
<url>http://www.foo.com/query</url>
<timeout>10</timeout>
<options>
<option>one</option>
<option>two</option>
<option>three</option>
</options>
</configuration>
<goals>
<goal>query</goal>
</goals>
</execution>
<execution>
<id>execution2</id>
<configuration>
<url>http://www.bar.com/query</url>
<timeout>15</timeout>
<options>
<option>four</option>
<option>five</option>
<option>six</option>
</options>
</configuration>
<goals>
<goal>query</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build> ...
</project>
首先配置执行id  “execution1” 配置绑定在测试周期。第二个执行没有一个阶段节点,你觉得它会执行什么呢?好,指令都有一个默认绑定的阶段作为依据。如果指令有一个绑定阶段那么它就会在这个节点执行。但是如果指令没有绑定任何周期那么它讲不会在构建周期执行。
笔记中的pom中所有执行插件的id都必须是唯一的,其实他们不必唯一因为通过poms的继承分层。执行插件同样的id在不同的pom中汇被合并。相同的应用执行插件可以被定义在profiles中。
如果我们配置多个执行插件在不同的周期?你认为它会怎么执行?让我们再一次来看看pom的例子,但是我们应该绑定execution2到一个阶段。

<project>
 ...
       <build>
               <plugins>
                         <plugin>
...
                              <executions>
                                      <execution>
                                           <id>execution1</id>
                                            <phase>test</phase>
                                              ...
                                     </execution>
                                     <execution>
                                            <id>execution2</id>
                                             <phase>install</phase>
                                            <configuration>
                                                    <url>http://www.bar.com/query</url>
                                                     <timeout>15</timeout>
                                                    <options>
                                                              <option>four</option>
                                                              <option>five</option>
                                                              <option>six</option>
                                                     </options>
                                                  </configuration>
                                           <goals>
                                                <goal>query</goal>
                                            </goals>
                                      </execution>
                            </executions>
                      </plugin>
             </plugins>
       </build>
...
</project>

如果多个执行绑定不同的阶段,mojo会在不同阶段执行一次。意思就是,execution1 将会在测试阶段执行,而execution2 会在build阶段执行。
现在,让我们看另外一个mojo的例子,看一下默认的绑定的阶段。
/**
* @goal query
* @phase package
*/
public class MyBindedQueryMojo extends AbstractMojo {
/**
* @parameter expression="${query.url}";
*/
private   String url;

/**
* @parameter default-value="60"
*/
private    int timeout;

/**
* @parameter
*/
privateString[] options;

public void execute() throws MojoExecutionException {
}
}
从上面这个mojo的例子看,MyBindedQueryMojo 的默认周期是package阶段(看看@phares 注解)。但是如果我们想执行这个mojo在安装阶段而不是package阶段,我们应该使用<execution>下的<phase>表情 重新绑定mojo到一个新的周期。

<project>
...
       <build>
              <plugins>
                     <plugin>
                            <artifactId>maven-myquery-plugin</artifactId>
                            <version>1.0</version>
                             <executions>
                                      <execution>
                                               <id>execution1</id>
                                                <phase>install</phase>
                                                <configuration>
                                                        <url>http://www.bar.com/query</url>
                                                        <timeout>15</timeout>
                                                       <options>
                                                                <option>four</option>
                                                                <option>five</option>
                                                                <option>six</option>
                                                       </options>
                                                </configuration>
                                                <goals>
                                                       <goal>query</goal>
                                                  </goals>
                                        </execution>
                           </executions>
                  </plugin>
         </plugins>
</build>
...
</project>

现在,MyBindedQueryMojo 默认周期已经被重写成 install阶段了
笔记:<executions>节点中的配置和外面的executions节点以外的元素不同,因为它们不能从命令中调用执行,因为它们是要调用了生命周期才会执行。所以你配置executions节点以外的元素可以插件完全调用。自从Maven 3.3.1 不是这样的情况了,你可以指定命令为插件指定执行的命令。因此,你想执行上面这个插件,指定execution1的配置可以通过命令行,你可以执行这个:
</div>
<div>mvn myqyeryplugin:<a href="mailto:queryMojo@execution1">queryMojo@execution1</a></div>
<div>

使用 <dependencies> 标签

你可以配置 插件的依赖库,通常是由一些最新的依赖版本。
例子,Maven Antrun Plugin 版本 1.2 是由 Ant 版本 1.6.5 ,如果你想是由最新的Ant版本来运行插件,你需要加dependencies 节点如下:

<project>
...
    <build>
              <plugins>
                   <plugin>
                           <groupId>org.apache.maven.plugins</groupId>
                           <artifactId>maven-antrun-plugin</artifactId>
                           <version>1.2</version>
                               ...
                            <dependencies>
                                   <dependency>
                                            <groupId>org.apache.ant</groupId>
                                            <artifactId>ant</artifactId>
                                            <version>1.7.1</version>
                                   </dependency>
                                   <dependency>
                                             <groupId>org.apache.ant</groupId>
                                            <artifactId>ant-launcher</artifactId>
                                              <version>1.7.1</version>
                                  </dependency>
                           </dependencies>
                  </plugin>
           </plugins>
</build>
...
</project>

在构建插件中使用 <inherited>标签

默认,插件配置应该传播到子项目的pom里,所以要打破继承,你就需要使用<inherited>标签:

<project>
...
<build>
         <plugins>
                <plugin>
                       <groupId>org.apache.maven.plugins</groupId>
                       <artifactId>maven-antrun-plugin</artifactId>
                       <version>1.2</version>
                         <inherited>false</inherited>
...
                   </plugin>
            </plugins>
</build>
...
</project>

配置报表插件

通过 配置报表插件在 <reporting>节点。

使用<reporting>标签和<build>标签

在pom中配置报表插件在 <reporting>标签 或者<build>标签,是不一样的行为。
mvn site
它只能将参数定义在configuration 节点的每一个指定在<reportying>标签中报表插件。例如,site 总是忽略了在<build>中每个插件在configuration 节点指定的一些参数。
mvn aplugin:areportgoal
它会首先将参数定义在configuration 节点的每一个指定在<reportying>标签中报表插件;如果找不到,它将会查找在build的每个插件的配置中定义的参数。

使用<reportSets>标签

你可以使用<reportSets>标签配置一个报表插件。在运行mvn site,通常用于可以选择性的生成报表。通过下面的配置你可以生成项目的团队报表。

<project>
...
<reporting>
       <plugins>
             <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-project-info-reports-plugin</artifactId>
                       <version>2.1.2</version>
                     <reportSets>
                           <reportSet>
                                  <reports>
                                        <report>project-team</report>
                                  </reports>
                          </reportSet>
                       </reportSets>
              </plugin>
     </plugins>
</reporting>
...
</project>

笔记:
1. 执行所有报表,你需要使用:
<reportSets>
   <reportSet>
          <reports/>
    </reportSet>
</reportSets>
2.参考任意一个插件的文档(例如 plugin-info.html)你会了解更多可用的插件。

在报表插件中使用 <inherited> 标签

与构建插件类似,打破继承,你可以使用<inherited>标签
<project>
...
<reporting>
         <plugins>
              <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-project-info-reports-plugin</artifactId>
                      <version>2.1.2</version>
                       <inherited>false</inherited>
               </plugin>
           </plugins>
</reporting>
...
</project>

<div>

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/112904.html

(0)
上一篇 2021年8月27日 03:21
下一篇 2021年8月27日 03:22

相关推荐

发表回复

登录后才能评论