Может ли maven mojo, основанный на Aether, быть совместимым с Maven 3.0.x и 3.1.x?

В версии 3.1.0 Maven используется Eclipse Aether (org.eclipse.aether) вместо Sonatype Aether (org.sonatype.aether). Кажется, это нарушает совместимость плагинов, использующих эфир Sonatype: попробуйте запустить такие плагины, и вы столкнетесь с:

java.lang.NoClassDefFoundError: org/sonatype/aether/*
Caused by: java.lang.ClassNotFoundException: org.sonatype.aether.*

Как описано в https://cwiki.apache.org/confluence/display/MAVEN/AetherClassNotFound

Теперь можно ли заставить mojo полагаться на эфирные классы (такие как org.sonatype.aether.RepositorySystemSession), работающие как с Maven 3.0.x, так и с Maven 3.1.x?

Или мне нужно выпустить две версии одного и того же плагина, одну для 3.0.x и одну для 3.1.x? Положить правила принудительного исполнения так:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.3</version>
    <executions>
      <execution>
        <id>enforce-maven</id>
        <goals>
          <goal>enforce</goal>
        </goals>
        <configuration>
          <rules>
            <requireMavenVersion>
              <version>[3.0,3.1)</version>
            </requireMavenVersion>
          </rules>
        </configuration>
      </execution>
    </executions>
  </plugin>

Я уже разместил вопрос в списке рассылки разработчиков Maven, но пока ответа нет...

2 ответа

Большинство из этих плагинов зависят от дерева зависимостей Maven, которое способно собирать правильный набор зависимостей независимо от версии Maven. Версия 2.1 была выпущена для поддержки Eclipse Aether рядом с Sonatype Aether. Если ваш плагин может использовать этот компонент, вы должны сохранить.

Очень хороший вопрос! Я использую индексатор maven для поиска некоторых артефактов. Я программно загружаю индекс maven из центра и выполняю запросы к нему. Это мой метод:

public IteratorSearchResponse executeGroupArtifactSearch(String group, String artifact) throws Exception {
        Query groupIdQ     = indexer.constructQuery( MAVEN.GROUP_ID,    new SourcedSearchExpression( group ) );
        Query artifactIdQ  = indexer.constructQuery( MAVEN.ARTIFACT_ID, new SourcedSearchExpression( artifact ) );
        BooleanQuery query = new BooleanQuery();
        query.add( groupIdQ   , Occur.MUST );
        query.add( artifactIdQ, Occur.MUST );
        query.add( indexer.constructQuery( MAVEN.CLASSIFIER, new SourcedSearchExpression( Field.NOT_PRESENT ) ), Occur.MUST_NOT );
        IteratorSearchRequest  request  = new IteratorSearchRequest( query, Collections.singletonList( centralContext ), null );
        IteratorSearchResponse response = indexer.searchIterator( request );
        return response;
    }

Поскольку я обновился до maven 3.1.0 и org.eclipse.aether, я получаю это исключение:

Caused by: java.lang.ClassNotFoundException: org.sonatype.aether.version.InvalidVersionSpecificationException
    at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50)
    at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:244)
    at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:230)
    ... 30 more

Кажется, что у 3.1.0 Maven Indexer все еще есть некоторые зависимости от org.sonatyep.aether. Достаточно любопытно, что я получаю это исключение, потому что "org.sonatype.aether.version.InvalidVersionSpecificationException" все еще является частью проекта.

Так как мне решить это?

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