maven.apache.org中提到的mojo的map属性示例非常简单,因为它定义了一个Map,其中String作为键,并且作为下面指定的值:
/**
* My Map.
*/
@Parameter
private Map myMap;
并且它的分配配置如下所示:
<myMap>
<key1>value1</key1>
<key2>value2</key2>
</myMap>
我想要实现的是一个更高级的映射,它将String作为键并将我自己定义的类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}
目前,我不知道我做错了什么,或者是否支持该示例,因为没有找到描述“高级”地图属性的文档,我现在最后的办法是浏览源代码。< / p>
答案 0 :(得分:2)
你实际上非常接近解决方案。您只需要像这样配置插件(没有内部<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>
类型的参数,该参数仅将地图记录为信息:
@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插件(使用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]}
答案 1 :(得分:0)
将@Parameter注释添加到Person类中的name和age属性。