Лучший способ получить доступ к конфигурации времени выполнения плагина maven из пользовательского mojo? - PullRequest
15 голосов
/ 24 сентября 2008

Я пишу на заказ maven2 MOJO. Мне нужно получить доступ к конфигурации времени выполнения другого плагина из этого MOJO.

Каков наилучший способ сделать это?

Ответы [ 3 ]

4 голосов
/ 02 июля 2009

Вы можете получить список плагинов, которые в настоящее время используются в сборке, выполнив следующие действия:

Сначала вам нужно, чтобы Maven вставил текущий проект в ваш mojo, вы используете переменную класса, определенную ниже, чтобы получить это.

/**
 * The maven project.
 * 
 * @parameter expression="${project}"
 * @readonly
 */
 private MavenProject project;

Затем вы можете использовать следующее, чтобы получить список плагинов, используемых в этой сборке.

mavenProject.getBuildPlugins()

Вы можете перебирать этот список, пока не найдете плагин, из которого вы хотите извлечь конфигурацию.

Наконец, вы можете получить конфигурацию как Xpp3Dom.

plugin.getConfiguration()

Примечание. Если вы изменяете конфигурацию других плагинов (а не просто извлекаете информацию), она будет изменена только для текущей фазы, а не последующих.

3 голосов
/ 25 сентября 2008

Использование свойств, безусловно, один из способов, однако не идеальный. Он по-прежнему требует от пользователя определения $ {propertyName} в нескольких местах по всему pom. Я хочу разрешить моему плагину работать без изменений в pom пользователя, кроме самого определения плагина.

Я не вижу доступа к свойствам времени выполнения другого MOJO как слишком тесную связь. Если другой MOJO определен где-либо в иерархии сборки, я хочу, чтобы мой MOJO соблюдал ту же конфигурацию.

Мое текущее решение:

private Plugin lookupPlugin(String key) {

    List plugins = getProject().getBuildPlugins();

    for (Iterator iterator = plugins.iterator(); iterator.hasNext();) {
        Plugin plugin = (Plugin) iterator.next();
        if(key.equalsIgnoreCase(plugin.getKey())) {
            return plugin;
        }
    }
    return null;
}


/**
 * Extracts nested values from the given config object into a List.
 * 
 * @param childname the name of the first subelement that contains the list
 * @param config the actual config object
 */
private List extractNestedStrings(String childname, Xpp3Dom config) {

    final Xpp3Dom subelement = config.getChild(childname);
    if (subelement != null) {
        List result = new LinkedList();
        final Xpp3Dom[] children = subelement.getChildren();
        for (int i = 0; i < children.length; i++) {
            final Xpp3Dom child = children[i];
            result.add(child.getValue());
        }
        getLog().info("Extracted strings: " + result);
        return result;
    }

    return null;
}

Это сработало для нескольких небольших сборок, с которыми я тестировал. Включая многомодульную сборку.

0 голосов
/ 25 сентября 2008

Я не уверен, как именно вы это сделаете, но мне кажется, что это может быть не лучшим дизайнерским решением. Если это вообще возможно, вы должны стремиться отделить ваш Mojo от любых других плагинов.

Вместо этого я бы рекомендовал использовать пользовательские свойства, чтобы исключить любое дублирование в конфигурации отдельных плагинов.

Вы можете установить пользовательское свойство "foo" в pom, используя раздел свойств:

<project>
  ...
  <properties>
    <foo>value</foo>
  </properties>
  ...
</project>

Свойство foo теперь доступно в любом месте пом, используя знак доллара + фигурные скобки:

<somePluginProperty>${foo}</somePluginProperty>
...