用于Mojo配置的自定义类型转换器?

时间:2012-04-17 09:23:32

标签: type-conversion maven-plugin mojo custom-type

我需要在我的Mojo对象中使用自定义类型,例如LunarDate

class MyMojo extends AbstractMojo {

    /** @parameter */
    LunarDate lunarDate;

}

我想在pom.xml中的<configuration>部分配置参数。

<configuration>
     <lunarDate>丁丑年二月初四</lunarDate>
</configuration>

(类型LunarDate只是举例说明问题)

我已经有了类型转换器,但是如何启用它们?

3 个答案:

答案 0 :(得分:1)

DefaultBeanConfigurator负责使用DefaultConverterLookup,并且不使用Plexus容器直接实例化它。

我可以假设在构建扩展中复制和修改它,但通过@Component(role=BeanConfigurator.class)注册您的副本可能没有效果;我曾尝试从构建扩展中替换标准的Maven组件,并在maven-dev上告知它是不可能的。

您可以查找默认BeanConfigurator并使用反射获取其ConverterLookup converterLookup字段,然后使用自定义转换器调用registerConverter,但这样会很脆弱。

可能最好放弃,将您的Mojo参数声明为String类型,并在execute中明确进行转换。

答案 1 :(得分:1)

我能够通过定义ConfigurationConverter(我的目标 类型是AnyLicenseInfo):

@NoArgsConstructor @ToString
public class LicenseConverter extends AbstractBasicConverter {
    private static final Class<?> TYPE = AnyLicenseInfo.class;

    @Override
    public boolean canConvert(Class<?> type) { return type.equals(TYPE); }

    @Override
    public Object fromString(String string) throws ComponentConfigurationException {
        Object object = null;

        try {
            object =
                TYPE.cast(LicenseInfoFactory.parseSPDXLicenseString(string));
        } catch (Exception exception) {
            String message =
                "Unable to convert '" + string + "' to " + TYPE.getName();

            throw new ComponentConfigurationException(message, exception);
        }

        return object;
    }
}

使用自定义ComponentConfigurator注册它:

@Named("license-mojo-component-configurator")
@NoArgsConstructor @ToString @Slf4j
public class LicenseMojoComponentConfigurator extends BasicComponentConfigurator {
    @PostConstruct
    public void init() {
        converterLookup.registerConverter(new LicenseConverter());
    }

    @PreDestroy
    public void destroy() { }
}

然后在@Mogo批注中指定配置器:

@Mojo(name = "generate-license-resources",
      configurator = "license-mojo-component-configurator",
      requiresDependencyResolution = TEST,
      defaultPhase = GENERATE_RESOURCES, requiresProject = true)
@NoArgsConstructor @ToString @Slf4j
public class GenerateLicenseResourcesMojo extends AbstractLicenseMojo {

答案 2 :(得分:0)

对于较新的Maven(使用Maven 3.3.1测试),您现在可以将Style子类化为成员变量<VisualState x:Name="BigView"> <VisualState.StateTriggers> <AdaptiveTrigger MinWindowWidth="550" /> </VisualState.StateTriggers> <VisualState.Setters> <Setter Target="MyButton.Style" Value="{StaticResource ButtonFormatBlue}" /> </VisualState.Setters> </VisualState>

BasicComponentConfigurator

然后在pom.xml中启用plexus元数据的生成:

DefaultConverterLookup