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

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

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

Ответы

Ответ 1

Использование свойств - это, безусловно, один из способов, но не идеальный. Он по-прежнему требует, чтобы пользователь определял ${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;
}

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

Ответ 2

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

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

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

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

mavenProject.getBuildPlugins()

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

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

plugin.getConfiguration()

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

Ответ 3

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

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

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

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

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

<somePluginProperty>${foo}</somePluginProperty>