Maven Plugin API:从Artifact获取MavenProject

gor*_*tde 10 java maven-plugin maven

我试图提取有关我的项目中使用的所有依赖项(递归)的信息.看起来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()+"***");
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

如何访问位于我的依赖关系的pom中但不通过Artifacts getter 导出的信息?

Tun*_*aki 11

是的,这是可能的.

我们可以使用ProjectBuilderAPI 在内存中构建一个项目:

构建项目的内存描述.

通过调用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);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

这里有几个主要成分:

  • requiresDependencyResolution告诉Maven,我们需要在执行前必须解决的依赖关系.在这种情况下,我指定它RUNTIME以便解决所有编译和运行时依赖性.你当然可以把它设置为ResolutionScope.你要.
  • 项目构建器将注入@Component注释.
  • 使用当前Maven会话的参数构建默认构建请求.我们只需要通过显式设置来覆盖当前项目null,否则什么都不会发生.

当您有权访问时MavenProject,您可以打印您想要的所有信息,如开发人员等.

如果要打印依赖项(直接和传递),则还需要调用setResolveDependencies(true)构建请求,否则,它们将不会填充在构建的项目中.