谁能给出一个以编程方式使用org.apache.maven.cli.MavenCli的好例子?

时间:2010-11-17 16:30:15

标签: api maven-3

我正在尝试创建一个需要在当前项目上执行maven目标的intelliJ插件。 intertubes中的所有讨论都建议使用MavenEmbedder。祝你好运。 2.0.4版本不受支持,并且没有关于如何使用它的参考。

我给了它一个旋转,然后撞到了一堵墙,在那里,嵌入器没有被所需的所有区域初始化。反光私人会员注射?真棒!为什么有人需要一种明显的方法来初始化对象?

似乎有一些人正在使用2.1版本并取得了一些成功。我一直无法在罐子甚至消息来源中找到它。

我去看了3.0版本的embedder项目:http://maven.apache.org/ref/3.0-beta-3/maven-embedder/它完全取消了MavenEmbedder对象,似乎只支持通过MavenCli上的main或doMain方法进行访问。有没有人使用过这些方法并提出一些建议?

6 个答案:

答案 0 :(得分:22)

是的,这对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);

它需要一个目录并运行'编译'阶段......

答案 1 :(得分:6)

maven 3.1.1

的工作maven配置

依赖关系

<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);

答案 2 :(得分:4)

提供的范围和动态获取的组件的依赖关系矩阵信息可能有点令人困惑。这对我来说,因为在我看来,我通过直接或传递依赖获得了所有必需的项目,但随后远程解决方案无效。

我想跳到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

可能应该把它作为某种单元测试。

如果有人对嵌入式Maven 3.3.3有一个更好的解决方案(即想出一个更小或更多范围的所需依赖关系),请发布它们。

答案 3 :(得分:0)

建立@StevePerkins的评论,并使用maven 3.1.0版,

我必须将传递依赖性从aether-connector-wagon排除到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");
(...)

完整示例here

答案 4 :(得分:0)

每个版本的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.5org.apache.maven:maven-aether-provider:jar:3.2.5org.apache.maven.wagon:wagon-provider-api:jar:2.8

它还修复了对非常古老的Guava库的依赖,因为这个版本使用了18.0。

答案 5 :(得分:-1)

适用于我的Spring Boot 2.3项目(JDK8或JDK 11运行时)的Maven Embedded 3.6.3版本的依赖关系列表:

    <!-- Maven Embedder -->
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-embedder</artifactId>
        <version>3.6.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-compat</artifactId>
        <version>3.6.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-http</artifactId>
        <version>3.3.4</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.aether</groupId>
        <artifactId>aether-connector-basic</artifactId>
        <version>1.1.0</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.eclipse.aether</groupId>
        <artifactId>aether-transport-wagon</artifactId>
        <version>1.1.0</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.30</version>
    </dependency>
    <dependency>
        <groupId>org.usefultoys</groupId>
        <artifactId>slf4j-toys</artifactId>
        <version>1.6.3</version>
    </dependency>

Maven CLI命令类似于:

    // Maven CLI to execute Maven Commands
    MavenCli cli = new MavenCli();
    int result = cli.doMain(args, workingDirectory,
                    org.usefultoys.slf4j.LoggerFactory.getInfoPrintStream(LOGGER),
                    org.usefultoys.slf4j.LoggerFactory.getErrorPrintStream(LOGGER));

HTH