【问题标题】:Maven Plugin API: Get MavenProject from ArtifactMaven 插件 API:从 Artifact 获取 MavenProject
【发布时间】:2016-05-29 04:45:53
【问题描述】:

我正在尝试提取有关我项目中使用的所有依赖项(递归)的信息。 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 中但未通过 Artifacts getter 导出的信息?

【问题讨论】:

    标签: java maven maven-plugin


    【解决方案1】:

    是的,这是可能的。

    我们可以使用ProjectBuilder API 在内存中构建项目:

    构建项目的内存描述。

    通过使用我们感兴趣的工件和ProjectBuildingRequest(保存各种参数,如远程/本地存储库的位置等)调用build(projectArtifact, request)方法,这将构建一个MavenProject in-记忆。

    考虑以下将打印所有依赖项名称的 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),否则,它们将不会被填充到构建的项目中。

    【讨论】:

      猜你喜欢
      • 2011-02-24
      • 2012-03-10
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 2015-07-14
      相关资源
      最近更新 更多