Maven-plugin @Component 第三方插件注入

发布于 2025-01-11 00:04:43 字数 9900 浏览 1 评论 0原文

我正在为 Maven 项目开发一个自定义插件,它需要来自“其他插件”的附加信息;例如maven-compiler-plugin

是否可以将外部插件组件注入我的组件中? 我想了解 Maven 的 @Component 注入是如何工作的,因为我找不到任何关于此的好信息以及插件执行开始时如何填充其组件容器。

我已经开始尝试通过 @Component 注释,但是当我运行自定义插件时,它返回错误,即该字段没有元素/候选者。 我尝试了以下四种情况:

  1. @Component private CompilerInfoMojo编译器

  2. @Component 私有 AbstractCompilerMojo 编译器

  3. @Component(role = CompilerInfoMojo.class) 私有 AbstractCompilerMojo 编译器

  4. @Component(role = CompilerInfoMojo.class) 私有 CompilerInfoMojo 编译器

然后我开始注入 MavenPluginManager,但是当我查找 CompilerMojo 时它找不到它,管理器抛出以下异常:

Caused by: org.codehaus.plexus.component.repository.exception.ComponentLookupException: java.util.NoSuchElementException
      role: org.apache.maven.plugin.compiler.CompilerMojo@Component

代码示例:

@Mojo(name = "info")
public class InfoMojo extends AbstractMojo {
    @Component private MavenPluginManager mpm;

    @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 execution;

   public void execute() throws MojoExecutionException, MojoFailureException {
    final Log log = getLog();

    log.info("Hello World!");

    final List<Plugin> build = project.getBuildPlugins();
    for (Plugin current : build) {
      log.info(current.getArtifactId());
    }

    try {
      final CompilerMojo comp = mpm.getConfiguredMojo(CompilerMojo.class, session, execution);
      log.info(String.valueOf(comp.getPluginContext()));
    } catch (PluginConfigurationException | PluginContainerException e) {
      log.error(e);
      throw new MojoExecutionException("Error", e);
    }
  }
}

日志显示编译器插件可用:

[INFO] Hello World!
[INFO] maven-compiler-plugin
[INFO] plexus-component-metadata
[INFO] maven-clean-plugin
[INFO] maven-resources-plugin
[INFO] maven-jar-plugin
[INFO] maven-plugin-plugin
[INFO] maven-surefire-plugin
[INFO] maven-install-plugin
[INFO] maven-deploy-plugin
[INFO] maven-site-plugin

完整的堆栈跟踪如下:

[ERROR]
org.apache.maven.plugin.PluginContainerException: Unable to load the mojo 'info' (or one of its required components) from the plugin 'prv.sigur.levanzo.maven.plugins:info-maven-plugin:1.0.0-SNAPSHOT'
   at org.apache.maven.plugin.internal.DefaultMavenPluginManager.getConfiguredMojo (DefaultMavenPluginManager.java:557)
   at prv.sigur.levanzo.maven.plugins.InfoMojo.execute (InfoMojo.java:74)
   at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)
   at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
   at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
   at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
   at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
   at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
   at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
   at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
   at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
   at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
   at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
   at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956)
   at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)
   at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)
   at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
   at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:64)
   at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke (Method.java:564)
   at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
   at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
   at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
   at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
Caused by: org.codehaus.plexus.component.repository.exception.ComponentLookupException: java.util.NoSuchElementException
     role: org.apache.maven.plugin.compiler.CompilerMojo
 roleHint: prv.sigur.levanzo.maven.plugins:info-maven-plugin:1.0.0-SNAPSHOT:info
   at org.codehaus.plexus.DefaultPlexusContainer.lookup (DefaultPlexusContainer.java:267)
   at org.codehaus.plexus.DefaultPlexusContainer.lookup (DefaultPlexusContainer.java:255)
   at org.apache.maven.plugin.internal.DefaultMavenPluginManager.getConfiguredMojo (DefaultMavenPluginManager.java:520)
   at prv.sigur.levanzo.maven.plugins.InfoMojo.execute (InfoMojo.java:74)
   at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)
   at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
   at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
   at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
   at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
   at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
   at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
   at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
   at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
   at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
   at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
   at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956)
   at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)
   at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)
   at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
   at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:64)
   at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke (Method.java:564)
   at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
   at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
   at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
   at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
Caused by: java.util.NoSuchElementException
   at org.eclipse.sisu.plexus.RealmFilteredBeans$FilteredItr.next (RealmFilteredBeans.java:118)
   at org.eclipse.sisu.plexus.RealmFilteredBeans$FilteredItr.next (RealmFilteredBeans.java:1)
   at org.eclipse.sisu.plexus.DefaultPlexusBeans$Itr.next (DefaultPlexusBeans.java:76)
   at org.eclipse.sisu.plexus.DefaultPlexusBeans$Itr.next (DefaultPlexusBeans.java:1)
   at org.codehaus.plexus.DefaultPlexusContainer.lookup (DefaultPlexusContainer.java:263)
   at org.codehaus.plexus.DefaultPlexusContainer.lookup (DefaultPlexusContainer.java:255)
   at org.apache.maven.plugin.internal.DefaultMavenPluginManager.getConfiguredMojo (DefaultMavenPluginManager.java:520)
   at prv.sigur.levanzo.maven.plugins.InfoMojo.execute (InfoMojo.java:74)
   at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)
   at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
   at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
   at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
   at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
   at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
   at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
   at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
   at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
   at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
   at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
   at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956)
   at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)
   at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)
   at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
   at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:64)
   at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke (Method.java:564)
   at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
   at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
   at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
   at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)

I am developing a custom plugin for Maven project which requires additional info from 'other plugins'; for example the maven-compiler-plugin.

Is it possible to inject external plugins components into mine?
I would like to understand how the @Component injection by Maven works, because I cannot find any nice info about this and how its component container is filled when plugin execution starts.

I've started trying by @Component annotation, but when I run my custom plugin it returns the error which there are no elements/candidates for that field.
I tried with the following four cases:

  1. @Component private CompilerInfoMojo compiler

  2. @Component private AbstractCompilerMojo compiler

  3. @Component(role = CompilerInfoMojo.class) private AbstractCompilerMojo compiler

  4. @Component(role = CompilerInfoMojo.class) private CompilerInfoMojo compiler

Then I moved to inject the MavenPluginManager, but when I lookup for the CompilerMojo it cannot find it and the manager throws the following exception:

Caused by: org.codehaus.plexus.component.repository.exception.ComponentLookupException: java.util.NoSuchElementException
      role: org.apache.maven.plugin.compiler.CompilerMojo@Component

Example of code:

@Mojo(name = "info")
public class InfoMojo extends AbstractMojo {
    @Component private MavenPluginManager mpm;

    @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 execution;

   public void execute() throws MojoExecutionException, MojoFailureException {
    final Log log = getLog();

    log.info("Hello World!");

    final List<Plugin> build = project.getBuildPlugins();
    for (Plugin current : build) {
      log.info(current.getArtifactId());
    }

    try {
      final CompilerMojo comp = mpm.getConfiguredMojo(CompilerMojo.class, session, execution);
      log.info(String.valueOf(comp.getPluginContext()));
    } catch (PluginConfigurationException | PluginContainerException e) {
      log.error(e);
      throw new MojoExecutionException("Error", e);
    }
  }
}

Log shows the compiler plugin is available:

[INFO] Hello World!
[INFO] maven-compiler-plugin
[INFO] plexus-component-metadata
[INFO] maven-clean-plugin
[INFO] maven-resources-plugin
[INFO] maven-jar-plugin
[INFO] maven-plugin-plugin
[INFO] maven-surefire-plugin
[INFO] maven-install-plugin
[INFO] maven-deploy-plugin
[INFO] maven-site-plugin

The complete stack trace is the following:

[ERROR]
org.apache.maven.plugin.PluginContainerException: Unable to load the mojo 'info' (or one of its required components) from the plugin 'prv.sigur.levanzo.maven.plugins:info-maven-plugin:1.0.0-SNAPSHOT'
   at org.apache.maven.plugin.internal.DefaultMavenPluginManager.getConfiguredMojo (DefaultMavenPluginManager.java:557)
   at prv.sigur.levanzo.maven.plugins.InfoMojo.execute (InfoMojo.java:74)
   at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)
   at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
   at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
   at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
   at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
   at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
   at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
   at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
   at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
   at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
   at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
   at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956)
   at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)
   at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)
   at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
   at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:64)
   at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke (Method.java:564)
   at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
   at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
   at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
   at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
Caused by: org.codehaus.plexus.component.repository.exception.ComponentLookupException: java.util.NoSuchElementException
     role: org.apache.maven.plugin.compiler.CompilerMojo
 roleHint: prv.sigur.levanzo.maven.plugins:info-maven-plugin:1.0.0-SNAPSHOT:info
   at org.codehaus.plexus.DefaultPlexusContainer.lookup (DefaultPlexusContainer.java:267)
   at org.codehaus.plexus.DefaultPlexusContainer.lookup (DefaultPlexusContainer.java:255)
   at org.apache.maven.plugin.internal.DefaultMavenPluginManager.getConfiguredMojo (DefaultMavenPluginManager.java:520)
   at prv.sigur.levanzo.maven.plugins.InfoMojo.execute (InfoMojo.java:74)
   at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)
   at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
   at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
   at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
   at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
   at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
   at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
   at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
   at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
   at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
   at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
   at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956)
   at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)
   at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)
   at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
   at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:64)
   at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke (Method.java:564)
   at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
   at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
   at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
   at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
Caused by: java.util.NoSuchElementException
   at org.eclipse.sisu.plexus.RealmFilteredBeans$FilteredItr.next (RealmFilteredBeans.java:118)
   at org.eclipse.sisu.plexus.RealmFilteredBeans$FilteredItr.next (RealmFilteredBeans.java:1)
   at org.eclipse.sisu.plexus.DefaultPlexusBeans$Itr.next (DefaultPlexusBeans.java:76)
   at org.eclipse.sisu.plexus.DefaultPlexusBeans$Itr.next (DefaultPlexusBeans.java:1)
   at org.codehaus.plexus.DefaultPlexusContainer.lookup (DefaultPlexusContainer.java:263)
   at org.codehaus.plexus.DefaultPlexusContainer.lookup (DefaultPlexusContainer.java:255)
   at org.apache.maven.plugin.internal.DefaultMavenPluginManager.getConfiguredMojo (DefaultMavenPluginManager.java:520)
   at prv.sigur.levanzo.maven.plugins.InfoMojo.execute (InfoMojo.java:74)
   at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)
   at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
   at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
   at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
   at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
   at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
   at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
   at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
   at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
   at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
   at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
   at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956)
   at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)
   at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)
   at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
   at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:64)
   at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke (Method.java:564)
   at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
   at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
   at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
   at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文