簡體   English   中英

Maven Plugin API:從Artifact獲取MavenProject

[英]Maven Plugin API: Get MavenProject from Artifact

我試圖提取有關我的項目中使用的所有依賴項(遞歸)的信息。 看起來MavenProject類提供了我需要的所有信息。 但我無法弄清楚如何將Artifact的實例轉換為MavenProject的實例

/**
 * 
 *
 * @reqiresDependencyResolution
 *
 */
@Mojo(name = "license-overview", defaultPhase = LifecyclePhase.PROCESS_SOURCES)
public class MyMojo extends AbstractMojo {


    /**
     * @parameter default-value="${project}"
     * @required
     * @readonly
     */
    MavenProject project;


    public void execute() throws MojoExecutionException {

        Set<Artifact> artifacts= project.getArtifacts();
        for (Artifact artifact : artifacts) {
            //Here I need to access the artifact's name, license, author, etc.
            System.out.println("*** "+artifact.getArtifactId()+"***");
        }

    }
}

如何訪問位於我的依賴關系的pom中但不通過Artifact的getter導出的信息?

是的,這是可能的。

我們可以使用ProjectBuilder API在內存中構建一個項目:

構建項目的內存描述。

通過使用我們感興趣的工件調用build(projectArtifact, request)方法和ProjectBuildingRequest (包含各種參數,如遠程/本地存儲庫的位置等),這將在內存中構建MavenProject

考慮以下MOJO,它將打印所有依賴項的名稱:

@Mojo(name = "foo", requiresDependencyResolution = ResolutionScope.RUNTIME)
public class MyMojo extends AbstractMojo {

    @Parameter(defaultValue = "${project}", readonly = true, required = true)
    private MavenProject project;

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

    @Component
    private ProjectBuilder projectBuilder;

    public void execute() throws MojoExecutionException, MojoFailureException {
        ProjectBuildingRequest buildingRequest = new DefaultProjectBuildingRequest(session.getProjectBuildingRequest());
        try {
            for (Artifact artifact : project.getArtifacts()) {
                buildingRequest.setProject(null);
                MavenProject mavenProject = projectBuilder.build(artifact, buildingRequest).getProject();
                System.out.println(mavenProject.getName());
            }
        } catch (ProjectBuildingException e) {
            throw new MojoExecutionException("Error while building project", e);
        }
    }

}

這里有幾個主要成分:

  • requiresDependencyResolution告訴Maven我們需要在執行之前解析依賴項。 在這種情況下,我將其指定為RUNTIME以便解決所有編譯和運行時依賴性。 您當然可以將其設置為ResolutionScope 你要。
  • 使用@Component注釋注入項目構建器。
  • 使用當前Maven會話的參數構建默認構建請求。 我們只需要通過顯式設置為null來覆蓋當前項目,否則什么都不會發生。

當您有權訪問MavenProject ,您可以打印所有關於它的信息,比如開發人員等。

如果要打印依賴項(直接和傳遞),則還需要在構建請求上調用setResolveDependencies(true) ,否則,它們將不會在構建的項目中填充。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM