跨不同的Maven插件共享配置

跨不同的Maven插件共享配置,maven,plugins,configuration,Maven,Plugins,Configuration,我有两个Maven插件,A和B。它们是独立开发的,但碰巧需要相同的配置选项。大多数潜在用户都会安装pluginA,pluginB是它的补充 我正试图寻找一种方法来跨插件共享配置。我知道您可以将配置选项提升到属性,然后对每个插件重用它们,但这仍然要求用户对每个插件的每个选项都有一个配置条目,这有点像样板文件 这个问题的目的是找到一种跨插件共享配置的方法,从而减少可能的冗余。这可能吗?起初,我认为这是不可能的,但通过深入研究Maven的内部结构,我意识到有一个解决方案。这个解决方案很简单——我们不必

我有两个Maven插件,
A
B
。它们是独立开发的,但碰巧需要相同的配置选项。大多数潜在用户都会安装plugin
A
,plugin
B
是它的补充

我正试图寻找一种方法来跨插件共享配置。我知道您可以将配置选项提升到属性,然后对每个插件重用它们,但这仍然要求用户对每个插件的每个选项都有一个配置条目,这有点像样板文件


这个问题的目的是找到一种跨插件共享配置的方法,从而减少可能的冗余。这可能吗?

起初,我认为这是不可能的,但通过深入研究Maven的内部结构,我意识到有一个解决方案。这个解决方案很简单——我们不必自己重新实现Maven内部的某些部分,我们只需重用底层API即可

解决方案 诀窍是使用Maven内部构件修改需要另一个Mojo配置的Mojo的配置(在本例中,
B
需要
A
中的配置)

为此,首先我们需要为
B
创建一个mojo定义,该定义包含
a
接受的所有配置值(
参数
s)。然后,我们将在
B
中定义以下四个额外字段(如果它们在
A
中尚未定义),因为它们是实际实现所必需的:

@Mojo(name=“B”,requireproject=true)//以及配置的其余部分
公共类B扩展了AbstractMojo{
@参数(defaultValue=“${project}”,readonly=true,required=true)
私人马文项目;
@参数(defaultValue=“${session}”,readonly=true,required=true)
非公开会议;
@参数(defaultValue=“${mojoExecution}”,readonly=true,required=true)
私刑执行;
@组成部分
私有MavenPluginManager MavenPluginManager;
//还有这里的其他属性。。。
public void execute()引发MojoExecutionException异常{
B initializedMojo=ScalaImplementation.apply(项目、会话、mojoExecution、mavenPluginManager、编码);
//使用“initializedMojo”而不是“this”实现插件逻辑。
}
}
有了这四个新字段,我们可以通过以下方式实现
ScalaImplementation
(我选择用Scala代码实现它):

对象缩放实现{
def应用(项目:MavenProject,
会议:MavenSession,
mojoExecution:mojoExecution,
mavenPluginManager:mavenPluginManager):B={
val currentConfig=mojoExecution.getConfiguration()
val pluginA=Option(project.getBuild().getpluginsamap().get(“groupIdA:artifactIdA”))
.getOrElse(系统错误“找不到插件A”)
val configA=pluginA.getConfiguration().asInstanceOf[Xpp3Dom]
mojoExecution.setConfiguration(Xpp3Dom.mergeXpp3Dom(currentConfig,configA))
val initializedMojoB=mavenPluginManager
.getConfiguredMojo(类[Mojo],会话,mojoExecution)
.asInstanceOf[B]//请注意,这是安全的。
初始化Mojob
}
}
请注意,要使此解决方案起作用,mojo B不能有任何不在A中且没有默认值的可选必填字段(否则Maven将抱怨它无法将其初始化为
null

总结
我们所做的是通过组合plugin
A
和plugin
B
的配置来欺骗Maven mojo引擎,这些配置在运行时可以访问。首先,我们得到了一个半初始化的mojo,其中只有我们关心的字段。然后,我们将其传递给一个相对简单的方法,该方法负责设置当前
mojoExecution
的配置,并实例化了一个新的mojo
B
。因为这个新的mojo同时具有
A
B
的配置值,所以这次已经完全初始化,可以使用了。

首先,你在说什么样的插件?此外,如果用户需要在默认用例下配置很多东西,那么插件作者就做错了…
a
是针对Maven的Scala插件,
B
是我正在开发的插件,它需要
a
中的配置数据才能使用它创建配置文件。这与默认用例无关,而是我需要将maven配置转换为我自己的配置格式。配置字段的1对1映射。@khmarbaise我想我已经得到了答案,我会发布它,如果您认为它是正确的,请告诉我。