【问题标题】:Add dependency from custom plugin从自定义插件添加依赖项
【发布时间】:2021-04-12 09:12:22
【问题描述】:

我正在开发自定义 Maven 插件。我希望我的插件为项目添加新的依赖项。

我有以下代码:

@Mojo(name = "generate-model", defaultPhase = LifecyclePhase.GENERATE_SOURCES)
public class ModelGeneratorMojo extends AbstractMojo {
    @Parameter(defaultValue = "${project}", required = true, readonly = true)
    MavenProject project;

    @Override
    public void execute() throws MojoExecutionException {
        Dependency connectivity = new Dependency();
        connectivity.setGroupId("groupid");
        connectivity.setArtifactId("artifactid");
        connectivity.setVersion("1.0");
        //noinspection unchecked
        project.getDependencies().add(connectivity);
    }
}

好像没有效果,因为我在编译一个包含这个插件的项目时,出现了未解决的符号错误。

我确定该插件已执行,因为我在 target 文件夹中看到由它生成的代码(在我的示例中省略了代码生成)。

【问题讨论】:

  • 你能粘贴你至少得到的错误吗?
  • @YassinHajaj 确切的错误是ERROR] /home/atcvetkov/project/segeraroot/quote-model/target/generated-sources/model/segeraroot/quotemodel/ReadersVisitor.java:[9,43] package segeraroot.connectivity does not exist,但这无关紧要,因为它不是问题的根本原因。发生这种情况是因为没有像我预期的那样将依赖项添加到项目中。
  • 您是否将插件绑定到构建过程的正确阶段?
  • 想要达到什么目的?如果您将插件添加到添加依赖项的 POM,则可能不会发生任何事情,因为依赖项的解析发生在插件执行之前。
  • @talex 在什么意义上?如果您的插件需要某些东西,您可以将其作为依赖项添加到插件中。为什么一个插件需要项目的依赖?

标签: java maven maven-plugin


【解决方案1】:

我认为您应该将插件中的 goal 绑定到 Maven 构建过程的 Initialize 阶段,以便在构建过程的早期包含依赖项。

类似的东西:

@Mojo(name = "generate-model", defaultPhase = LifecyclePhase.INITIALIZE)
public class ModelGeneratorMojo extends AbstractMojo {
    @Parameter(defaultValue = "${project}", required = true, readonly = true)
    MavenProject project;

    @Parameter(defaultValue = "${session}", required = true)
    MavenSession session;


    @Override
    public void execute() throws MojoExecutionException {
        Dependency connectivity = new Dependency();
        connectivity.setGroupId("groupid");
        connectivity.setArtifactId("artifactid");
        connectivity.setVersion("1.0");

        project.getDependencies().add(connectivity);
        session.setCurrentProject(project);

    }
}
<plugin>
    <groupId>com.maventest</groupId>
    <artifactId>maven-generate-model</artifactId>
    <version>1.0-SNAPSHOT</version>
    <executions>
        <execution>
            <goals>
                <goal>generate-model</goal>
            </goals>
        </execution>
    </executions>
</plugin>

我尝试了多种路径来实现这一点,但似乎无法使用 maven 插件,这里可能 maven 扩展是一个更好的选择。

原因是依赖解析是 Maven 生命周期的第一步,您需要额外的依赖来编译应用程序。 使用 maven 扩展,您可以扩展 maven 生命周期。 https://maven.apache.org/examples/maven-3-lifecycle-extensions.html

【讨论】:

  • 不幸的是它没有解决我的问题。发生同样的错误。
  • 看来我们需要添加session.setCurrentProject(project); 才能让它工作,我会更新你。
  • 什么是session 以及如何获得它?
  • 你可以像project一样注入它,实际上,我设法进入了maven编译器插件,现在可以确认依赖项存在,但是编译失败,我认为是因为依赖项下载过程发生得更早。
  • 事实证明,添加依赖项并不简单,以便 maven 在运行会话之前解决它,如下所述:stackoverflow.com/questions/28565091/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 2020-05-20
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多