Может ли кто-нибудь дать хороший пример использования org.apache.maven.cli.MavenCli программно?
Я пытаюсь создать плагин intelliJ, который должен выполнить maven-цели в текущем проекте. Все разговоры в intertubes рекомендуют использовать MavenEmbedder. Удачи с этим. Версия 2.0.4 не поддерживается, и нет ссылок на ее использование.
Я дал ему вихрь и побежал в стену, где встраивание не было инициализировано всеми полями, в которых он нуждается. Отражательная инъекция частного члена? Потрясающие! Зачем кому-то нужен очевидный способ инициализации объекта?
Кажется, что некоторые люди используют версию 2.1 с некоторым успехом. Я не смог найти это в банке или даже в источниках.
Я пошел и проверил версию версии 3.0 в версии 3.0: http://maven.apache.org/ref/3.0-beta-3/maven-embedder/ Он полностью уничтожает объект MavenEmbedder и, похоже, только поддержка доступа через основные или doMain методы на MavenCli. Кто-нибудь использовал эти методы и может дать некоторые советы?
Ответы
Ответ 1
Да, это не так, как документация MavenCli. API значительно проще, но мне все же нравятся некоторые примеры. Здесь тот, который работает...
MavenCli cli = new MavenCli();
int result = cli.doMain(new String[]{"compile"},
"/home/aioffe/workspace/MiscMaven",
System.out, System.out);
System.out.println("result: " + result);
Он берет dir и запускает фазу 'compile'...
Ответ 2
Рабочая конфигурация maven для maven 3.1.1
Зависимости
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-embedder</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-connector-wagon</artifactId>
<version>0.9.0.M2</version>
</dependency>
<dependency>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-http-lightweight</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
код
MavenCli cli = new MavenCli();
cli.doMain(new String[]{"clean", "compile"}, "project_dir", System.out, System.out);
Ответ 3
Информация матрицы зависимостей для предоставленных областей и динамически полученных компонентов может немного запутываться. Это было для меня, поскольку мне показалось, что я получил все необходимые предметы по прямой или транзитивной зависимости, но тогда удаленное разрешение не сработало.
Я хотел перейти к Maven 3.3.3 (последний по состоянию на 2015-05-25). Я получил его работу без ошибок sisu, которые были представлены, когда я попытался оптимистично обновить текущие версии вещей, указанных здесь (и в других местах). Это проект с тегом, который работал с примером, указанным на сегодняшний день, с использованием JDK8.
https://github.com/mykelalvis/test-maven-embedder/tree/20150525-working
Релевантные отпечатки (SLF4J - это просто, чтобы я мог видеть журналы)
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-embedder</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-connector-basic</artifactId>
<version>1.0.2.v20150114</version>
</dependency>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-transport-wagon</artifactId>
<version>1.0.2.v20150114</version>
</dependency>
<dependency>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-http</artifactId>
<version>2.9</version>
</dependency>
<dependency>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-provider-api</artifactId>
<version>2.9</version>
</dependency>
<dependency>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-http-lightweight</artifactId>
<version>2.9</version>
</dependency>
Запуск:
rm -r ~/.m2/repository/org/apache/maven/plugins/maven-clean-plugin/
mvn exec:java
Вероятно, это должно было сделать unit test.
Если у кого-то есть превосходное решение для встроенного Maven 3.3.3 (т.е. с меньшим или более ограниченным диапазоном набором необходимых зависимостей), разместите их.
Ответ 4
чтобы основываться на комментарии от @StevePerkins и использовать maven версии 3.1.0,
Мне пришлось исключить переходную зависимость от фургона-соединителя-вагона до wagon-provider-api, чтобы заставить его работать.
pom.xml:
(...)
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-embedder</artifactId>
<version>3.1.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-connector-wagon</artifactId>
<version>0.9.0.M2</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-provider-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-http</artifactId>
<version>2.5</version>
<scope>test</scope>
</dependency>
(...)
и вот пример java:
(...)
MavenCli cli = new MavenCli();
ByteArrayOutputStream baosOut = new ByteArrayOutputStream();
ByteArrayOutputStream baosErr = new ByteArrayOutputStream();
PrintStream out = new PrintStream(baosOut, true);
PrintStream err = new PrintStream(baosErr, true);
cli.doMain( new String[] { "clean" }, new File("."), out, err );
String stdout = baosOut.toString("UTF-8");
String stderr = baosErr.toString("UTF-8");
(...)
полный пример здесь
Ответ 5
Существует матрица зависимостей для каждой версии maven-embedder, например. для 3.2.5: http://maven.apache.org/ref/3.2.5/maven-embedder/dependencies.html
На основании этого мне пришлось использовать org.apache.maven:maven-embedder:jar:3.2.5
, org.apache.maven:maven-aether-provider:jar:3.2.5
и org.apache.maven.wagon:wagon-provider-api:jar:2.8
.
Он также фиксирует зависимость от очень старой библиотеки Guava, так как эта версия использует 18.0.