Java Maven Mojo: сложный атрибут карты
Пример атрибута map для mojo, упомянутого в maven.apache.org, довольно прост, поскольку он определяет Map со строкой в качестве ключа и в качестве значения, как указано ниже:
/**
* 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}
В настоящее время я не знаю, делаю ли я что-то не так или же этот пример даже поддерживается, так как не было найдено никакой документации, описывающей "расширенный" атрибут карты, и моим последним средством на данный момент будет просмотр источников.
2 ответа
Вы на самом деле очень близки к решению. Вам просто нужно настроить свой плагин так (без внутреннего <person>
элемент):
<myMap>
<firstPerson>
<name>steve</name>
<age>26</age>
</firstPerson>
<secondPerson>
<name>meruem</name>
<age>1</age>
</secondPerson>
</myMap>
Чтобы предоставить вам полный рабочий пример, рассмотрим следующий POM плагина Maven:
<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]}
Добавьте аннотацию @Parameter к атрибутам имени и возраста в вашем классе Person.