原文地址 译者: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