在maven.apache.org中提到的mojo的map属性示例非常简单,因为它定义了一个map,并使用String作为键和值,如下所示:
/**
* My Map.
*/
@Parameter
private Map myMap;
,它被分配的配置看起来像这样:
<myMap>
<key1>value1</key1>
<key2>value2</key2>
</myMap>
我想要实现的是一个更高级的地图,它以字符串为键和我自己定义的类Person为值:
/**
* My Advanced Map.
*/
@Parameter
private Map<String,Person> myMap;
Person类位于与MOJO相同的包中,它看起来像:
public class Person {
private String name;
private int age;
public void setName( String name )
{
this.name = name;
}
public void setAge( int age )
{
this.age = age;
}
public String getName( )
{
return this.name;
}
public int getAge( )
{
return this.age ;
}
}
我假设我的MOJO的配置是这样的:
<myMap>
<firstPerson>
<person>
<name>steve</name>
<age>26</age>
</person>
</firstPerson>
<secondPerson>
<person>
<name>meruem</name>
<age>1</age>
</person>
</secondPerson>
</myMap>
使用上述配置运行此MOJO将使用定义的键创建映射,但我总是得到空值:{firstPerson=null,secondPerson=null}
目前,我不知道我是否做错了什么,或者如果这个例子甚至被支持,因为没有找到描述"高级"地图属性的文档,我现在最后的手段是浏览源代码。
你实际上离解决方案很近了。你只需要像这样配置你的插件(没有内部的<person>
元素):
<myMap>
<firstPerson>
<name>steve</name>
<age>26</age>
</firstPerson>
<secondPerson>
<name>meruem</name>
<age>1</age>
</secondPerson>
</myMap>
为了提供一个完整的工作示例,请考虑以下Maven插件POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>sample.plugin</groupId>
<artifactId>test-maven-plugin</artifactId>
<version>1.0.0</version>
<packaging>maven-plugin</packaging>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
具有以下MOJO,声明目标foo
并具有类型为Map<String, Person>
的参数,它简单地将Map记录为info:
@Mojo(name = "foo")
public class MyMojo extends AbstractMojo {
@Parameter
private Map<String, Person> map;
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info(map.toString());
}
}
和以下Person
类:
public class Person {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
一旦这个Maven插件安装在repo中(使用mvn clean install
),我们就可以像这样在项目中使用它:
<plugin>
<groupId>sample.plugin</groupId>
<artifactId>test-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<id>foo</id>
<phase>generate-sources</phase>
<goals>
<goal>foo</goal>
</goals>
<configuration>
<map>
<person1>
<name>Name 1</name>
<age>10</age>
</person1>
<person2>
<name>Name 2</name>
<age>20</age>
</person2>
</map>
</configuration>
</execution>
</executions>
</plugin>
这个插件运行mvn clean generate-sources
时的输出是:
[INFO] --- test-maven-plugin:1.0.0:foo (add-source) @ test ---
[INFO] {person1=Person [name=Name 1, age=10], person2=Person [name=Name 2, age=20]}
为Person类中的name和age属性添加@Parameter注释