Получение Maven-инстанса из сплетения

В настоящее время я пытаюсь заставить PlexusContainer дать мне инициализированный Maven -экземпляр вне контекста выполнения maven или eclipse.

Для этого у меня есть следующий код (упрощенно):

PlexusContainer container = null;
try {
    container = new DefaultPlexusContainer();
    container.lookup(MavenResolutionTask.class).run();
    container.dispose();
} catch (Exception e) {
    e.printStackTrace();
}

// --- MavenResolutionTask.java:

@Component(role = MavenResolutionTask.class)
// ResolutionTask is an abstract class 
// implementing Runnable and extending CompletableFuture
public class MavenResolutionTask extends ResolutionTask {

    @Requirement
    private Maven maven;
}

Учитывая, что у меня был стандарт plexus-component-metadata:process-classes Выполнение плагина в моем pom.xml Мне бы понравилось, если бы это работало так.

К сожалению, выполнение этого кода приводит к исключению LookupException по следующей причине (для краткости стек трассировки опущен):

WARN Sisu - Error injecting: org.apache.maven.project.DefaultProjectBuildingHelper
com.google.inject.ProvisionException: Guice provision errors:

1) No implementation for org.apache.maven.repository.RepositorySystem was bound.
  while locating org.apache.maven.project.DefaultProjectBuildingHelper

WARN Sisu - Error injecting: org.apache.maven.project.DefaultProjectBuilder
com.google.inject.ProvisionException: Guice provision errors:

1) No implementation for org.apache.maven.repository.RepositorySystem was bound.
  while locating org.apache.maven.project.DefaultProjectBuildingHelper
  at ClassRealm[plexus.core, parent: null]
  at ClassRealm[plexus.core, parent: null]
  while locating org.apache.maven.project.ProjectBuildingHelper
  while locating org.apache.maven.project.DefaultProjectBuilder

...

Чтобы исправить отсутствующие привязки и избавить себя от необходимости вручную регистрировать полный граф зависимостей maven, я попытался объединить дескрипторы компонентов, включенные в мои зависимости, с дескрипторами, сгенерированными для моего приложения.

Для этого я скопировал все зависимости в target/dependency и запустил некоторые shell-скрипты, чтобы получить список всех зависимостей, которые включают components.xml,
Я передаю эти зависимости для выполнения dependency:unpack перед тем как передать извлеченные местоположения метаданным-слияниям так:

<plugin>
    <groupId>org.codehaus.plexus</groupId>
    <artifactId>plexus-component-metadata</artifactId>
    <version>1.7.1</version>
    <executions>
        <execution>
            <id>process-classes</id>
            <goals>
                <goal>generate-metadata</goal>
            </goals>
        </execution>
        <execution>
            <id>process-test-classes</id>
            <goals>
                <goal>generate-test-metadata</goal>
            </goals>
        </execution>
        <execution>
            <id>merge-descriptors</id>
            <phase>process-classes</phase>
            <goals>
                <goal>merge-metadata</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <output>${plexus.outputFile}</output>
        <descriptors>
            <descriptor>${plexus.outputFile}</descriptor>
            <!--./aether-transport-wagon-1.1.0.jar.d/META-INF/plexus/components.xml-->
            <descriptor>${project.build.directory}/extracted-sources/aether-transport-wagon/META-INF/plexus/components.xml</descriptor>
            <!--./maven-aether-provider-3.1.0.jar.d/META-INF/plexus/components.xml-->
            <descriptor>${project.build.directory}/extracted-sources/maven-aether-provider/META-INF/plexus/components.xml</descriptor>
            <!--./maven-artifact-manager-2.2.1.jar.d/META-INF/plexus/components.xml-->
            <descriptor>${project.build.directory}/extracted-sources/maven-artifact-manager/META-INF/plexus/components.xml</descriptor>
            <!--./maven-core-3.1.1.jar.d/META-INF/plexus/components.xml-->
            <descriptor>${project.build.directory}/extracted-sources/maven-core/META-INF/plexus/components.xml</descriptor>
            <!--./maven-model-builder-3.1.0.jar.d/META-INF/plexus/components.xml-->
            <descriptor>${project.build.directory}/extracted-sources/maven-model-builder/META-INF/plexus/components.xml</descriptor>
            <!--./maven-plugin-registry-2.2.1.jar.d/META-INF/plexus/components.xml-->
            <descriptor>${project.build.directory}/extracted-sources/maven-plugin-registry/META-INF/plexus/components.xml</descriptor>
            <!--./maven-profile-2.2.1.jar.d/META-INF/plexus/components.xml-->
            <descriptor>${project.build.directory}/extracted-sources/maven-profile/META-INF/plexus/components.xml</descriptor>
            <!--./maven-project-2.2.1.jar.d/META-INF/plexus/components.xml-->
            <descriptor>${project.build.directory}/extracted-sources/maven-project/META-INF/plexus/components.xml</descriptor>
            <!--./maven-settings-builder-3.1.1.jar.d/META-INF/plexus/components.xml-->
            <descriptor>${project.build.directory}/extracted-sources/maven-settings-builder/META-INF/plexus/components.xml</descriptor>
            <!--./org.eclipse.sisu.plexus-0.0.0.M2a.jar.d/META-INF/plexus/components.xml-->
            <descriptor>${project.build.directory}/extracted-sources/sisu-plexus/META-INF/plexus/components.xml</descriptor>
            <!--./plexus-cipher-1.4.jar.d/META-INF/plexus/components.xml-->
            <descriptor>${project.build.directory}/extracted-sources/plexus-cipher/META-INF/plexus/components.xml</descriptor>
            <!--./plexus-interactivity-api-1.0-alpha-6.jar.d/META-INF/plexus/components.xml-->
            <descriptor>${project.build.directory}/extracted-sources/plexus-interactivity-api/META-INF/plexus/components.xml</descriptor>
            <!--./plexus-sec-dispatcher-1.3.jar.d/META-INF/plexus/components.xml-->
            <descriptor>${project.build.directory}/extracted-sources/plexus-sec-dispatcher/META-INF/plexus/components.xml</descriptor>
            <!--./wagon-ssh-1.0.jar.d/META-INF/plexus/components.xml-->
            <descriptor>${project.build.directory}/extracted-sources/wagon-ssh/META-INF/plexus/components.xml</descriptor>
            <!--./wagon-ssh-common-1.0.jar.d/META-INF/plexus/components.xml-->
            <descriptor>${project.build.directory}/extracted-sources/wagon-ssh-common/META-INF/plexus/components.xml</descriptor>
        </descriptors>
    </configuration>
</plugin>

К сожалению, сообщение об ошибке сохраняется, поэтому я предполагаю, что мой вопрос: как мне легко получить Maven экземпляр из сплетения?


PS для полноты, в настоящее время я использую следующие зависимости:

[INFO] com.github.vogel612:dependency-analyzer:jar:0.0.1
[INFO] +- org.projectlombok:lombok:jar:1.16.16:compile
[INFO] +- commons-cli:commons-cli:jar:1.4:compile
[INFO] +- org.slf4j:slf4j-simple:jar:1.7.16:compile
[INFO] |  \- org.slf4j:slf4j-api:jar:1.7.16:compile
[INFO] +- org.codehaus.plexus:plexus-utils:jar:3.0.24:compile
[INFO] +- org.eclipse.aether:aether-api:jar:1.1.0:compile
[INFO] +- org.eclipse.aether:aether-util:jar:1.1.0:compile
[INFO] +- org.eclipse.aether:aether-impl:jar:1.1.0:compile
[INFO] |  \- org.eclipse.aether:aether-spi:jar:1.1.0:compile
[INFO] +- org.eclipse.aether:aether-connector-basic:jar:1.1.0:compile
[INFO] +- org.eclipse.aether:aether-transport-file:jar:1.1.0:compile
[INFO] +- org.eclipse.aether:aether-transport-http:jar:1.1.0:compile
[INFO] |  +- org.apache.httpcomponents:httpclient:jar:4.3.5:compile
[INFO] |  |  +- org.apache.httpcomponents:httpcore:jar:4.3.2:compile
[INFO] |  |  \- commons-codec:commons-codec:jar:1.6:compile
[INFO] |  \- org.slf4j:jcl-over-slf4j:jar:1.6.2:compile
[INFO] +- org.eclipse.aether:aether-transport-wagon:jar:1.1.0:compile
[INFO] |  \- org.apache.maven.wagon:wagon-provider-api:jar:1.0:compile
[INFO] +- org.apache.maven:maven-aether-provider:jar:3.1.0:compile
[INFO] |  +- org.apache.maven:maven-model:jar:3.1.0:compile
[INFO] |  +- org.apache.maven:maven-model-builder:jar:3.1.0:compile
[INFO] |  +- org.apache.maven:maven-repository-metadata:jar:3.1.0:compile
[INFO] |  +- org.eclipse.sisu:org.eclipse.sisu.plexus:jar:0.0.0.M2a:compile
[INFO] |  |  +- javax.enterprise:cdi-api:jar:1.0:compile
[INFO] |  |  |  +- javax.annotation:jsr250-api:jar:1.0:compile
[INFO] |  |  |  \- javax.inject:javax.inject:jar:1:compile
[INFO] |  |  +- com.google.guava:guava:jar:10.0.1:compile
[INFO] |  |  |  \- com.google.code.findbugs:jsr305:jar:1.3.9:compile
[INFO] |  |  +- org.sonatype.sisu:sisu-guice:jar:no_aop:3.1.0:compile
[INFO] |  |  |  \- aopalliance:aopalliance:jar:1.0:compile
[INFO] |  |  \- org.eclipse.sisu:org.eclipse.sisu.inject:jar:0.0.0.M2a:compile
[INFO] |  |     \- asm:asm:jar:3.3.1:compile
[INFO] |  \- org.codehaus.plexus:plexus-component-annotations:jar:1.5.5:compile
[INFO] +- org.apache.maven.wagon:wagon-ssh:jar:1.0:compile
[INFO] |  +- com.jcraft:jsch:jar:0.1.44-1:compile
[INFO] |  \- org.apache.maven.wagon:wagon-ssh-common:jar:1.0:compile
[INFO] |     \- org.codehaus.plexus:plexus-interactivity-api:jar:1.0-alpha-6:compile
[INFO] +- org.apache.maven:maven-core:jar:3.1.1:compile
[INFO] |  +- org.apache.maven:maven-settings:jar:3.1.1:compile
[INFO] |  +- org.apache.maven:maven-settings-builder:jar:3.1.1:compile
[INFO] |  +- org.apache.maven:maven-artifact:jar:3.1.1:compile
[INFO] |  +- org.apache.maven:maven-plugin-api:jar:3.1.1:compile
[INFO] |  +- org.codehaus.plexus:plexus-interpolation:jar:1.19:compile
[INFO] |  +- org.codehaus.plexus:plexus-classworlds:jar:2.5.1:compile
[INFO] |  \- org.sonatype.plexus:plexus-sec-dispatcher:jar:1.3:compile
[INFO] |     \- org.sonatype.plexus:plexus-cipher:jar:1.4:compile
[INFO] \- org.apache.maven:maven-project:jar:2.2.1:compile
[INFO]    +- org.apache.maven:maven-profile:jar:2.2.1:compile
[INFO]    +- org.apache.maven:maven-artifact-manager:jar:2.2.1:compile
[INFO]    |  \- backport-util-concurrent:backport-util-concurrent:jar:3.1:compile
[INFO]    +- org.apache.maven:maven-plugin-registry:jar:2.2.1:compile
[INFO]    \- org.codehaus.plexus:plexus-container-default:jar:1.0-alpha-9-stable-1:compile
[INFO]       +- junit:junit:jar:3.8.1:compile
[INFO]       \- classworlds:classworlds:jar:1.1-alpha-2:compile

1 ответ

Решение

Это может быть полезно для начала внимательно прочитать сообщение об ошибке:

Отсутствующий компонент org.apache.maven.repository.RepositorySystem и не org.eclipse.aether.RepositorySystem, Хотя первое уже было включено, последнее присутствует только в org.apache.maven:maven-compat,

Добавление этого к зависимостям (включая определения его компонентов) устраняет непосредственную проблему здесь. Промежуточный результат в настоящее время NoClassDefFoundError за Lorg/apache/maven/artifact/transform/ArtifactTransformationManager, которая может быть решена путем фактического использования правильной версии зависимости.

В качестве последнего шага теперь экземпляр org.eclipse.aether.RepositorySystem и один случай org.eclipse.aether.impl.RemoteRepositoryManager должен быть зарегистрирован, что может быть выполнено с использованием кода в следующих строках:

final ServiceLocator serviceLocator = MavenRepositorySystemUtils.newServiceLocator()
        .addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class)
        .addService(TransporterFactory.class, FileTransporterFactory.class)
        .addService(TransporterFactory.class, HttpTransporterFactory.class);

 // ...
container.addComponent(serviceLocator.lookup(RepositorySystem.class)
    , RepositorySystem.class
    , "default");
container.addComponent(serviceLocator.lookup(RemoteRepositoryManager.class)
    , RemoteRepositoryManager.class
    , "default");

И теперь мы можем наконец-то получить экземпляр Maven.

Другие вопросы по тегам