如何获取Maven项目DependencyManagement块中列出的Pom(BOM)的artifactId

时间:2018-09-19 19:59:27

标签: maven maven-3 maven-plugin

我正在研究Maven生命周期扩展类,并且需要检查给定项目的dependencyManagement块中列出的pom(bom)的坐标详细信息。我需要能够在扩展类中重写的afterProjectsRead方法中执行此操作。我知道<scope>import</scope>标记会导致DependencyManagement依赖项部分由导入的pom(bom)中列出的依赖项代替。但是我需要在扩展类中查看pom(bom)的坐标详细信息,但是当我进入我的afterProjectsRead扩展方法时,看来导入已经发生,并且这些详细信息不可用。

要清楚,给定Maven项目中的dependencyManagement块如下所示:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>some.project</groupId>
            <artifactId>some-project-bom</artifactId>
            <version>0.1-SNAPSHOT</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
</dependencyManagement>

我的maven生命周期扩展类正在尝试执行此操作:

@Override
public void afterProjectsRead(MavenSession session) {

    MavenProject proj = session.getCurrentProject();
    DependencyManagement depMgmt = proj.getDependencyManagement();
    for (Dependency dep : depMgmt.getDependencies()) {
        System.out.println(dep.getArtifactId() + ":" + dep.getVersion());
    }
}   

以获得参考pom(bom)的坐标详细信息

我当时希望获得pom(bom)本身的groupId,artifactId和版本,但是该信息已经被some-project-bom.xml中实际列出的依赖项所取代。因此,我正在检索pom(bom)xml文件中指定的依赖项的坐标详细信息。

这可能吗?也许通过MavenSession对象?

1 个答案:

答案 0 :(得分:1)

我找到了解决方案-从正在开发的Lifecycle Extension类中,我能够通过The MavenSession对象中的传递来检索MavenProject。从MavenProject中,我能够获得原始的Model对象,并从Model对象中检索导入和替换之前pom的DependencyManagement对象。

@Override
public void afterProjectsRead(MavenSession session) {
    MavenProject proj = session.getProject();
    depMgmt = proj.getOriginalModel().getDependencyManagement();
    for (Dependency dep : depMgmt.getDependencies()) {
        System.out.println("found this artifact in dependencyMgmt section-> "
                    + dep.getArtifactId() + ":" + dep.getVersion() + "\n");
    }
}