Я создал небольшую утилиту для обертывания MavenCli
, которая генерирует новый проект Maven с использованием артефакта quickstart.Вызов MavenCli сбой в плагине Maven
При выполнении Util
в качестве модульного теста он работает достаточно хорошо (просто генерирует пустой проект Maven).
Теперь я хочу интегрировать эту небольшую обертку в плагин Maven. Но когда я исполню харизмы (в рамках третьего проекта Maven), призывание MavenCli
терпит неудачу с исключением:
[ERROR] Error executing Maven.
[ERROR] java.util.NoSuchElementException
role: org.apache.maven.eventspy.internal.EventSpyDispatcher
roleHint:
[ERROR] Caused by: null
Util выглядит следующим образом:
public void createProject() {
final MavenCli cli = new MavenCli();
System.setProperty("maven.multiModuleProjectDirectory", "/usr/share/maven");
cli.doMain(new String[] { "archetype:generate", "-DgroupId=com.my.company",
"-DartifactId=hello-world", "-DarchetypeArtifactId=maven-archetype-quickstart",
"-DinteractiveMode=false" }, "/tmp", System.out, System.out);
}
соответствующей зависимости от Util:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-embedder</artifactId>
<version>3.3.9</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
<version>3.3.9</version>
</dependency>
код харизмы выглядит следующим образом:
@Mojo(name = "custommojo", requiresProject = false)
public class CustomMojo extends AbstractMojo {
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
Util.createProject();
}
}
POM mojo включает в себя зависимости от соответствующих артефактов Maven (плагин-api, плагин-аннотация и т. Д.) И утилиты.
Третий проект, о котором я упоминал, представляет собой пустой проект «maven-quickstart», который имеет зависимость от проекта mojo и конфигурацию mojo для выполнения на этапе компиляции.
Я понятия не имею, почему это работает в контексте модульного теста, но не в контексте mojo.
Может ли кто-нибудь помочь?
Спасибо много - я переключился на INVOKER API, как предложено - и она работает очень хорошо. Примечание. До того, как я использовал API-интерфейс Embedder, я уже пытался использовать mojo-executor, но безуспешно, так как сложно выполнить весь жизненный цикл (например, «установить»). Mojo-executor работает для «archetype: generate», но также сложно настроить при попытке вызвать mojo для другого проекта (особенно, когда этот другой проект полностью выходит за рамки текущей сборки) –
Фактически можно обрабатывать проблему загрузки классов и использовать «MavenCli», см. мой ответ. –