Mojo复杂依赖注入

时间:2018-04-18 12:22:11

标签: maven plugins dependency-injection parameters mojo

我试图在mojo中使用字段上方的@Parameter

@Parameter(required = false)
public Map authentication;

在插件使用中,我通过了:

<configuration>
   <authentication>
       <user>a</user>
       <server>
           <address>server.com</address>
           <port>123</port>
       </server>
   <authentication>
</configuration>

行为是maven似乎无法注入所有数据,只有<K,V>这很简单,例如<user>String但是<server>我&# 39; m期望相同的行为,例如,另一个Map<K,V> <address><port>,但maven注入null

1 个答案:

答案 0 :(得分:0)

您可能想看一下Mapping Complex Objects文档。

如果我对您的理解正确,那么您想为“身份验证”配置设置,但是其值可以是任意键值,其中值可能是一些复杂的对象“服务器”,并且其“地址”和“端口”映射到正确的类型?

最好不要将其建模为Map,而是要有一些对象来表示此结构

public final class Server {
    private String address;
    private Integer port;
    // getters 
}

public final class Authentication {
    private String user;
    private Server server;
    // getters 
}

public final class MyMojo extends AbstractMojo {
    @Parameter
    private Authentication authentication;
}

这使您可以使用所提供的代码段配置。

如果我理解不正确,并且您实际上想要一个java.util.Map<K, V>,您可以在其中提供任意值的身份验证,那么您可能不走运。我猜你可以让Authentication类持有Map来做一些额外的事情:

public final class Authentication {
    public String user;
    public Server server;
    public Map<String, String> other;
}


...
<properties>
  <authentication>
    <user>theUser</user>
    <server>
      <address>server.com</address>
      <port>123</port>
    </server>
    <other>
      <key1>value1</key1>
      <key2>value2</key2>
    </other>
</properties>
...

我的个人建议是采用明确建模所需结构的方法。这使您可以让Maven插件环境为您做尽可能多的检查。如果您拍摄任意地图,则必须进行各种编组。

一个缺点是Maven不能为复杂的对象提供一个很好的描述符,但是无论如何您都不会使用普通的Map来提供描述符。