Правильный способ изменить конфигурацию плагина maven из mojo

Я знаю, что это субъективный вопрос, и он, скорее всего, будет закрыт. Но я не знаю, где задать этот вопрос, чтобы получить ответ.

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

Пример: у нас есть несколько сред для запуска. Если я соберу сборку с бета-средой, это изменит имя приложения в AndroidManifest.xml.

Это можно легко решить, скопировав исходный манифест и указав ссылку на копию в плагине Android maven. Но я решил упростить задачу для разработчика, поэтому плагин будет делать это автоматически, за исключением случаев, когда разработчик указывает, что он хочет, чтобы это обновление было выполнено в исходном манифесте.

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

Свойство, определенное в абстрактном моджо AbstractAndroidMojo, не имеющем метода execute. И все остальные моджо расширяют этот класс. Определение выглядит так:

/**
 * The <code>AndroidManifest.xml</code> file.
 *
 * @parameter default-value="${project.basedir}/AndroidManifest.xml"
 */
protected File androidManifestFile;

Я последовал этому ответу:

private void updatePluginConfiguration ( String newManifestFileValue )
{
    for ( Plugin plugin : project.getBuild().getPlugins() )
    {
        if ( plugin.getArtifactId().equals( "android-maven-plugin" ) )
        {
            Xpp3Dom configuration = (Xpp3Dom) plugin.getConfiguration();
            Xpp3Dom manifestFileParameter = configuration.getChild( "androidManifestFile" );
            if ( manifestFileParameter == null )
            {
                manifestFileParameter = new Xpp3Dom( "androidManifestFile" );
                configuration.addChild( manifestFileParameter );
            }
            manifestFileParameter.setValue( newManifestFileValue );
            break;
        }
    }
}

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

Интересно, знает ли кто-нибудь, почему ответ не работает или как заставить его работать.

Код обновленного плагина можно найти здесь: https://github.com/emartynov/maven-android-plugin/tree/keep-android-manifest

Спасибо всем, кто дочитал до конца.


person Eugen Martynov    schedule 27.03.2013    source источник


Ответы (1)


Вы выполняете свою цель в рамках одной и той же фазы жизненного цикла? Если нет, то в сообщении, которое вы предоставили, написано:

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

Еще одна вещь, которую следует учитывать: выполняются ли цели в том порядке, в котором вы ожидаете? Взгляните на этот пост: http://www.mkyong.com/maven/maven-plugin-execution-order-in-same-phase/ — Возможно, у вас проблемы с порядком плагинов.

Еще одна вещь, которую следует учитывать: возможно, вы бы предпочли более чистое решение - добавить такую ​​​​функцию в плагин android-maven? Манфред Мозер обычно открыт для предложений, подкрепленных пул-реквестами ;)

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

person tptak    schedule 23.11.2013
comment
Спасибо за ответ, но я уже отказался от идеи заставить это работать - person Eugen Martynov; 24.11.2013
comment
Ладно, нужно прояснить ситуацию. Я пытался использовать то же решение и потерпел неудачу - конфигурация добавляется в экземпляр MavenProject, но кажется, что, хотя порядок выполнения правильный, он не добавляется в Mojo, как если бы он был создан ранее. Я собираюсь использовать проект maven-executor, но сначала постараюсь взглянуть на MavenSession и BuildPluginManager. - person tptak; 24.11.2013