Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Программно получить все зависимости Maven

Автор вопроса: OliverОтветов: 2

Как я могу очень простым способом получить все прямые и транзитивные зависимости для данного Maven POM в моей собственной программе Java?

Я знаю о существующих вопросах в Stackoverflow, особенно об использовании Ivy для разрешения зависимостей. Я ищу решение с использованием Maven, которое также может разрешать транзитивные зависимости.

  • Первый вопрос: с какой целью? Можете ли вы объяснить, каково намерение или проблему, которую вы пытаетесь решить? khmarbaise 13.12.2020
  • У меня есть приложение Java, которое должно анализировать дерево зависимостей данного POM. Приложение является частью нашего инструментария выпуска для jQAssistant. Oliver 18.12.2020

dependenciesmavendependency-management

Ответы

Ответ 1 · рейтинг 1 · J Fabian Meier

Если вам это нужно во время сборки Maven, вы можете легко получить к нему доступ в плагине Maven, используя project.getDependencies().

Если у вас есть отдельная программа на Java, вы можете использовать преобразователь Maven или более старые библиотеки Aether для выполнения разрешения.

Ответ 2 · Oliver

Теперь я смог решить проблему с помощью 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>

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы