Подтвердить что ты не робот

Может ли кто-нибудь дать хороший пример использования 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. Кто-нибудь использовал эти методы и может дать некоторые советы?

4b9b3361

Ответ 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.