【问题标题】:Correct way to modify maven plugin configuration from mojo从 mojo 修改 maven 插件配置的正确方法
【发布时间】:2025-12-09 03:10:01
【问题描述】:

我知道这是一个主观问题,很可能会被关闭。但是我不知道在哪里问这个问题才能得到答案。

maven android 插件有一件烦人的小事 - 它会修改原始清单文件,如果您在工作文件夹中运行 maven,您的 vcs 会建议您提交这些更改。

示例:如果我使用 beta 环境构建构建,我们有几个环境可以运行,它将修改 AndroidManifest.xml 中的应用名称。

这可以通过复制原始清单并将副本引用到android maven插件来轻松解决。但我决定让开发人员更容易做到这一点,因此插件会自动执行此操作,除非开发人员指定他希望在原始清单下完成此更新。

很容易修改功能(复制文件并替换保持对文件的引用的属性),但问题是我需要将此属性传递给其他 mojo。

abstract mojo AbstractAndroidMojo 中定义的属性没有execute 方法。所有其他的 mojos 都扩展了这个类。定义如下所示:

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

我关注了这个answer

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

但不幸的是,这不起作用。有许多明确的方法可以使其工作,但所有这些方法都需要更改所有当前的 mojos。

我想知道是否有人知道为什么答案不起作用或如何使它起作用。

更新插件的代码可以在这里找到: https://github.com/emartynov/maven-android-plugin/tree/keep-android-manifest

感谢所有阅读到最后的人。

【问题讨论】:

    标签: maven maven-3 maven-plugin


    【解决方案1】:

    您是否在同一生命周期阶段内实现目标?如果没有,请在您提供的帖子中写道:

    注意:任何配置更改都会在当前阶段结束时被丢弃。

    要考虑的另一件事:目标是否按您期望的顺序运行?看看这篇文章:http://www.mkyong.com/maven/maven-plugin-execution-order-in-same-phase/ - 也许是您遇到问题的插件排序。

    其他需要考虑的事情:也许您更喜欢更简洁的解决方案 - 将此类功能添加到 android-maven-plugin? Manfred Moser 通常对由拉取请求支持的提案持开放态度;)

    我很可能会在我的插件中做同样的事情。唯一的区别是我重用了来自 maven-dependency-plugin 的目标,以在我的自定义插件生命周期内复制依赖项。我正在尝试为 InstallShield 项目构建制作插件。

    【讨论】:

    • 谢谢你的回答,但我已经停止了让这个工作的想法
    • 好的,需要清理一下。我尝试过使用相同的解决方案但失败了——在 MavenProject 实例中添加了配置,但似乎即使运行顺序正确,它也没有像之前实例化一样添加到 Mojo。我将使用 maven-executor 项目,但会先尝试查看 MavenSession 和 BuildPluginManager