跨不同的maven插件共享配置(代码片段)

author author     2022-11-28     391

关键词:

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

我正在尝试寻找一种在插件之间共享配置的方法。我知道您可以将配置选项提升为属性,然后为每个插件重用它们,但这仍然要求用户为每个插件的每个选项配置一个配置条目,这是一种样板。

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

答案

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

Solution

诀窍是使用Maven内部来修改需要配置另一个Mojo的Mojo的配置(在这种情况下,B需要来自A的配置)。

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

@Mojo(name = "B", requiresProject = true) // and the rest of the config
public class B extends AbstractMojo 
    @Parameter(defaultValue = "$project", readonly = true, required = true)
    private MavenProject project;

    @Parameter(defaultValue = "$session", readonly = true, required = true)
    private MavenSession session;

    @Parameter(defaultValue = "$mojoExecution", readonly = true, required = true)
    private MojoExecution mojoExecution;

    @Component
    private MavenPluginManager mavenPluginManager;

    // and the rest of the properties here...

    public void execute() throws MojoExecutionException 
        B initializedMojo = ScalaImplementation.apply(project, session, mojoExecution, mavenPluginManager, encoding);
        // Implement plugin logic with `initializedMojo` instead of `this`.
    

有了这四个新字段,我们可以通过以下方式实现ScalaImplementation(我选择在Scala代码中实现它):

object ScalaImplementation 
  def apply(project: MavenProject,
            session: MavenSession,
            mojoExecution: MojoExecution,
            mavenPluginManager: MavenPluginManager): B = 
    val currentConfig = mojoExecution.getConfiguration()
    val pluginA = Option(project.getBuild().getPluginsAsMap().get("groupIdA:artifactIdA"))
      .getOrElse(sys.error(s"Plugin A could not be found."))
    val configA = pluginA.getConfiguration().asInstanceOf[Xpp3Dom]
    mojoExecution.setConfiguration(Xpp3Dom.mergeXpp3Dom(currentConfig, configA))
    val initializedMojoB = mavenPluginManager
      .getConfiguredMojo(classOf[Mojo], session, mojoExecution)
      .asInstanceOf[B] // Note that this is safe.
    initializedMojoB
  

请注意,要使此解决方案起作用,mojo B必须没有任何替代必需字段,该字段不在A中且没有默认值(否则Maven会抱怨它无法将其初始化为null)。

Summary

我们所做的是通过结合插件A和插件B的配置来欺骗Maven mojo引擎,这些配置在运行时可以访问。首先,我们得到了一个半初始化的mojo,只有我们关心的字段。然后我们将它传递给一个相对简单的方法,该方法负责设置当前mojoExecution的配置,并且我们实例化了一个新的mojo B。由于这个新的mojo具有AB的配置值,因此这个时间被完全初始化并准备好使用。

解决跨域问题(代码片段)

...同源策略,为了防范跨站脚本的攻击,禁止客户端脚本对不同域下的文档或脚本进行跨站调用资源。怎么解决跨域问题安装插件>:pipinstalldjango-cors-headers插件参考地址:https://github.com/ottoyiu/django-cors-headers/项目配置:dev.py#注册ap... 查看详情

session共享的解决方案(代码片段)

...案1、客户端SessionID值唯一;     对于不同的域名:主域名、子域名、跨站点域名或跨服务器域名,用户在打开页面时会产生不同的SessionID,为了使这些站点在用户登录时 查看详情

mapgis精品教程005:mapgis中间件的配置与使用(代码片段)

中间件就是实现不同软件平台数据共享的一个工具或插件,本文讲解MapGIS中间件的配置与使用。文章目录一、MapGIS中间件介绍二、MapGIS中间件的配置与使用一、MapGIS中间件介绍面对大量的异构数据,如何快速实现不同格式的数据... 查看详情

mapgis精品教程005:mapgis中间件的配置与使用(代码片段)

中间件就是实现不同软件平台数据共享的一个工具或插件,本文讲解MapGIS中间件的配置与使用。文章目录一、MapGIS中间件介绍二、MapGIS中间件的配置与使用一、MapGIS中间件介绍面对大量的异构数据,如何快速实现不同格式的数据... 查看详情

在eclipse中安装maven插件(代码片段)

...:在打开的页面中,找到下载位置,可以根据不同的需要,下载不同的压缩格式:完成下 查看详情

maven变量及常见插件配置详解(代码片段)

...-自定义变量及内置变量1.自定义变量2.内置变量二、常见插件配置1.编译插件2.设置资源文件的编码方式3.自动拷贝jar包到target目录4.生成源代码jar包5.将项目打成jar包一、变量-自定义变量及内置变量1.自定义变量<properties><pr... 查看详情

markdownspring(后端)+angular(前端)-maven插件配置(代码片段)

查看详情

介绍maven三个常用的插件使用注意事项(代码片段)

背景maven常用的三个插件对打包有不同的作用:maven-jar-plugin:处理jar包生成;spring-boot-maven-plugin:SpringBoot项目打包;maven-assembly-plugin:自定义打包结构。而实际开发过程中这三个插件可能都综合使用,... 查看详情

介绍maven三个常用的插件使用注意事项(代码片段)

背景maven常用的三个插件对打包有不同的作用:maven-jar-plugin:处理jar包生成;spring-boot-maven-plugin:SpringBoot项目打包;maven-assembly-plugin:自定义打包结构。而实际开发过程中这三个插件可能都综合使用,... 查看详情

maven基础-03-笔记(代码片段)

Maven基础-03-笔记Maven依赖管理、Maven生命周期与插件1、Maven依赖管理1.1依赖配置与依赖传递1.2依赖范围2、Maven生命周期与插件2.1生命周期2.2插件Maven依赖管理、Maven生命周期与插件1、Maven依赖管理1.1依赖配置与依赖传递依赖是指在... 查看详情

maven基础-03-笔记(代码片段)

Maven基础-03-笔记Maven依赖管理、Maven生命周期与插件1、Maven依赖管理1.1依赖配置与依赖传递1.2依赖范围2、Maven生命周期与插件2.1生命周期2.2插件Maven依赖管理、Maven生命周期与插件1、Maven依赖管理1.1依赖配置与依赖传递依赖是指在... 查看详情

Maven:针对不同目标的不同配置

】Maven:针对不同目标的不同配置【英文标题】:Maven:Differentconfigurationfordifferentgoals【发布时间】:2012-03-1420:45:38【问题描述】:我想为Maven发布插件的不同目标提供不同的配置选项。故事是这样的:我将Git用于SCM。我希望release:... 查看详情

ini示例nginx配置,用于为反向代理api添加跨源资源共享(cors)支持(代码片段)

查看详情

ini示例nginx配置,用于为反向代理api添加跨源资源共享(cors)支持(代码片段)

查看详情

ini示例nginx配置,用于为反向代理api添加跨源资源共享(cors)支持(代码片段)

查看详情

ini示例nginx配置,用于为反向代理api添加跨源资源共享(cors)支持(代码片段)

查看详情

ini示例nginx配置,用于为反向代理api添加跨源资源共享(cors)支持(代码片段)

查看详情

maven实战技巧「docker实战系列」使用maven插件构建docker镜像的方法(代码片段)

使用Maven插件构建Docker镜像的方法工具插件名称+官方地址修改宿主机配置(docker可以远程访问)配置DOCKER_HOST例如使用插件构建Docker镜像添加插件构建镜像添加docker-maven-plugin创建Dockerfile内容如下执行以下命令构建Docker... 查看详情