17.4 Mojo参数

正如在代码清单17-2中所看到的那样,我们可以使用@parameter将Mojo的某个字段标注为可配置的参数,即Mojo参数。事实上几乎每个Mojo都有一个或者多个Mojo参数,通过配置这些参数,Maven用户可以自定义插件的行为。7.5.2节和7.5.3节就分别配置了maven-compiler-plugin和maven-antrun-plugin的Mojo参数。

Maven支持种类多样的Mojo参数,包括单值的boolean、int、float、String、Date、File和URL,多值的数组、Collection、Map、Properties等。

boolean(包括boolean和Boolean)


/**

*@parameter

*/

private boolean sampleBoolean


对应的配置如下:


<sampleBoolean>true</sampleBoolean>


int(包括Integer、long、Long、short、Short、byte、Byte)


/**

*@parameter

*/

private int sampleInt


对应的配置如下:


<sampleInt>8</sampleInt>


float(包括Float、double、Double)


/**

*@parameter

*/

private float sampleFloat


对应的配置如下:


<sampleFloat>8.8</sampleFloat>


String(包括StringBuffer、char、Character)


/**

*@parameter

*/

private String sampleString


对应的配置如下:


<sampleString>Hello World</sampleString>


Date(格式为yyyy-MM-dd HH:mm:ss.S a或者yyyy-MM-dd HH:mm:ssa)


/**

*@parameter

*/

private Date sampleDate


对应的配置如下:


<sampleDate>2010-06-06 3:14:55.1 PM</sampleDate>


或者


<sampleDate>2010-06-06 3:14:55PM</sampleDate>


File


/**

*@parameter

*/

private File sampleFile


对应的配置如下:


<sampleFile>c:\tmp</sampleFile>


URL


/**

*@parameter

*/

private URL sampleURL


对应的配置如下:


<sample=URL>http://www.juvenxu.com/</sampleURL>


数组


/**

*@parameter

*/

private String[]includes


对应的配置如下:


<includes>

<include>java</include>

<include>sql</include>

</includes>


Collection(任何实现Collection接口的类,如ArrayList和HashSet)


/**

*@parameter

*/

private List includes


对应的配置如下:


<includes>

<include>java</include>

<include>sql</include>

</includes>


Map


/**

*@parameter

*/

private Map sampleMap


对应的配置如下:


<sampleMap>

<key1>value1</key1>

<key2>value2</key2>

</sampleMap>


Properties


/**

*@parameter

*/

private Properties sampleProperties


对应的配置如下:


<sampleProperties>

<property>

<name>p_name_1</name>

<value>p_value_1</value>

</property>

<property>

<name>p_name_2</name>

<value>p_value_2</value>

</property>

</sampleProperties>


一个简单的@parameter标注就能让用户配置各种类型的Mojo字段,不过在此基础上,用户还能为@parameter标注提供一些额外的属性,进一步自定义Mojo参数。

@parameter alias=“<aliasName>”

使用alias,用户就可以为Mojo参数使用别名,当Mojo字段名称太长或者可读性不强时,这个别名就非常有用。例如:


/**

*@parameter alias="uid"

*/

private String uniqueIdentity


对应的配置如下:


<uid>juven</uid>


@parameter expression=“${aSystemProperty}”

使用系统属性表达式对Mojo参数进行赋值,这是非常有用的特性。配置了@parameter的expression之后,用户可以在命令行配置该Mojo参数。例如,maven-surefire-plugin的test目标有如下源码:


/**

*@parameter expression="${maven.test.skip}"

*/

private boolean skip;


用户可以在POM中配置skip参数,同时也可以直接在命令行使用-Dmaven.test.skip=true来跳过测试。如果Mojo参数没有提供expression,那就意味着该参数无法在命令行直接配置。还需要注意的是,Mojo参数的名称和expression名称不一定相同。

@parameter default-value=“aValue/${anExpression}”

如果用户没有配置该Mojo参数,就为其提供一个默认值。该值可以是一个简单字面量如“true”、“hello”或者“1.5”,也可以是一个表达式,以方便使用POM的某个元素。

例如,下面代码中的参数sampleBoolean默认值为true:


/**

*@parameter defaultValue="true"

*/

private boolean sampleBoolean


代码清单17-2中有如下代码:


/**

*@parameter expression="${project.build.sourceDirectory}"

*@required

*@readonly

*/

private File sourceDirectory;


表示默认使用POM元素<project><build><sourceDirectory>的值。

除了@parameter标注外,还看到可以为Mojo参数使用@readonly和@required标注。

@readonly

表示该Mojo参数是只读的,如果使用了该标注,用户就无法对其进行配置。通常在应用POM元素内容的时候,我们不希望用户干涉。代码清单17-2就是很好的例子。

@required

表示该Mojo参数是必须的,如果使用了该标注,但是用户没有配置该Mojo参数且其没有默认值,Maven就会报错。