无法通过命令行将映射类型的变量传递给maven目标

时间:2016-04-17 15:43:29

标签: java maven maven-2 maven-3 maven-plugin

我试图通过命令行将Map类型的参数传递给我的maven插件。这是我试过的方式,

$mvn -U -X sample.plugin:hello-maven-plugin:1.0-SNAPSHOT:sayhi -Dsayhi.myMap=key1=value1

$mvn -U -X sample.plugin:hello-maven-plugin:1.0-SNAPSHOT:sayhi -Dsayhi.myMap={key1=value1}

这些都不起作用并且出现以下错误:

Caused by:
org.codehaus.plexus.component.configurator.ComponentConfigurationException:
Cannot assign configuration entry 'myMap' with value '${sayhi.myMap}' of type
java.lang.String to property of type java.util.Map**

这是我在Mojo中的参数:

/**
 * My Map.
 */
@Parameter(property = "sayhi.myMap", required = false)
private Map<String,String> myMap = new HashMap<String, String>();

按照==&gt;的说明进行操作https://maven.apache.org/guides/mini/guide-configuring-plugins.html#Mapping_Collections,但没有运气。我想我错过了一些非常小的东西。我正在研究maven v3.2.1

感谢

2 个答案:

答案 0 :(得分:0)

根据我的知识,我们没有选择在命令行中传递地图变量,但您可以通过以下方式传递地图变量。

创建xml文件并创建一个插件(对于XML,请参阅maven doc)

<myMap>
      <key1>value1</key1>
      <key2>value2</key2>
</myMap>

你的魔力将是:

@Parameter(property = "myMap", required = false)
private Map<String,String> myMap;

Yor maven命令将是:

$mvn -s <path_to_xml_file> -U -X sample.plugin:hello-maven-plugin:1.0-SNAPSHOT:sayhi

答案 1 :(得分:0)

我遇到了同样的问题, Guide to Developing Java Plugins, Introduction, Parameter Types With Multiple Values, Maps解释了它:

  

地图

     

此类别涵盖实施java.util.Map的任何类,例如HashMap但未实现java.util.Properties

请参阅this answer我是如何解决的。

解决方法包括以下内容:

    ...

    @Parameter( property = "map", required = true )
    private String[] mapEntries;
    private Map<String, String> map;

    ...

        map = Arrays.stream( mapEntries ).collect( Collectors.toMap( s -> s, s -> s ) ); // with Java >=8
        putMapEntriesToMap(); // with Java <8

    ...

    private void putMapEntriesToMap()
        {
        map = new HashMap<String, String>( mapEntries.length );
        for ( String entry : mapEntries )
            {
            int equalsPosition = entry.indexOf( "=" );
            map.put(
                entry.substring( 0, equalsPosition ),
                entry.substring( equalsPosition + 1 ) );
            }
        } // putMapEntriesToMap()

    ...