以编程方式检索所有 Maven 依赖项

Programmatically retrieve all Maven dependencies

如何在我自己的 Java 程序中以非常简单的方式检索给定 Maven POM 的所有直接和传递依赖项?

我知道 Whosebug 上存在的问题,尤其是使用 Ivy 解决依赖关系的问题。我正在寻找使用 Maven 的解决方案,它还能够解决传递依赖关系。

如果您在 Maven 构建期间需要它,您可以使用 project.getDependencies() 在 Maven 插件中轻松访问它。

如果您有一个独立的 Java 程序,您可以使用 Maven 解析器或旧的 Aether 库来进行解析。

我现在可以使用 JBoss Shrinkwrap 来解决问题了。

这里是一段类似于我现在在我的工具中使用的代码的片段:

MavenStrategyStage resolve = 
    Maven.configureResolver()
         // do not consult Maven Central or any other repository
         .workOffline()
         // import the configuration of the given settings.xml
         .fromFile(homeDir + "/jqa-release-environment/maven-settings.xml")
         // load the POM you would like to analyse
         .loadPomFromFile(pomFile)
         .importCompileAndRuntimeDependencies()
         .importRuntimeAndTestDependencies()
         .resolve();

MavenWorkingSession mavenWorkingSession = 
    ((MavenWorkingSessionContainer) resolve).getMavenWorkingSession();

List<MavenDependency> dependencies = new ArrayList<>();
dependencies.addAll(mavenWorkingSession.getDependenciesForResolution());
dependencies.addAll(mavenWorkingSession.getDependencyManagement());

为了能够使用 Shrinkwrap,我在我的 POM 中添加了以下依赖项。

<dependency>
    <groupId>org.jboss.shrinkwrap.resolver</groupId>
    <artifactId>shrinkwrap-resolver-depchain</artifactId>
    <type>pom</type>
    <version>3.1.4</version>
</dependency>
<dependency>
    <groupId>org.jboss.shrinkwrap.resolver</groupId>
    <artifactId>shrinkwrap-resolver-impl-maven</artifactId>
    <version>3.1.4</version>
</dependency>
<dependency>
    <groupId>org.jboss.shrinkwrap.resolver</groupId>
    <artifactId>shrinkwrap-resolver-api-maven</artifactId>
    <version>3.1.4</version>
</dependency>