使用地图作为Maven插件参数
是否可以使用地图作为Maven插件参数?
Is it possible to use a map of maps as a Maven plugin parameter?, e.g.
@Parameter
private Map<String, Map<String, String>> converters;
然后像
<converters>
<json>
<indent>true</indent>
<strict>true</strict>
</json>
<yaml>
<stripComments>false</stripComments>
</yaml>
<converters>
如果我以这种方式使用它,则converters
仅包含键json
和yaml
,其值为空.
If I use it like this, converters
only contain the keys json
and yaml
with null as values.
我知道可以将复杂的对象作为值,但是像本例中一样,是否可以将映射用于可变元素值?
I know it is possible to have complex objects as values, but is it also somehow possible to use maps for variable element values like in this example?
一种解决方案非常简单,可用于1级嵌套.在替代答案中可以找到一种更复杂的方法,该方法也可能允许对Maps进行更深层的嵌套.
One solution is quite simple and works for 1-level nesting. A more sophisticated approach can be found in the alternative answer which possibly also allows for deeper nesting of Maps.
代替使用接口作为类型参数,只需使用像TreeMap
Instead of using an interface as type parameter, simply use a concrete class like TreeMap
@Parameter
private Map<String, TreeMap> converters.
The reason is this check in MapConverter which fails for an interface but suceeds for a concrete class:
private static Class<?> findElementType( final Type[] typeArguments )
{
if ( null != typeArguments && typeArguments.length > 1
&& typeArguments[1] instanceof Class<?> )
{
return (Class<?>) typeArguments[1];
}
return Object.class;
}
As a side-note, an as it is also related to this answer for Maven > 3.3.x it also works to install a custom converter by subclassing BasicComponentConfigurator
and using it as a Plexus component. BasicComponentConfigurator
has the DefaultConverterLookup
as a protected member variable and is hence easily accessible for registering custom converters.