Maven: как передать параметры между мохосами? - PullRequest
9 голосов
/ 31 октября 2010

Как мне запрограммировать один Mojo для настройки конфигурации другого Mojo? Например: Mojo A требует определения параметра конфигурации A.foo. Пользователь может указать A.foo вручную или запустить плагин B, который рассчитает значение для него / нее.

Ответы [ 3 ]

6 голосов
/ 01 ноября 2010

Отвечая на мой собственный вопрос:

Можно получить доступ к конфигурации плагина или свойствам всего проекта во время выполнения, используя MavenProject экземпляр:

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

Затем вы можете получить доступ к плагинуКонфигурация во время выполнения:

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;
}

...
Xpp3Dom configuration = (Xpp3Dom) Plugin.getConfiguration()
configuration.getChild("parameterName"); // get parameter
configuration.addChild(new Xpp3Dom("parameterName")); // add parameter
...

Примечание. Любые изменения конфигурации отменяются в конце текущей фазы.

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

Кроме того, вы можете получить / установить параметры для всего проекта, используя MavenProject.getProperties().

2 голосов
/ 27 января 2012

Оказывается, это сложно сделать в основном из-за времени «настройки» плагинов в зависимости от времени выполнения Maven. Изменение «конфигурации» из getBuildPlugins обычно не работает.

Лучшим методом является значение по умолчанию, если вы пишете целевой плагин, в противном случае используйте свойства.

Со свойствами, но вы должны быть осторожны при использовании свойств. Следует помнить, что если ваше POM (или любой родительский элемент) определяет значение для свойства, ссылка $ {property} будет заменена при загрузке POM. Однако если свойство «property» отсутствует, ссылка $ {property} остается и заменяется только нулевым значением в последний возможный момент.

«значение по умолчанию» также оценивается в последний возможный момент, и я думаю, что это более безопасное решение, поскольку существует логическая причина, по которой его следует оценивать в последний возможный момент, где-как несуществующее свойство может быть просто деталь реализации, которая может измениться в будущих версиях Maven.

В моем случае мне пришлось прибегнуть к свойствам, потому что я хотел контролировать «classesDirectory» плагина surefire. Я хотел, чтобы он продолжал использовать значение по умолчанию $ {project.build.outputDirectory}, когда Cobertura не был запущен, но когда он запускался, я хотел, чтобы он использовал $ {project.build.outputDirectory} /generated-classes/cobertura.

.

Определите в разделе плагинов:

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-surefire-plugin</artifactId>
 <version>${maven-surefire-plugin.version}</version>
 <configuration>
  <classesDirectory>${instrumentedClassesDirectory}</classesDirectory>
 </configuration>
</plugin>

Затем в плагине «source»:

getProject().getProperties().put("instrumentedClassesDirectory", coberturaDir);

И убедитесь, что ни в коем случае не помещайте что-либо подобное в любой POM:

<properties>
  <instrumentedClassesDirectory>${project.build.outputDirectory}</instrumentedClassesDirectory>
</properties>

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

2 голосов
/ 31 октября 2010

Полагаю, maven мог бы установить свойство в первом Mojo и получить к нему доступ из другого Mojo.

...