Может ли 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" все еще является частью проекта.
Так как мне решить это?