1

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

class MyMojo extends AbstractMojo {

    /** @parameter */
    LunarDate lunarDate;

}

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

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

(类型LunarDate只是一个例子来说明问题)

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

4

3 回答 3

1

DefaultBeanConfigurator负责使用DefaultConverterLookup,它直接实例化它而不使用Plexus Container。

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

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

最好的办法可能是放弃,将 Mojo 参数声明为 type String,然后在execute.

于 2012-04-20T12:42:36.617 回答
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 {
于 2020-05-21T16:03:21.740 回答
0

对于较新的 Maven(使用 Maven 3.3.1 测试),您现在可以子类BasicComponentConfigurator化以DefaultConverterLookup作为成员变量访问:

@Component(role = ComponentConfigurator.class, hint = "basic")
public class ExtendedComponentRegistrator 
        extends BasicComponentConfigurator  
        implements Initializable {

    @Override
    public void initialize() throws InitializationException {
        converterLookup.registerConverter(new MyCustomConverter());
    }
}

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

<plugin>
  <groupId>org.codehaus.plexus</groupId>
  <artifactId>plexus-component-metadata</artifactId>
  <executions>
    <execution>
      <goals>
        <goal>generate-metadata</goal>
      </goals>
    </execution>
  </executions>
</plugin>
于 2016-07-28T17:06:45.677 回答