有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java Maven Mojo:复杂映射属性

maven.apache.org中提到的mojo的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类与my 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) 个答案

  1. # 1 楼答案

    实际上,你已经非常接近解决方案了。你只需要像这样配置你的插件(没有内部的<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插件安装在repo中(使用^{),我们就可以在这样的项目中使用它:

    <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]}
    
  2. # 2 楼答案

    在Person类的name和age属性中添加@Parameter注释